From 5938fcffcf86d4b36d0bb4b4c736b324d6e8f220 Mon Sep 17 00:00:00 2001 From: "Andrei G." Date: Mon, 23 Mar 2026 07:36:05 +0100 Subject: [PATCH 1/3] release: prepare v0.17.0 --- CHANGELOG.md | 5 +++- Cargo.lock | 82 +++++++++++++++++++++++++++++++++------------------- Cargo.toml | 42 +++++++++++++-------------- README.md | 2 +- 4 files changed, 78 insertions(+), 53 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 004afd15..eb9a190f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [Unreleased] +## [0.17.0] - 2026-03-23 + ### Added - feat(llm): complexity triage routing (#2141) — new `LlmRoutingStrategy::Triage` routing mode that classifies each request into `Simple`, `Medium`, `Complex`, or `Expert` complexity tiers using a configurable classifier provider before dispatching to a tier-specific provider; `TriageRouter` in `zeph-llm` implements `LlmProvider` using `Box::pin` to break the recursive `AnyProvider` type cycle; classifier calls are wrapped in a configurable timeout (default 5 s) with fallback to the default tier on timeout or parse failure; context-window auto-escalation skips when `context_window()` returns `None`; `AtomicU64` metrics track classification counts and latencies per tier without locks; `[llm.complexity_routing]` TOML config with `triage_provider`, `tiers.*`, `triage_timeout_secs`, `fallback_strategy`; `AnyProvider::Triage` variant added; agent loop emits "Evaluating complexity..." status indicator during triage @@ -2603,7 +2605,8 @@ let agent = Agent::new(provider, channel, &skills_prompt, executor); - Agent::run() uses tokio::select! to race channel messages against shutdown signal [0.16.0]: https://github.com/bug-ops/zeph/compare/v0.15.3...v0.16.0 -[Unreleased]: https://github.com/bug-ops/zeph/compare/v0.16.1...HEAD +[Unreleased]: https://github.com/bug-ops/zeph/compare/v0.17.0...HEAD +[0.17.0]: https://github.com/bug-ops/zeph/compare/v0.16.1...v0.17.0 [0.16.1]: https://github.com/bug-ops/zeph/compare/v0.16.0...v0.16.1 [0.15.3]: https://github.com/bug-ops/zeph/compare/v0.15.2...v0.15.3 [0.15.2]: https://github.com/bug-ops/zeph/compare/v0.15.1...v0.15.2 diff --git a/Cargo.lock b/Cargo.lock index 6bd594d2..c2a603e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3444,9 +3444,9 @@ checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iri-string" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +checksum = "d8e7418f59cc01c88316161279a7f665217ae316b388e58a0d10e29f54f1e5eb" dependencies = [ "memchr", "serde", @@ -3500,7 +3500,7 @@ dependencies = [ "cesu8", "cfg-if", "combine", - "jni-sys", + "jni-sys 0.3.1", "log", "thiserror 1.0.69", "walkdir", @@ -3509,9 +3509,31 @@ dependencies = [ [[package]] name = "jni-sys" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] [[package]] name = "jobserver" @@ -4994,9 +5016,9 @@ dependencies = [ [[package]] name = "pulldown-cmark" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14104c5a24d9bcf7eb2c24753e0f49fe14555d8bd565ea3d38e4b4303267259d" +checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" dependencies = [ "bitflags 2.11.0", "getopts", @@ -7960,9 +7982,9 @@ dependencies = [ [[package]] name = "type1-encoding-parser" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d6cc09e1a99c7e01f2afe4953789311a1c50baebbdac5b477ecf78e2e92a5b" +checksum = "fa10c302f5a53b7ad27fd42a3996e23d096ba39b5b8dd6d9e683a05b01bee749" dependencies = [ "pom", ] @@ -9282,7 +9304,7 @@ dependencies = [ [[package]] name = "zeph" -version = "0.16.1" +version = "0.17.0" dependencies = [ "anyhow", "async-trait", @@ -9331,7 +9353,7 @@ dependencies = [ [[package]] name = "zeph-a2a" -version = "0.16.1" +version = "0.17.0" dependencies = [ "axum 0.8.8", "blake3", @@ -9357,7 +9379,7 @@ dependencies = [ [[package]] name = "zeph-acp" -version = "0.16.1" +version = "0.17.0" dependencies = [ "agent-client-protocol", "async-stream", @@ -9395,7 +9417,7 @@ dependencies = [ [[package]] name = "zeph-channels" -version = "0.16.1" +version = "0.17.0" dependencies = [ "axum 0.8.8", "criterion", @@ -9420,7 +9442,7 @@ dependencies = [ [[package]] name = "zeph-common" -version = "0.16.1" +version = "0.17.0" dependencies = [ "serde", "thiserror 2.0.18", @@ -9436,7 +9458,7 @@ dependencies = [ [[package]] name = "zeph-config" -version = "0.16.1" +version = "0.17.0" dependencies = [ "dirs", "insta", @@ -9457,7 +9479,7 @@ dependencies = [ [[package]] name = "zeph-core" -version = "0.16.1" +version = "0.17.0" dependencies = [ "age", "async-trait", @@ -9510,7 +9532,7 @@ dependencies = [ [[package]] name = "zeph-experiments" -version = "0.16.1" +version = "0.17.0" dependencies = [ "futures", "ordered-float 5.1.0", @@ -9533,7 +9555,7 @@ dependencies = [ [[package]] name = "zeph-gateway" -version = "0.16.1" +version = "0.17.0" dependencies = [ "axum 0.8.8", "blake3", @@ -9550,7 +9572,7 @@ dependencies = [ [[package]] name = "zeph-index" -version = "0.16.1" +version = "0.17.0" dependencies = [ "blake3", "ignore", @@ -9581,7 +9603,7 @@ dependencies = [ [[package]] name = "zeph-llm" -version = "0.16.1" +version = "0.17.0" dependencies = [ "async-stream", "audioadapter-buffers", @@ -9617,7 +9639,7 @@ dependencies = [ [[package]] name = "zeph-mcp" -version = "0.16.1" +version = "0.17.0" dependencies = [ "async-trait", "blake3", @@ -9644,7 +9666,7 @@ dependencies = [ [[package]] name = "zeph-memory" -version = "0.16.1" +version = "0.17.0" dependencies = [ "blake3", "bytemuck", @@ -9675,7 +9697,7 @@ dependencies = [ [[package]] name = "zeph-orchestration" -version = "0.16.1" +version = "0.17.0" dependencies = [ "blake3", "schemars 1.2.1", @@ -9696,7 +9718,7 @@ dependencies = [ [[package]] name = "zeph-sanitizer" -version = "0.16.1" +version = "0.17.0" dependencies = [ "proptest", "regex", @@ -9716,7 +9738,7 @@ dependencies = [ [[package]] name = "zeph-scheduler" -version = "0.16.1" +version = "0.17.0" dependencies = [ "chrono", "cron", @@ -9733,7 +9755,7 @@ dependencies = [ [[package]] name = "zeph-skills" -version = "0.16.1" +version = "0.17.0" dependencies = [ "blake3", "criterion", @@ -9760,7 +9782,7 @@ dependencies = [ [[package]] name = "zeph-subagent" -version = "0.16.1" +version = "0.17.0" dependencies = [ "dirs", "indoc", @@ -9786,7 +9808,7 @@ dependencies = [ [[package]] name = "zeph-tools" -version = "0.16.1" +version = "0.17.0" dependencies = [ "dirs", "glob", @@ -9822,7 +9844,7 @@ dependencies = [ [[package]] name = "zeph-tui" -version = "0.16.1" +version = "0.17.0" dependencies = [ "chrono", "crossterm", @@ -9855,7 +9877,7 @@ dependencies = [ [[package]] name = "zeph-vault" -version = "0.16.1" +version = "0.17.0" dependencies = [ "age", "proptest", diff --git a/Cargo.toml b/Cargo.toml index 16811201..929504d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ resolver = "3" [workspace.package] edition = "2024" rust-version = "1.88" -version = "0.16.1" +version = "0.17.0" authors = ["bug-ops"] license = "MIT" repository = "https://github.com/bug-ops/zeph" @@ -115,26 +115,26 @@ url = "2.5" uuid = "1.22" wiremock = "0.6.5" zeroize = { version = "1", default-features = false } -zeph-a2a = { path = "crates/zeph-a2a", version = "0.16.1" } -zeph-acp = { path = "crates/zeph-acp", version = "0.16.1" } -zeph-channels = { path = "crates/zeph-channels", version = "0.16.1" } -zeph-common = { path = "crates/zeph-common", version = "0.16.1" } -zeph-config = { path = "crates/zeph-config", version = "0.16.1" } -zeph-core = { path = "crates/zeph-core", version = "0.16.1" } -zeph-experiments = { path = "crates/zeph-experiments", version = "0.16.1" } -zeph-gateway = { path = "crates/zeph-gateway", version = "0.16.1" } -zeph-index = { path = "crates/zeph-index", version = "0.16.1" } -zeph-llm = { path = "crates/zeph-llm", version = "0.16.1" } -zeph-mcp = { path = "crates/zeph-mcp", version = "0.16.1" } -zeph-memory = { path = "crates/zeph-memory", version = "0.16.1" } -zeph-scheduler = { path = "crates/zeph-scheduler", version = "0.16.1" } -zeph-skills = { path = "crates/zeph-skills", version = "0.16.1" } -zeph-tools = { path = "crates/zeph-tools", version = "0.16.1" } -zeph-tui = { path = "crates/zeph-tui", version = "0.16.1" } -zeph-vault = { path = "crates/zeph-vault", version = "0.16.1" } -zeph-orchestration = { path = "crates/zeph-orchestration", version = "0.16.1" } -zeph-sanitizer = { path = "crates/zeph-sanitizer", version = "0.16.1" } -zeph-subagent = { path = "crates/zeph-subagent", version = "0.16.1" } +zeph-a2a = { path = "crates/zeph-a2a", version = "0.17.0" } +zeph-acp = { path = "crates/zeph-acp", version = "0.17.0" } +zeph-channels = { path = "crates/zeph-channels", version = "0.17.0" } +zeph-common = { path = "crates/zeph-common", version = "0.17.0" } +zeph-config = { path = "crates/zeph-config", version = "0.17.0" } +zeph-core = { path = "crates/zeph-core", version = "0.17.0" } +zeph-experiments = { path = "crates/zeph-experiments", version = "0.17.0" } +zeph-gateway = { path = "crates/zeph-gateway", version = "0.17.0" } +zeph-index = { path = "crates/zeph-index", version = "0.17.0" } +zeph-llm = { path = "crates/zeph-llm", version = "0.17.0" } +zeph-mcp = { path = "crates/zeph-mcp", version = "0.17.0" } +zeph-memory = { path = "crates/zeph-memory", version = "0.17.0" } +zeph-scheduler = { path = "crates/zeph-scheduler", version = "0.17.0" } +zeph-skills = { path = "crates/zeph-skills", version = "0.17.0" } +zeph-tools = { path = "crates/zeph-tools", version = "0.17.0" } +zeph-tui = { path = "crates/zeph-tui", version = "0.17.0" } +zeph-vault = { path = "crates/zeph-vault", version = "0.17.0" } +zeph-orchestration = { path = "crates/zeph-orchestration", version = "0.17.0" } +zeph-sanitizer = { path = "crates/zeph-sanitizer", version = "0.17.0" } +zeph-subagent = { path = "crates/zeph-subagent", version = "0.17.0" } [workspace.lints.rust] unsafe_code = "deny" diff --git a/README.md b/README.md index 98210dd3..d0781c2a 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ [![Crates.io](https://img.shields.io/crates/v/zeph)](https://crates.io/crates/zeph) [![docs](https://img.shields.io/badge/docs-book-blue)](https://bug-ops.github.io/zeph/) [![CI](https://img.shields.io/github/actions/workflow/status/bug-ops/zeph/ci.yml?branch=main&label=CI)](https://github.com/bug-ops/zeph/actions) - [![Tests](https://img.shields.io/badge/tests-6293-brightgreen)](https://github.com/bug-ops/zeph/actions) + [![Tests](https://img.shields.io/badge/tests-6406-brightgreen)](https://github.com/bug-ops/zeph/actions) [![codecov](https://codecov.io/gh/bug-ops/zeph/graph/badge.svg?token=S5O0GR9U6G)](https://codecov.io/gh/bug-ops/zeph) [![Crates](https://img.shields.io/badge/crates-20-orange)](https://github.com/bug-ops/zeph/tree/main/crates) [![MSRV](https://img.shields.io/badge/MSRV-1.88-blue)](https://www.rust-lang.org) From 4713d84ea7b8489884002cc7ccc15b64d10019da Mon Sep 17 00:00:00 2001 From: "Andrei G." Date: Mon, 23 Mar 2026 07:44:48 +0100 Subject: [PATCH 2/3] test(tui): update splash snapshot for v0.17.0 --- .../zeph_tui__widgets__splash__tests__splash_default.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/zeph-tui/src/widgets/snapshots/zeph_tui__widgets__splash__tests__splash_default.snap b/crates/zeph-tui/src/widgets/snapshots/zeph_tui__widgets__splash__tests__splash_default.snap index b6c8abc5..2f482cd5 100644 --- a/crates/zeph-tui/src/widgets/snapshots/zeph_tui__widgets__splash__tests__splash_default.snap +++ b/crates/zeph-tui/src/widgets/snapshots/zeph_tui__widgets__splash__tests__splash_default.snap @@ -15,7 +15,7 @@ expression: output │ ███████╗███████╗██║ ██║ ██║ │ │ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═╝ │ │ │ -│ v0.16.1 │ +│ v0.17.0 │ │ │ │ Type a message to start. │ │ │ From 6b78f81f4bf92847f320d811754da12171415d9d Mon Sep 17 00:00:00 2001 From: "Andrei G." Date: Mon, 23 Mar 2026 07:45:57 +0100 Subject: [PATCH 3/3] ci: exclude VS Marketplace and GitHub Gist from lychee link check --- .github/lychee.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/lychee.toml b/.github/lychee.toml index 9eb4d2a8..38febb59 100644 --- a/.github/lychee.toml +++ b/.github/lychee.toml @@ -14,6 +14,10 @@ exclude = [ "https://platform.claude.com/.*", # Requires GitHub auth "https://github.com/.*/security/advisories/.*", + # Gist — intermittently returns 404 in CI + "https://gist.github.com/egmontkob/.*", + # VS Marketplace — blocks CI user-agents + "https://marketplace.visualstudio.com/.*", ] # Skip URLs that require authentication