diff --git a/CHANGELOG.md b/CHANGELOG.md
index edb4066..13029e3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,17 +6,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
## [Unreleased]
+## [0.11.4] - 2026-02-21
+
### Added
- `validate_skill_references(body, skill_dir)` in zeph-skills loader: parses Markdown links targeting `references/`, `scripts/`, or `assets/` subdirs, warns on missing files and symlink traversal attempts (#689)
- `sanitize_skill_body(body)` in zeph-skills prompt: escapes XML structural tags (``, ``, ``) to prevent prompt injection (#689)
- Body sanitization applied automatically to all non-`Trusted` skills in `format_skills_prompt()` (#689)
-
-### Changed
-- `requires-secrets` SKILL.md frontmatter field renamed to `x-requires-secrets` to follow JSON Schema vendor extension convention and avoid future spec collisions — **breaking change**: update skill frontmatter to use `x-requires-secrets`; the old `requires-secrets` form is still parsed with a deprecation warning (#688)
-- `allowed-tools` SKILL.md field now uses space-separated values per agentskills.io spec (was comma-separated) — **breaking change** for skills using comma-delimited allowed-tools (#686)
-- Skill resource files (references, scripts, assets) are no longer eagerly injected into the system prompt on skill activation; only filenames are listed as available resources — **breaking change** for skills relying on auto-injected reference content (#687)
-
-### Added
- `load_skill_resource(skill_dir, relative_path)` public function in `zeph-skills::resource` for on-demand loading of skill resource files with path traversal protection (#687)
- Nested `metadata:` block support in SKILL.md frontmatter: indented key-value pairs under `metadata:` are parsed as structured metadata (#686)
- Field length validation in SKILL.md loader: `description` capped at 1024 characters, `compatibility` capped at 500 characters (#686)
@@ -35,6 +30,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
- Gate skill activation on required secrets availability in system prompt builder (#682)
- Inject active skill's secrets as scoped env vars into `ShellExecutor` at execution time (#682)
- Custom secrets step in interactive config wizard (`--init`) (#682)
+- crates.io publishing metadata (description, readme, homepage, keywords, categories) for all workspace crates (#702)
+
+### Changed
+- `requires-secrets` SKILL.md frontmatter field renamed to `x-requires-secrets` to follow JSON Schema vendor extension convention and avoid future spec collisions — **breaking change**: update skill frontmatter to use `x-requires-secrets`; the old `requires-secrets` form is still parsed with a deprecation warning (#688)
+- `allowed-tools` SKILL.md field now uses space-separated values per agentskills.io spec (was comma-separated) — **breaking change** for skills using comma-delimited allowed-tools (#686)
+- Skill resource files (references, scripts, assets) are no longer eagerly injected into the system prompt on skill activation; only filenames are listed as available resources — **breaking change** for skills relying on auto-injected reference content (#687)
## [0.11.3] - 2026-02-20
@@ -1083,7 +1084,8 @@ let agent = Agent::new(provider, channel, &skills_prompt, executor);
- Agent calls channel.send_typing() before each LLM request
- Agent::run() uses tokio::select! to race channel messages against shutdown signal
-[Unreleased]: https://github.com/bug-ops/zeph/compare/v0.11.3...HEAD
+[Unreleased]: https://github.com/bug-ops/zeph/compare/v0.11.4...HEAD
+[0.11.4]: https://github.com/bug-ops/zeph/compare/v0.11.3...v0.11.4
[0.11.3]: https://github.com/bug-ops/zeph/compare/v0.11.2...v0.11.3
[0.11.2]: https://github.com/bug-ops/zeph/compare/v0.11.1...v0.11.2
[0.11.1]: https://github.com/bug-ops/zeph/compare/v0.11.0...v0.11.1
diff --git a/Cargo.lock b/Cargo.lock
index adbb764..5cb8e10 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -27,6 +27,17 @@ dependencies = [
"generic-array",
]
+[[package]]
+name = "aes"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0"
+dependencies = [
+ "cfg-if",
+ "cipher",
+ "cpufeatures",
+]
+
[[package]]
name = "age"
version = "0.11.2"
@@ -42,7 +53,7 @@ dependencies = [
"i18n-embed",
"i18n-embed-fl",
"lazy_static",
- "nom",
+ "nom 7.1.3",
"pin-project",
"rand 0.8.5",
"rust-embed",
@@ -64,7 +75,7 @@ dependencies = [
"cookie-factory",
"hkdf",
"io_tee",
- "nom",
+ "nom 7.1.3",
"rand 0.8.5",
"secrecy",
"sha2",
@@ -159,7 +170,7 @@ version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
dependencies = [
- "windows-sys 0.60.2",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -170,14 +181,14 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
dependencies = [
"anstyle",
"once_cell_polyfill",
- "windows-sys 0.60.2",
+ "windows-sys 0.61.2",
]
[[package]]
name = "anyhow"
-version = "1.0.101"
+version = "1.0.102"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea"
+checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
[[package]]
name = "aquamarine"
@@ -190,7 +201,7 @@ dependencies = [
"proc-macro-error2",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -268,7 +279,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -279,7 +290,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -306,6 +317,43 @@ version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+[[package]]
+name = "audio-core"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f93ebbf82d06013f4c41fe71303feb980cddd78496d904d06be627972de51a24"
+
+[[package]]
+name = "audioadapter"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e25c5bb54993ad4693d8b68b6f29f872c5fd9f92a6469d0acb0cbaf80a13d0f9"
+dependencies = [
+ "audio-core",
+ "num-traits",
+]
+
+[[package]]
+name = "audioadapter-buffers"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6af89882334c4e501faa08992888593ada468f9e1ab211635c32f9ada7786e0"
+dependencies = [
+ "audioadapter",
+ "audioadapter-sample",
+ "num-traits",
+]
+
+[[package]]
+name = "audioadapter-sample"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e9a3d502fec0b21aa420febe0b110875cf8a7057c49e83a0cace1df6a73e03e"
+dependencies = [
+ "audio-core",
+ "num-traits",
+]
+
[[package]]
name = "autocfg"
version = "1.5.0"
@@ -442,7 +490,7 @@ checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -569,6 +617,15 @@ dependencies = [
"generic-array",
]
+[[package]]
+name = "block-padding"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93"
+dependencies = [
+ "generic-array",
+]
+
[[package]]
name = "block2"
version = "0.6.2"
@@ -617,7 +674,7 @@ dependencies = [
"tokio",
"tokio-stream",
"tokio-util",
- "tonic 0.14.4",
+ "tonic 0.14.5",
"tower-service",
"url",
"winapi",
@@ -631,9 +688,9 @@ checksum = "85a885520bf6249ab931a764ffdb87b0ceef48e6e7d807cfdb21b751e086e1ad"
dependencies = [
"prost 0.14.3",
"prost-types 0.14.3",
- "tonic 0.14.4",
+ "tonic 0.14.5",
"tonic-prost",
- "ureq 3.2.0",
+ "ureq",
]
[[package]]
@@ -664,9 +721,15 @@ dependencies = [
[[package]]
name = "bumpalo"
-version = "3.20.1"
+version = "3.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c6f81257d10a0f602a294ae4182251151ff97dbb504ef9afcdda4a64b24d9b4"
+checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"
+
+[[package]]
+name = "bytecount"
+version = "0.6.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
[[package]]
name = "bytemuck"
@@ -685,7 +748,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -816,6 +879,15 @@ dependencies = [
"rustversion",
]
+[[package]]
+name = "cbc"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6"
+dependencies = [
+ "cipher",
+]
+
[[package]]
name = "cc"
version = "1.2.56"
@@ -834,6 +906,12 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
+[[package]]
+name = "cff-parser"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31f5b6e9141c036f3ff4ce7b2f7e432b0f00dee416ddcd4f17741d189ddc2e9d"
+
[[package]]
name = "cfg-if"
version = "1.0.4"
@@ -924,9 +1002,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.5.59"
+version = "4.5.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5caf74d17c3aec5495110c34cc3f78644bfa89af6c8993ed4de2790e49b6499"
+checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a"
dependencies = [
"clap_builder",
"clap_derive",
@@ -934,9 +1012,9 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.5.59"
+version = "4.5.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "370daa45065b80218950227371916a1633217ae42b2715b2287b606dcd618e24"
+checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876"
dependencies = [
"anstream",
"anstyle",
@@ -953,7 +1031,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -983,7 +1061,7 @@ version = "3.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34"
dependencies = [
- "windows-sys 0.48.0",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -1038,10 +1116,22 @@ dependencies = [
"encode_unicode",
"libc",
"once_cell",
- "unicode-width",
"windows-sys 0.59.0",
]
+[[package]]
+name = "console"
+version = "0.16.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03e45a4a8926227e4197636ba97a9fc9b00477e9f4bd711395687c5f0734bec4"
+dependencies = [
+ "encode_unicode",
+ "libc",
+ "once_cell",
+ "unicode-width",
+ "windows-sys 0.61.2",
+]
+
[[package]]
name = "const-oid"
version = "0.9.6"
@@ -1063,6 +1153,17 @@ dependencies = [
"unicode-segmentation",
]
+[[package]]
+name = "cookie"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747"
+dependencies = [
+ "percent-encoding",
+ "time",
+ "version_check",
+]
+
[[package]]
name = "cookie-factory"
version = "0.3.3"
@@ -1072,6 +1173,24 @@ dependencies = [
"futures",
]
+[[package]]
+name = "cookie_store"
+version = "0.22.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15b2c103cf610ec6cae3da84a766285b42fd16aad564758459e6ecf128c75206"
+dependencies = [
+ "cookie",
+ "document-features",
+ "idna",
+ "indexmap 2.13.0",
+ "log",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "time",
+ "url",
+]
+
[[package]]
name = "core-foundation"
version = "0.9.4"
@@ -1295,7 +1414,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -1342,7 +1461,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -1386,7 +1505,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -1400,7 +1519,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -1413,7 +1532,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -1424,7 +1543,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
dependencies = [
"darling_core 0.20.11",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -1435,7 +1554,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81"
dependencies = [
"darling_core 0.21.3",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -1446,7 +1565,7 @@ checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d"
dependencies = [
"darling_core 0.23.0",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -1527,7 +1646,7 @@ dependencies = [
"darling 0.20.11",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -1537,7 +1656,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
dependencies = [
"derive_builder_core",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -1566,7 +1685,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
"unicode-xid",
]
@@ -1580,19 +1699,18 @@ dependencies = [
"proc-macro2",
"quote",
"rustc_version",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
name = "dialoguer"
-version = "0.11.0"
+version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de"
+checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96"
dependencies = [
- "console",
+ "console 0.16.2",
"shell-words",
"tempfile",
- "thiserror 1.0.69",
"zeroize",
]
@@ -1626,7 +1744,7 @@ dependencies = [
"libc",
"option-ext",
"redox_users",
- "windows-sys 0.59.0",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -1647,7 +1765,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -1729,6 +1847,15 @@ version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1d926b4d407d372f141f93bb444696142c29d32962ccbd3531117cf3aa0bfa9"
+[[package]]
+name = "ecb"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a8bfa975b1aec2145850fcaa1c6fe269a16578c44705a532ae3edc92b8881c7"
+dependencies = [
+ "cipher",
+]
+
[[package]]
name = "either"
version = "1.15.0"
@@ -1762,7 +1889,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -1788,7 +1915,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [
"libc",
- "windows-sys 0.52.0",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -1854,7 +1981,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74fef4569247a5f429d9156b9d0a2599914385dd189c539334c625d8099d90ab"
dependencies = [
"futures-core",
- "nom",
+ "nom 7.1.3",
"pin-project-lite",
]
@@ -2103,7 +2230,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -2203,7 +2330,7 @@ checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -2644,9 +2771,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "hf-hub"
-version = "0.4.3"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "629d8f3bbeda9d148036d6b0de0a3ab947abd08ce90626327fc3547a49d59d97"
+checksum = "aef3982638978efa195ff11b305f51f1f22f4f0a6cabee7af79b383ebee6a213"
dependencies = [
"dirs",
"futures",
@@ -2661,8 +2788,8 @@ dependencies = [
"serde_json",
"thiserror 2.0.18",
"tokio",
- "ureq 2.12.1",
- "windows-sys 0.60.2",
+ "ureq",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -2904,7 +3031,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
- "syn 2.0.116",
+ "syn 2.0.117",
"unic-langid",
]
@@ -2918,7 +3045,7 @@ dependencies = [
"i18n-config",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -3119,14 +3246,14 @@ dependencies = [
[[package]]
name = "indicatif"
-version = "0.17.11"
+version = "0.18.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235"
+checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb"
dependencies = [
- "console",
- "number_prefix",
+ "console 0.16.2",
"portable-atomic",
"unicode-width",
+ "unit-prefix",
"web-time",
]
@@ -3165,6 +3292,7 @@ version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01"
dependencies = [
+ "block-padding",
"generic-array",
]
@@ -3174,7 +3302,7 @@ version = "1.46.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e82db8c87c7f1ccecb34ce0c24399b8a73081427f3c7c50a5d597925356115e4"
dependencies = [
- "console",
+ "console 0.15.11",
"once_cell",
"regex",
"serde",
@@ -3194,7 +3322,7 @@ dependencies = [
"indoc",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -3311,9 +3439,9 @@ dependencies = [
[[package]]
name = "js-sys"
-version = "0.3.85"
+version = "0.3.87"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3"
+checksum = "93f0862381daaec758576dcc22eb7bbf4d7efd67328553f3b45a412a51a3fb21"
dependencies = [
"once_cell",
"wasm-bindgen",
@@ -3469,19 +3597,29 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
[[package]]
name = "lopdf"
-version = "0.34.0"
+version = "0.38.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5c8ecfc6c72051981c0459f75ccc585e7ff67c70829560cda8e647882a9abff"
+checksum = "c7184fdea2bc3cd272a1acec4030c321a8f9875e877b3f92a53f2f6033fdc289"
dependencies = [
+ "aes",
+ "bitflags 2.11.0",
+ "cbc",
+ "ecb",
"encoding_rs",
"flate2",
+ "getrandom 0.3.4",
"indexmap 2.13.0",
"itoa",
"log",
"md-5",
- "nom",
+ "nom 8.0.0",
+ "nom_locate",
+ "rand 0.9.2",
"rangemap",
- "time",
+ "sha2",
+ "stringprep",
+ "thiserror 2.0.18",
+ "ttf-parser",
"weezl",
]
@@ -3707,7 +3845,7 @@ checksum = "e4db6d5580af57bf992f59068d4ea26fd518574ff48d7639b255a36f9de6e7e9"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -3764,6 +3902,26 @@ dependencies = [
"minimal-lexical",
]
+[[package]]
+name = "nom"
+version = "8.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "nom_locate"
+version = "5.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b577e2d69827c4740cba2b52efaad1c4cc7c73042860b199710b3575c68438d"
+dependencies = [
+ "bytecount",
+ "memchr",
+ "nom 8.0.0",
+]
+
[[package]]
name = "notify"
version = "8.2.0"
@@ -3809,7 +3967,7 @@ version = "0.50.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
dependencies = [
- "windows-sys 0.59.0",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -3886,7 +4044,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -3949,12 +4107,6 @@ dependencies = [
"libc",
]
-[[package]]
-name = "number_prefix"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
-
[[package]]
name = "objc"
version = "0.2.7"
@@ -4117,7 +4269,7 @@ dependencies = [
"reqwest 0.12.28",
"thiserror 2.0.18",
"tokio",
- "tonic 0.14.4",
+ "tonic 0.14.5",
"tracing",
]
@@ -4130,7 +4282,7 @@ dependencies = [
"opentelemetry",
"opentelemetry_sdk",
"prost 0.14.3",
- "tonic 0.14.4",
+ "tonic 0.14.5",
"tonic-prost",
]
@@ -4227,7 +4379,7 @@ dependencies = [
"regex",
"regex-syntax",
"structmeta",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -4254,13 +4406,15 @@ dependencies = [
[[package]]
name = "pdf-extract"
-version = "0.7.12"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cbb3a5387b94b9053c1e69d8abfd4dd6dae7afda65a5c5279bc1f42ab39df575"
+checksum = "1e28ba1758a3d3f361459645780e09570b573fc3c82637449e9963174c813a98"
dependencies = [
"adobe-cmap-parser",
+ "cff-parser",
"encoding_rs",
"euclid 0.20.14",
+ "log",
"lopdf",
"postscript",
"type1-encoding-parser",
@@ -4312,7 +4466,7 @@ dependencies = [
"pest_meta",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -4396,7 +4550,7 @@ dependencies = [
"phf_shared 0.11.3",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -4409,7 +4563,7 @@ dependencies = [
"phf_shared 0.13.1",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -4447,7 +4601,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -4583,7 +4737,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
dependencies = [
"proc-macro2",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -4614,7 +4768,7 @@ dependencies = [
"proc-macro-error-attr2",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -4689,7 +4843,7 @@ dependencies = [
"itertools 0.14.0",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -4702,7 +4856,7 @@ dependencies = [
"itertools 0.14.0",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -4800,9 +4954,9 @@ checksum = "40e24eee682d89fb193496edf918a7f407d30175b2e785fe057e4392dfd182e0"
[[package]]
name = "qdrant-client"
-version = "1.16.0"
+version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a76499f3e8385dae785d65a0216e0dfa8fadaddd18038adf04f438631683b26a"
+checksum = "f5d0a9b168ecf8f30a3eb7e8f4766e3050701242ffbe99838b58e6c4251e7211"
dependencies = [
"anyhow",
"derive_builder",
@@ -5174,7 +5328,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -5318,9 +5472,9 @@ dependencies = [
[[package]]
name = "rmcp"
-version = "0.15.0"
+version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bef41ebc9ebed2c1b1d90203e9d1756091e8a00bbc3107676151f39868ca0ee"
+checksum = "cc4c9c94680f75470ee8083a0667988b5d7b5beb70b9f998a8e51de7c682ce60"
dependencies = [
"async-trait",
"base64 0.22.1",
@@ -5330,7 +5484,7 @@ dependencies = [
"pastey",
"pin-project-lite",
"process-wrap",
- "reqwest 0.12.28",
+ "reqwest 0.13.2",
"rmcp-macros",
"schemars 1.2.1",
"serde",
@@ -5345,15 +5499,15 @@ dependencies = [
[[package]]
name = "rmcp-macros"
-version = "0.15.0"
+version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e88ad84b8b6237a934534a62b379a5be6388915663c0cc598ceb9b3292bbbfe"
+checksum = "90c23c8f26cae4da838fbc3eadfaecf2d549d97c04b558e7bd90526a9c28b42a"
dependencies = [
"darling 0.23.0",
"proc-macro2",
"quote",
"serde_json",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -5378,14 +5532,18 @@ dependencies = [
[[package]]
name = "rubato"
-version = "0.16.2"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5258099699851cfd0082aeb645feb9c084d9a5e1f1b8d5372086b989fc5e56a1"
+checksum = "90173154a8a14e6adb109ea641743bc95ec81c093d94e70c6763565f7108ebeb"
dependencies = [
+ "audioadapter",
+ "audioadapter-buffers",
"num-complex",
"num-integer",
"num-traits",
"realfft",
+ "visibility",
+ "windowfunctions",
]
[[package]]
@@ -5408,7 +5566,7 @@ dependencies = [
"proc-macro2",
"quote",
"rust-embed-utils",
- "syn 2.0.116",
+ "syn 2.0.117",
"walkdir",
]
@@ -5467,7 +5625,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys",
- "windows-sys 0.52.0",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -5535,7 +5693,7 @@ dependencies = [
"security-framework",
"security-framework-sys",
"webpki-root-certs",
- "windows-sys 0.52.0",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -5672,7 +5830,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde_derive_internals",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -5683,9 +5841,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "scrape-core"
-version = "0.2.3"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d53cd0cb49d13b913b2f7a6da2a302ae3cb85b3550c0d7f283fec21873edf43a"
+checksum = "07605b9e626725f5a0e0f7ce5d6a6d2a6c6c0ef5f91d91335cc320fa84e178a7"
dependencies = [
"cssparser",
"html5ever",
@@ -5725,9 +5883,9 @@ dependencies = [
[[package]]
name = "security-framework"
-version = "3.6.0"
+version = "3.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38"
+checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d"
dependencies = [
"bitflags 2.11.0",
"core-foundation 0.10.1",
@@ -5738,9 +5896,9 @@ dependencies = [
[[package]]
name = "security-framework-sys"
-version = "2.16.0"
+version = "2.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "321c8673b092a9a42605034a9879d73cb79101ed5fd117bc9a597b89b4e9e61a"
+checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3"
dependencies = [
"core-foundation-sys",
"libc",
@@ -5819,7 +5977,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -5830,7 +5988,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -5875,7 +6033,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -5927,7 +6085,7 @@ dependencies = [
"darling 0.21.3",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -5953,7 +6111,7 @@ checksum = "6f50427f258fb77356e4cd4aa0e87e2bd2c66dbcee41dc405282cae2bfc26c83"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -6145,7 +6303,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5851699c4033c63636f7ea4cf7b7c1f1bf06d0cc03cfb42e711de5a5c46cf326"
dependencies = [
"base64 0.13.1",
- "nom",
+ "nom 7.1.3",
"serde",
"unicode-segmentation",
]
@@ -6209,7 +6367,7 @@ dependencies = [
"quote",
"sqlx-core",
"sqlx-macros-core",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -6230,7 +6388,7 @@ dependencies = [
"sha2",
"sqlx-core",
"sqlx-sqlite",
- "syn 2.0.116",
+ "syn 2.0.117",
"tokio",
"url",
]
@@ -6438,7 +6596,7 @@ dependencies = [
"proc-macro2",
"quote",
"structmeta-derive",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -6449,7 +6607,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -6470,7 +6628,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -6601,9 +6759,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.116"
+version = "2.0.117"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb"
+checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
dependencies = [
"proc-macro2",
"quote",
@@ -6627,7 +6785,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -6744,7 +6902,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -6754,10 +6912,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1"
dependencies = [
"fastrand",
- "getrandom 0.3.4",
+ "getrandom 0.4.1",
"once_cell",
"rustix",
- "windows-sys 0.52.0",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -6777,7 +6935,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662"
dependencies = [
"fnv",
- "nom",
+ "nom 7.1.3",
"phf 0.11.3",
"phf_codegen 0.11.3",
]
@@ -6890,7 +7048,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -6901,7 +7059,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -7049,7 +7207,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -7210,9 +7368,9 @@ dependencies = [
[[package]]
name = "tonic"
-version = "0.14.4"
+version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f32a6f80051a4111560201420c7885d0082ba9efe2ab61875c587bb6b18b9a0"
+checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec"
dependencies = [
"async-trait",
"axum 0.8.8",
@@ -7239,13 +7397,13 @@ dependencies = [
[[package]]
name = "tonic-prost"
-version = "0.14.4"
+version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f86539c0089bfd09b1f8c0ab0239d80392af74c21bc9e0f15e1b4aca4c1647f"
+checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309"
dependencies = [
"bytes",
"prost 0.14.3",
- "tonic 0.14.4",
+ "tonic 0.14.5",
]
[[package]]
@@ -7339,7 +7497,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -7535,6 +7693,12 @@ version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+[[package]]
+name = "ttf-parser"
+version = "0.25.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31"
+
[[package]]
name = "tungstenite"
version = "0.28.0"
@@ -7740,6 +7904,12 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
+[[package]]
+name = "unit-prefix"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3"
+
[[package]]
name = "universal-hash"
version = "0.5.1"
@@ -7758,36 +7928,23 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "ureq"
-version = "2.12.1"
+version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d"
+checksum = "fdc97a28575b85cfedf2a7e7d3cc64b3e11bd8ac766666318003abbacc7a21fc"
dependencies = [
"base64 0.22.1",
+ "cookie_store",
"flate2",
"log",
- "once_cell",
+ "percent-encoding",
"rustls",
"rustls-pki-types",
"serde",
"serde_json",
"socks",
- "url",
- "webpki-roots 0.26.11",
-]
-
-[[package]]
-name = "ureq"
-version = "3.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdc97a28575b85cfedf2a7e7d3cc64b3e11bd8ac766666318003abbacc7a21fc"
-dependencies = [
- "base64 0.22.1",
- "log",
- "percent-encoding",
- "rustls",
- "rustls-pki-types",
"ureq-proto",
"utf-8",
+ "webpki-roots 1.0.6",
]
[[package]]
@@ -7865,6 +8022,17 @@ version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+[[package]]
+name = "visibility"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.117",
+]
+
[[package]]
name = "vtparse"
version = "0.6.2"
@@ -7934,9 +8102,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
[[package]]
name = "wasm-bindgen"
-version = "0.2.108"
+version = "0.2.110"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566"
+checksum = "1de241cdc66a9d91bd84f097039eb140cdc6eec47e0cdbaf9d932a1dd6c35866"
dependencies = [
"cfg-if",
"once_cell",
@@ -7947,9 +8115,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.58"
+version = "0.4.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f"
+checksum = "a42e96ea38f49b191e08a1bab66c7ffdba24b06f9995b39a9dd60222e5b6f1da"
dependencies = [
"cfg-if",
"futures-util",
@@ -7961,9 +8129,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.108"
+version = "0.2.110"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
+checksum = "e12fdf6649048f2e3de6d7d5ff3ced779cdedee0e0baffd7dff5cdfa3abc8a52"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -7971,22 +8139,22 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.108"
+version = "0.2.110"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
+checksum = "0e63d1795c565ac3462334c1e396fd46dbf481c40f51f5072c310717bc4fb309"
dependencies = [
"bumpalo",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.108"
+version = "0.2.110"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12"
+checksum = "e9f9cdac23a5ce71f6bf9f8824898a501e511892791ea2a0c6b8568c68b9cb53"
dependencies = [
"unicode-ident",
]
@@ -8053,9 +8221,9 @@ dependencies = [
[[package]]
name = "web-sys"
-version = "0.3.85"
+version = "0.3.87"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598"
+checksum = "f2c7c5718134e770ee62af3b6b4a84518ec10101aad610c024b64d6ff29bb1ff"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -8220,7 +8388,7 @@ version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
dependencies = [
- "windows-sys 0.48.0",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -8229,6 +8397,15 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+[[package]]
+name = "windowfunctions"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90628d739333b7c5d2ee0b70210b97b8cddc38440c682c96fd9e2c24c2db5f3a"
+dependencies = [
+ "num-traits",
+]
+
[[package]]
name = "windows"
version = "0.44.0"
@@ -8291,7 +8468,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -8302,7 +8479,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -8727,7 +8904,7 @@ dependencies = [
"heck",
"indexmap 2.13.0",
"prettyplease",
- "syn 2.0.116",
+ "syn 2.0.117",
"wasm-metadata",
"wit-bindgen-core",
"wit-component",
@@ -8743,7 +8920,7 @@ dependencies = [
"prettyplease",
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
"wit-bindgen-core",
"wit-bindgen-rust",
]
@@ -8854,7 +9031,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
"synstructure",
]
@@ -8866,13 +9043,13 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
"synstructure",
]
[[package]]
name = "zeph"
-version = "0.11.3"
+version = "0.11.4"
dependencies = [
"anyhow",
"clap",
@@ -8907,7 +9084,7 @@ dependencies = [
[[package]]
name = "zeph-a2a"
-version = "0.11.3"
+version = "0.11.4"
dependencies = [
"axum 0.8.8",
"eventsource-stream",
@@ -8930,7 +9107,7 @@ dependencies = [
[[package]]
name = "zeph-channels"
-version = "0.11.3"
+version = "0.11.4"
dependencies = [
"axum 0.8.8",
"criterion",
@@ -8955,7 +9132,7 @@ dependencies = [
[[package]]
name = "zeph-core"
-version = "0.11.3"
+version = "0.11.4"
dependencies = [
"age",
"anyhow",
@@ -8988,7 +9165,7 @@ dependencies = [
[[package]]
name = "zeph-gateway"
-version = "0.11.3"
+version = "0.11.4"
dependencies = [
"axum 0.8.8",
"blake3",
@@ -9005,7 +9182,7 @@ dependencies = [
[[package]]
name = "zeph-index"
-version = "0.11.3"
+version = "0.11.4"
dependencies = [
"blake3",
"ignore",
@@ -9036,7 +9213,7 @@ dependencies = [
[[package]]
name = "zeph-llm"
-version = "0.11.3"
+version = "0.11.4"
dependencies = [
"base64 0.22.1",
"candle-core",
@@ -9062,7 +9239,7 @@ dependencies = [
[[package]]
name = "zeph-mcp"
-version = "0.11.3"
+version = "0.11.4"
dependencies = [
"blake3",
"qdrant-client",
@@ -9081,7 +9258,7 @@ dependencies = [
[[package]]
name = "zeph-memory"
-version = "0.11.3"
+version = "0.11.4"
dependencies = [
"blake3",
"criterion",
@@ -9103,7 +9280,7 @@ dependencies = [
[[package]]
name = "zeph-scheduler"
-version = "0.11.3"
+version = "0.11.4"
dependencies = [
"chrono",
"cron",
@@ -9121,7 +9298,7 @@ dependencies = [
[[package]]
name = "zeph-skills"
-version = "0.11.3"
+version = "0.11.4"
dependencies = [
"blake3",
"criterion",
@@ -9144,7 +9321,7 @@ dependencies = [
[[package]]
name = "zeph-tools"
-version = "0.11.3"
+version = "0.11.4"
dependencies = [
"dirs",
"filetime",
@@ -9170,7 +9347,7 @@ dependencies = [
[[package]]
name = "zeph-tui"
-version = "0.11.3"
+version = "0.11.4"
dependencies = [
"crossterm",
"expectrl",
@@ -9216,7 +9393,7 @@ checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -9236,7 +9413,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
"synstructure",
]
@@ -9257,7 +9434,7 @@ checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
@@ -9291,7 +9468,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.116",
+ "syn 2.0.117",
]
[[package]]
diff --git a/Cargo.toml b/Cargo.toml
index 90e925a..30fb34e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,7 +5,7 @@ resolver = "3"
[workspace.package]
edition = "2024"
rust-version = "1.88"
-version = "0.11.3"
+version = "0.11.4"
authors = ["bug-ops"]
license = "MIT"
repository = "https://github.com/bug-ops/zeph"
@@ -28,12 +28,12 @@ clap = { version = "4.5", features = ["derive"] }
criterion = "0.8"
cron = "0.15"
crossterm = "0.29"
-dialoguer = "0.11"
+dialoguer = "0.12"
eventsource-stream = "0.2"
futures = "0.3"
futures-core = "0.3"
glob = "0.3.3"
-hf-hub = { version = "0.4", default-features = false, features = ["tokio", "rustls-tls", "ureq"] }
+hf-hub = { version = "0.5", default-features = false, features = ["tokio", "rustls-tls", "ureq"] }
http-body-util = "0.1"
ignore = "0.4"
insta = { version = "1.46.3", features = ["toml", "filters"] }
@@ -44,15 +44,15 @@ ollama-rs = { version = "0.3", default-features = false, features = ["rustls", "
opentelemetry = "0.31"
opentelemetry-otlp = { version = "0.31", features = ["grpc-tonic"] }
opentelemetry_sdk = { version = "0.31", features = ["rt-tokio"] }
-pdf-extract = "0.7"
+pdf-extract = "0.10"
proptest = "1.10"
pulldown-cmark = "0.13"
-qdrant-client = { version = "1.16", default-features = false }
+qdrant-client = { version = "1.17", default-features = false }
ratatui = "0.30"
regex = "1.12"
reqwest = { version = "0.13", default-features = false }
-rmcp = "0.15"
-rubato = "0.16"
+rmcp = "0.16"
+rubato = "1.0"
schemars = "1.2"
scrape-core = "0.2.2"
semver = "1.0.27"
@@ -93,18 +93,18 @@ unicode-width = "0.2"
url = "2.5"
uuid = "1.21"
wiremock = "0.6.5"
-zeph-a2a = { path = "crates/zeph-a2a", version = "0.11.3" }
-zeph-channels = { path = "crates/zeph-channels", version = "0.11.3" }
-zeph-core = { path = "crates/zeph-core", version = "0.11.3" }
-zeph-gateway = { path = "crates/zeph-gateway", version = "0.11.3" }
-zeph-index = { path = "crates/zeph-index", version = "0.11.3" }
-zeph-llm = { path = "crates/zeph-llm", version = "0.11.3" }
-zeph-mcp = { path = "crates/zeph-mcp", version = "0.11.3" }
-zeph-memory = { path = "crates/zeph-memory", version = "0.11.3" }
-zeph-scheduler = { path = "crates/zeph-scheduler", version = "0.11.3" }
-zeph-skills = { path = "crates/zeph-skills", version = "0.11.3" }
-zeph-tools = { path = "crates/zeph-tools", version = "0.11.3" }
-zeph-tui = { path = "crates/zeph-tui", version = "0.11.3" }
+zeph-a2a = { path = "crates/zeph-a2a", version = "0.11.4" }
+zeph-channels = { path = "crates/zeph-channels", version = "0.11.4" }
+zeph-core = { path = "crates/zeph-core", version = "0.11.4" }
+zeph-gateway = { path = "crates/zeph-gateway", version = "0.11.4" }
+zeph-index = { path = "crates/zeph-index", version = "0.11.4" }
+zeph-llm = { path = "crates/zeph-llm", version = "0.11.4" }
+zeph-mcp = { path = "crates/zeph-mcp", version = "0.11.4" }
+zeph-memory = { path = "crates/zeph-memory", version = "0.11.4" }
+zeph-scheduler = { path = "crates/zeph-scheduler", version = "0.11.4" }
+zeph-skills = { path = "crates/zeph-skills", version = "0.11.4" }
+zeph-tools = { path = "crates/zeph-tools", version = "0.11.4" }
+zeph-tui = { path = "crates/zeph-tui", version = "0.11.4" }
[workspace.lints.clippy]
all = "warn"
diff --git a/README.md b/README.md
index 8f1420e..a994011 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,8 @@
Single binary. Minimal hardware. Maximum context efficiency.
Every token counts — Zeph makes sure none are wasted.
+ [](https://crates.io/crates/zeph)
+ [](https://docs.rs/zeph)
[](https://github.com/bug-ops/zeph/actions)
[](https://codecov.io/gh/bug-ops/zeph)
[](https://github.com/bug-ops/zeph/security)
diff --git a/crates/zeph-a2a/README.md b/crates/zeph-a2a/README.md
index 43a57d0..922ec05 100644
--- a/crates/zeph-a2a/README.md
+++ b/crates/zeph-a2a/README.md
@@ -1,6 +1,11 @@
# zeph-a2a
-A2A protocol client and server for agent-to-agent communication.
+[](https://crates.io/crates/zeph-a2a)
+[](https://docs.rs/zeph-a2a)
+[](../../LICENSE)
+[](https://www.rust-lang.org)
+
+A2A protocol client and server with agent discovery for Zeph.
## Overview
@@ -16,11 +21,10 @@ Implements the Agent-to-Agent (A2A) protocol over JSON-RPC 2.0, enabling Zeph to
- **types** — shared protocol types (Task, Message, Artifact, etc.)
- **error** — `A2aError` error types
-## Usage
+## Installation
-```toml
-# Cargo.toml (workspace root)
-zeph-a2a = { path = "crates/zeph-a2a" }
+```bash
+cargo add zeph-a2a
```
Enabled via the `a2a` feature flag on the root `zeph` crate.
diff --git a/crates/zeph-channels/README.md b/crates/zeph-channels/README.md
index 28b2785..f47ec4d 100644
--- a/crates/zeph-channels/README.md
+++ b/crates/zeph-channels/README.md
@@ -1,6 +1,11 @@
# zeph-channels
-Channel implementations for the Zeph agent.
+[](https://crates.io/crates/zeph-channels)
+[](https://docs.rs/zeph-channels)
+[](../../LICENSE)
+[](https://www.rust-lang.org)
+
+Multi-channel I/O adapters (CLI, Telegram, Discord, Slack) for Zeph.
## Overview
@@ -20,11 +25,10 @@ Implements I/O channel adapters that connect the agent to different frontends. S
**Re-exports:** `AnyChannel`, `CliChannel`, `ChannelError`
-## Usage
+## Installation
-```toml
-[dependencies]
-zeph-channels = { path = "../zeph-channels" }
+```bash
+cargo add zeph-channels
```
## License
diff --git a/crates/zeph-core/README.md b/crates/zeph-core/README.md
index e4c7286..e6c111c 100644
--- a/crates/zeph-core/README.md
+++ b/crates/zeph-core/README.md
@@ -1,6 +1,11 @@
# zeph-core
-Agent loop, configuration loading, and context builder.
+[](https://crates.io/crates/zeph-core)
+[](https://docs.rs/zeph-core)
+[](../../LICENSE)
+[](https://www.rust-lang.org)
+
+Core agent loop, configuration, context builder, metrics, and vault for Zeph.
## Overview
@@ -49,11 +54,10 @@ auto_update_check = true # set to false to disable update notifications
Set `ZEPH_AUTO_UPDATE_CHECK=false` to disable without changing the config file.
-## Usage
+## Installation
-```toml
-[dependencies]
-zeph-core = { path = "../zeph-core" }
+```bash
+cargo add zeph-core
```
## License
diff --git a/crates/zeph-gateway/README.md b/crates/zeph-gateway/README.md
index a864b78..bed0241 100644
--- a/crates/zeph-gateway/README.md
+++ b/crates/zeph-gateway/README.md
@@ -1,6 +1,11 @@
# zeph-gateway
-HTTP gateway for webhook ingestion with bearer auth and health endpoint.
+[](https://crates.io/crates/zeph-gateway)
+[](https://docs.rs/zeph-gateway)
+[](../../LICENSE)
+[](https://www.rust-lang.org)
+
+HTTP gateway for webhook ingestion with bearer auth for Zeph.
## Overview
@@ -13,11 +18,10 @@ Exposes an axum 0.8 HTTP server that accepts incoming webhooks, validates bearer
- **router** — axum router construction with auth middleware
- **error** — `GatewayError` error types
-## Usage
+## Installation
-```toml
-# Cargo.toml (workspace root)
-zeph-gateway = { path = "crates/zeph-gateway" }
+```bash
+cargo add zeph-gateway
```
Enabled via the `gateway` feature flag on the root `zeph` crate.
diff --git a/crates/zeph-index/README.md b/crates/zeph-index/README.md
index 56318bb..7225142 100644
--- a/crates/zeph-index/README.md
+++ b/crates/zeph-index/README.md
@@ -1,6 +1,11 @@
# zeph-index
-AST-based code indexing, semantic retrieval, and repo map generation.
+[](https://crates.io/crates/zeph-index)
+[](https://docs.rs/zeph-index)
+[](../../LICENSE)
+[](https://www.rust-lang.org)
+
+AST-based code indexing and semantic retrieval for Zeph.
## Overview
@@ -15,11 +20,10 @@ Parses source files with tree-sitter to extract symbols, chunks them for embeddi
- **watcher** — filesystem watcher for incremental re-indexing
- **error** — `IndexError` error types
-## Usage
+## Installation
-```toml
-# Cargo.toml (workspace root)
-zeph-index = { path = "crates/zeph-index" }
+```bash
+cargo add zeph-index
```
Enabled via the `index` feature flag on the root `zeph` crate.
diff --git a/crates/zeph-llm/README.md b/crates/zeph-llm/README.md
index 881061c..031cd24 100644
--- a/crates/zeph-llm/README.md
+++ b/crates/zeph-llm/README.md
@@ -1,6 +1,11 @@
# zeph-llm
-LLM provider abstraction and backend implementations.
+[](https://crates.io/crates/zeph-llm)
+[](https://docs.rs/zeph-llm)
+[](../../LICENSE)
+[](https://www.rust-lang.org)
+
+LLM provider abstraction with Ollama, Claude, OpenAI, and Candle backends.
## Overview
@@ -28,11 +33,10 @@ Defines the `LlmProvider` trait and ships concrete backends for Ollama, Claude,
**Re-exports:** `LlmProvider`, `LlmError`
-## Usage
+## Installation
-```toml
-[dependencies]
-zeph-llm = { path = "../zeph-llm" }
+```bash
+cargo add zeph-llm
```
## License
diff --git a/crates/zeph-mcp/README.md b/crates/zeph-mcp/README.md
index eac8fde..3651383 100644
--- a/crates/zeph-mcp/README.md
+++ b/crates/zeph-mcp/README.md
@@ -1,6 +1,11 @@
# zeph-mcp
-MCP client lifecycle, tool discovery, and execution.
+[](https://crates.io/crates/zeph-mcp)
+[](https://docs.rs/zeph-mcp)
+[](../../LICENSE)
+[](https://www.rust-lang.org)
+
+MCP client with multi-server lifecycle and Qdrant tool registry for Zeph.
## Overview
@@ -16,11 +21,10 @@ Implements the Model Context Protocol client for Zeph, managing connections to m
- **prompt** — MCP prompt template support
- **error** — `McpError` error types
-## Usage
+## Installation
-```toml
-# Cargo.toml (workspace root)
-zeph-mcp = { path = "crates/zeph-mcp" }
+```bash
+cargo add zeph-mcp
```
## License
diff --git a/crates/zeph-memory/README.md b/crates/zeph-memory/README.md
index 781b457..e30cc1a 100644
--- a/crates/zeph-memory/README.md
+++ b/crates/zeph-memory/README.md
@@ -1,6 +1,11 @@
# zeph-memory
-SQLite-backed conversation persistence with Qdrant vector search.
+[](https://crates.io/crates/zeph-memory)
+[](https://docs.rs/zeph-memory)
+[](../../LICENSE)
+[](https://www.rust-lang.org)
+
+Semantic memory with SQLite and Qdrant for Zeph agent.
## Overview
@@ -36,14 +41,13 @@ Includes a document ingestion subsystem for loading, chunking, and storing user
| `pdf` | PDF document loading via `pdf-extract` |
| `mock` | In-memory `VectorStore` implementation for testing |
-## Usage
+## Installation
-```toml
-[dependencies]
-zeph-memory = { path = "../zeph-memory" }
+```bash
+cargo add zeph-memory
# With PDF support
-zeph-memory = { path = "../zeph-memory", features = ["pdf"] }
+cargo add zeph-memory --features pdf
```
## License
diff --git a/crates/zeph-scheduler/README.md b/crates/zeph-scheduler/README.md
index 315fe7f..cde4414 100644
--- a/crates/zeph-scheduler/README.md
+++ b/crates/zeph-scheduler/README.md
@@ -1,6 +1,11 @@
# zeph-scheduler
-Cron-based periodic task scheduler with SQLite persistence.
+[](https://crates.io/crates/zeph-scheduler)
+[](https://docs.rs/zeph-scheduler)
+[](../../LICENSE)
+[](https://www.rust-lang.org)
+
+Cron-based periodic task scheduler with SQLite persistence for Zeph.
## Overview
@@ -47,17 +52,16 @@ scheduler.register_handler(&TaskKind::UpdateCheck, Box::new(handler));
Notification format sent via the channel:
```
-New version available: v0.12.0 (current: v0.11.3).
+New version available: v0.12.0 (current: v0.11.4).
Update: https://github.com/bug-ops/zeph/releases/tag/v0.12.0
```
Behaviour on error (network failure, non-2xx response, oversized body, parse error, invalid semver) — logs a `warn` message and returns `Ok(())`. The check is best-effort and never crashes the agent.
-## Usage
+## Installation
-```toml
-# Cargo.toml (workspace root)
-zeph-scheduler = { path = "crates/zeph-scheduler" }
+```bash
+cargo add zeph-scheduler
```
Enabled via the `scheduler` feature flag on the root `zeph` crate.
diff --git a/crates/zeph-skills/README.md b/crates/zeph-skills/README.md
index 64c641c..baad07d 100644
--- a/crates/zeph-skills/README.md
+++ b/crates/zeph-skills/README.md
@@ -1,6 +1,11 @@
# zeph-skills
-SKILL.md loader, skill registry, skill manager, and prompt formatter.
+[](https://crates.io/crates/zeph-skills)
+[](https://docs.rs/zeph-skills)
+[](../../LICENSE)
+[](https://www.rust-lang.org)
+
+SKILL.md parser, registry, embedding matcher, and hot-reload for Zeph.
## Overview
@@ -22,11 +27,10 @@ Parses SKILL.md files (YAML frontmatter + markdown body) from the `skills/` dire
**Re-exports:** `SkillError`, `SkillTrust`, `TrustLevel`, `compute_skill_hash`
-## Usage
+## Installation
-```toml
-[dependencies]
-zeph-skills = { path = "../zeph-skills" }
+```bash
+cargo add zeph-skills
```
## License
diff --git a/crates/zeph-tools/README.md b/crates/zeph-tools/README.md
index 0789983..0d6fcb7 100644
--- a/crates/zeph-tools/README.md
+++ b/crates/zeph-tools/README.md
@@ -1,6 +1,11 @@
# zeph-tools
-Tool execution abstraction and shell backend.
+[](https://crates.io/crates/zeph-tools)
+[](https://docs.rs/zeph-tools)
+[](../../LICENSE)
+[](https://www.rust-lang.org)
+
+Tool executor trait with shell, web scrape, and composite executors for Zeph.
## Overview
@@ -26,11 +31,10 @@ Defines the `ToolExecutor` trait for sandboxed tool invocation and ships concret
**Re-exports:** `CompositeExecutor`, `AuditLogger`, `AnomalyDetector`
-## Usage
+## Installation
-```toml
-[dependencies]
-zeph-tools = { path = "../zeph-tools" }
+```bash
+cargo add zeph-tools
```
## License
diff --git a/crates/zeph-tui/README.md b/crates/zeph-tui/README.md
index 9a4036b..0fd278c 100644
--- a/crates/zeph-tui/README.md
+++ b/crates/zeph-tui/README.md
@@ -1,6 +1,11 @@
# zeph-tui
-ratatui-based TUI dashboard with real-time agent metrics.
+[](https://crates.io/crates/zeph-tui)
+[](https://docs.rs/zeph-tui)
+[](../../LICENSE)
+[](https://www.rust-lang.org)
+
+Ratatui-based TUI dashboard with real-time metrics for Zeph.
## Overview
@@ -21,11 +26,10 @@ Provides a terminal UI for monitoring the Zeph agent in real time. Built on rata
- **widgets** — reusable ratatui widget components
- **error** — `TuiError` typed error enum (Io, Channel)
-## Usage
+## Installation
-```toml
-# Cargo.toml (workspace root)
-zeph-tui = { path = "crates/zeph-tui" }
+```bash
+cargo add zeph-tui
```
Enabled via the `tui` feature flag on the root `zeph` crate.
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 f189548..c76ce3b 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
@@ -14,7 +14,7 @@ expression: output
│ ███████╗███████╗██║ ██║ ██║ │
│ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═╝ │
│ │
-│ v0.11.3 │
+│ v0.11.4 │
│ │
│ Type a message to start. │
│ │
diff --git a/docs/src/advanced/skill-trust.md b/docs/src/advanced/skill-trust.md
index adc59f4..d56e34b 100644
--- a/docs/src/advanced/skill-trust.md
+++ b/docs/src/advanced/skill-trust.md
@@ -28,6 +28,10 @@ Quarantined skill bodies are also wrapped with a structural prefix in the system
It has restricted tool access (no bash, file_write, web_scrape).
```
+## Body Sanitization
+
+Skill bodies from non-`Trusted` sources are sanitized before prompt injection. XML-like structural tags (e.g., ``, ``) are escaped to prevent prompt boundary confusion. This is applied automatically — no configuration required.
+
## Anomaly Detection
An `AnomalyDetector` tracks tool execution outcomes in a sliding window (default: 10 events). If the error/blocked ratio exceeds configurable thresholds, an anomaly is reported:
diff --git a/docs/src/advanced/tui.md b/docs/src/advanced/tui.md
index 2e55529..55a1dfd 100644
--- a/docs/src/advanced/tui.md
+++ b/docs/src/advanced/tui.md
@@ -29,7 +29,7 @@ When using `--connect`, the TUI renders token-by-token streaming from the remote
```text
+-------------------------------------------------------------+
-| Zeph v0.11.3 | Provider: orchestrator | Model: claude-son... |
+| Zeph v0.11.4 | Provider: orchestrator | Model: claude-son...|
+----------------------------------------+--------------------+
| | Skills (3/15) |
| | - setup-guide |
@@ -37,13 +37,13 @@ When using `--connect`, the TUI renders token-by-token streaming from the remote
| | |
| [user] Can you check my code? +--------------------+
| | Memory |
-| [zeph] Sure, let me look at | SQLite: 142 msgs |
+| [zeph] Sure, let me look at | SQLite: 142 msgs |
| the code structure... | Qdrant: connected |
| ▲+--------------------+
+----------------------------------------+--------------------+
| You: write a rust function for fibon_ |
+-------------------------------------------------------------+
-| [Insert] | Skills: 3 | Tokens: 4.2k | Qdrant: OK | 2m 15s |
+| [Insert] | Skills: 3 | Tokens: 4.2k | Qdrant: OK | 2m 15s |
+-------------------------------------------------------------+
```
diff --git a/docs/src/architecture/crates.md b/docs/src/architecture/crates.md
index 5d5d24d..027db8b 100644
--- a/docs/src/architecture/crates.md
+++ b/docs/src/architecture/crates.md
@@ -46,7 +46,9 @@ SKILL.md loader, skill registry, and prompt formatter.
- `QdrantSkillMatcher` — persistent embeddings with BLAKE3 delta sync
- `format_skills_prompt()` — assembles prompt with OS-filtered resources
- `format_skills_catalog()` — description-only entries for non-matched skills
-- `resource.rs` — `discover_resources()` + `load_resource()` with path traversal protection and canonical path validation
+- `resource.rs` — `discover_resources()` + `load_resource()` with path traversal protection and canonical path validation; lazy resource loading (resources resolved on first activation, not at startup)
+- File reference validation — local links in skill bodies are checked against the skill directory; broken references and path traversal attempts are rejected at load time
+- `sanitize_skill_body()` — escapes XML-like structural tags in untrusted (non-`Trusted`) skill bodies before prompt injection, preventing prompt boundary confusion
- Filesystem watcher for hot-reload (500ms debounce)
## zeph-memory
diff --git a/docs/src/changelog.md b/docs/src/changelog.md
index e8bbd9b..d4cc6c3 100644
--- a/docs/src/changelog.md
+++ b/docs/src/changelog.md
@@ -6,6 +6,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
## [Unreleased]
+## [0.11.4] - 2026-02-21
+
+### Added
+- crates.io publishing metadata (description, readme, homepage, keywords, categories) for all workspace crates (#702)
+- Skill file reference validation and untrusted body sanitization (#691)
+- Lazy resource loading per spec progressive disclosure (#692)
+- `x-requires-secrets` vendor extension rename (#693)
+- agentskills.io spec alignment for SKILL.md parser (#690)
+- `SkillManager` for installing, removing, verifying skills from git URLs or local paths
+- Custom vault secrets support with `list_keys()` on `VaultProvider` trait (#685)
+
+### Changed
+- `requires-secrets` renamed to `x-requires-secrets` — breaking change (#693)
+- `allowed-tools` now uses space-separated values per spec — breaking change (#690)
+- Skill resource files use lazy loading instead of eager injection — breaking change (#692)
+
## [0.11.3] - 2026-02-20
### Added
@@ -1053,7 +1069,8 @@ let agent = Agent::new(provider, channel, &skills_prompt, executor);
- Agent calls channel.send_typing() before each LLM request
- Agent::run() uses tokio::select! to race channel messages against shutdown signal
-[Unreleased]: https://github.com/bug-ops/zeph/compare/v0.11.3...HEAD
+[Unreleased]: https://github.com/bug-ops/zeph/compare/v0.11.4...HEAD
+[0.11.4]: https://github.com/bug-ops/zeph/compare/v0.11.3...v0.11.4
[0.11.3]: https://github.com/bug-ops/zeph/compare/v0.11.2...v0.11.3
[0.11.2]: https://github.com/bug-ops/zeph/compare/v0.11.1...v0.11.2
[0.11.1]: https://github.com/bug-ops/zeph/compare/v0.11.0...v0.11.1
diff --git a/docs/src/getting-started/installation.md b/docs/src/getting-started/installation.md
index 7acde2f..f6d619c 100644
--- a/docs/src/getting-started/installation.md
+++ b/docs/src/getting-started/installation.md
@@ -19,7 +19,7 @@ ZEPH_INSTALL_DIR=/usr/local/bin curl -fsSL https://github.com/bug-ops/zeph/relea
Install a specific version:
```bash
-curl -fsSL https://github.com/bug-ops/zeph/releases/latest/download/install.sh | sh -s -- --version v0.11.3
+curl -fsSL https://github.com/bug-ops/zeph/releases/latest/download/install.sh | sh -s -- --version v0.11.4
```
After installation, run the configuration wizard:
diff --git a/docs/src/guides/custom-skills.md b/docs/src/guides/custom-skills.md
index e93ebc9..5327fe6 100644
--- a/docs/src/guides/custom-skills.md
+++ b/docs/src/guides/custom-skills.md
@@ -85,7 +85,9 @@ skills/
└── windows.md
```
-Resources in `scripts/`, `references/`, and `assets/` are loaded on demand. OS-specific files (`linux.md`, `macos.md`, `windows.md`) are filtered by platform automatically.
+Resources in `scripts/`, `references/`, and `assets/` are loaded lazily on first skill activation (not at startup). OS-specific files (`linux.md`, `macos.md`, `windows.md`) are filtered by platform automatically.
+
+Local file references in the skill body (e.g., `[see config](references/config.md)`) are validated at load time. Broken links and path traversal attempts (`../../../etc/passwd`) are rejected.
## Configuration
diff --git a/src/init.rs b/src/init.rs
index 1fc801b..d4f17a3 100644
--- a/src/init.rs
+++ b/src/init.rs
@@ -99,7 +99,7 @@ fn prompt_provider_config(label: &str) -> anyhow::Result {
];
let sel = Select::new()
.with_prompt(format!("{label} provider"))
- .items(&sub_providers)
+ .items(sub_providers)
.default(0)
.interact()?;
@@ -201,7 +201,7 @@ fn step_llm_provider(state: &mut WizardState, use_age: bool) -> anyhow::Result<(
];
let selection = Select::new()
.with_prompt("Select LLM provider")
- .items(&providers)
+ .items(providers)
.default(0)
.interact()?;
@@ -331,7 +331,7 @@ fn step_channel(state: &mut WizardState) -> anyhow::Result<()> {
let channels = ["CLI only (default)", "Telegram", "Discord", "Slack"];
let selection = Select::new()
.with_prompt("Select communication channel")
- .items(&channels)
+ .items(channels)
.default(0)
.interact()?;
@@ -396,7 +396,7 @@ fn step_vault(state: &mut WizardState) -> anyhow::Result<()> {
let backends = ["env (environment variables)", "age (encrypted file)"];
let selection = Select::new()
.with_prompt("Select secrets backend")
- .items(&backends)
+ .items(backends)
.default(0)
.interact()?;