Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

## [Unreleased]

## [0.11.3] - 2026-02-20

### Added
- `LoopbackChannel` / `LoopbackHandle` / `LoopbackEvent` in zeph-core — headless channel for daemon mode, pairs with a handle that exposes `input_tx` / `output_rx` for programmatic agent I/O
- `ProcessorEvent` enum in zeph-a2a server — streaming event type replacing synchronous `ProcessResult`; `TaskProcessor::process` now accepts an `mpsc::Sender<ProcessorEvent>` and returns `Result<(), A2aError>`
Expand Down Expand Up @@ -1051,7 +1053,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.2...HEAD
[Unreleased]: https://github.com/bug-ops/zeph/compare/v0.11.3...HEAD
[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
[0.11.0]: https://github.com/bug-ops/zeph/compare/v0.10.0...v0.11.0
Expand Down
26 changes: 13 additions & 13 deletions Cargo.lock

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

26 changes: 13 additions & 13 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ resolver = "3"
[workspace.package]
edition = "2024"
rust-version = "1.88"
version = "0.11.2"
version = "0.11.3"
authors = ["bug-ops"]
license = "MIT"
repository = "https://github.com/bug-ops/zeph"
Expand Down Expand Up @@ -89,18 +89,18 @@ unicode-width = "0.2"
url = "2.5"
uuid = "1.21"
wiremock = "0.6.5"
zeph-a2a = { path = "crates/zeph-a2a", version = "0.11.2" }
zeph-channels = { path = "crates/zeph-channels", version = "0.11.2" }
zeph-core = { path = "crates/zeph-core", version = "0.11.2" }
zeph-gateway = { path = "crates/zeph-gateway", version = "0.11.2" }
zeph-index = { path = "crates/zeph-index", version = "0.11.2" }
zeph-llm = { path = "crates/zeph-llm", version = "0.11.2" }
zeph-mcp = { path = "crates/zeph-mcp", version = "0.11.2" }
zeph-memory = { path = "crates/zeph-memory", version = "0.11.2" }
zeph-scheduler = { path = "crates/zeph-scheduler", version = "0.11.2" }
zeph-skills = { path = "crates/zeph-skills", version = "0.11.2" }
zeph-tools = { path = "crates/zeph-tools", version = "0.11.2" }
zeph-tui = { path = "crates/zeph-tui", version = "0.11.2" }
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" }

[workspace.lints.clippy]
all = "warn"
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ flowchart TD
| **File sandbox** | Writes outside allowed paths |
| **Tool permissions** | Glob-based allow/ask/deny policy per tool |
| **Destructive command gate** | Accidental `rm -rf`, `DROP TABLE`, etc. |
| **Secret redaction** | API keys leaking into context or logs (6 provider patterns) |
| **Secret redaction** | API keys leaking into context or logs (9 provider patterns, regex-based) |
| **SSRF protection** | Agent and MCP client requests to internal networks |
| **Audit logging** | Full tool execution trace for forensics |
| **Rate limiter** | TTL-based eviction, per-IP limits on gateway |
Expand Down Expand Up @@ -262,7 +262,7 @@ Skills **evolve**: failure detection triggers self-reflection, and the agent gen

| Protocol | What It Does |
|----------|-------------|
| **MCP** | Connect external tool servers (stdio + HTTP) with SSRF protection |
| **MCP** | Connect external tool servers (stdio + HTTP) with SSRF protection, command allowlist, and env var blocklist |
| **A2A** | Agent-to-agent communication via JSON-RPC 2.0 with SSE streaming |
| **Audio input** | Speech-to-text via OpenAI Whisper API or local Candle Whisper (offline, feature-gated); Telegram and Slack audio files transcribed automatically |
| **Vision** | Image input via CLI (`/image`), TUI (`/image`), and Telegram photo messages; supported by Claude, OpenAI, and Ollama providers (20 MB max, automatic MIME detection) |
Expand Down
2 changes: 1 addition & 1 deletion crates/zeph-a2a/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Implements the Agent-to-Agent (A2A) protocol over JSON-RPC 2.0, enabling Zeph to
## Key Modules

- **client** — `A2aClient` for sending tasks and messages to remote agents
- **server** — `A2aServer` exposing an A2A-compliant endpoint (requires `server` feature)
- **server** — `A2aServer` exposing an A2A-compliant endpoint with `ProcessorEvent` streaming via `mpsc::Sender` (requires `server` feature)
- **card** — `AgentCardBuilder` for constructing agent capability cards
- **discovery** — `AgentRegistry` for agent lookup and registration
- **jsonrpc** — JSON-RPC 2.0 request/response types
Expand Down
15 changes: 10 additions & 5 deletions crates/zeph-core/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,21 @@ Core orchestration crate for the Zeph agent. Manages the main agent loop, bootst

| Module | Description |
|--------|-------------|
| `agent` | `Agent` — main loop driving inference and tool execution |
| `agent` | `Agent<C>` — main loop driving inference and tool execution; ToolExecutor erased via `Box<dyn ErasedToolExecutor>` |
| `agent::tool_execution` | Tool call handling, redaction, and result processing |
| `agent::message_queue` | Message queue management |
| `agent::builder` | Agent builder API |
| `agent::commands` | Chat command dispatch (skills, feedback, etc.) |
| `agent::utils` | Shared agent utilities |
| `bootstrap` | `AppBuilder` — fluent builder for application startup |
| `channel` | `Channel` trait defining I/O adapters; `Attachment` / `AttachmentKind` for multimodal inputs (images, audio) |
| `config` | TOML config with `ZEPH_*` env overrides |
| `channel` | `Channel` trait defining I/O adapters; `LoopbackChannel` / `LoopbackHandle` for headless daemon I/O; `Attachment` / `AttachmentKind` for multimodal inputs |
| `config` | TOML config with `ZEPH_*` env overrides; typed `ConfigError` (Io, Parse, Validation, Vault) |
| `context` | LLM context assembly from history, skills, memory |
| `cost` | Token cost tracking and budgeting |
| `daemon` | Background daemon mode (optional feature) |
| `daemon` | Background daemon mode with PID file lifecycle (optional feature) |
| `metrics` | Runtime metrics collection |
| `project` | Project-level context detection |
| `redact` | Sensitive data redaction |
| `redact` | Regex-based secret redaction (AWS, OpenAI, Anthropic, Google, GitLab, HuggingFace, npm, Docker) |
| `vault` | Secret storage and resolution via vault providers (age-encrypted read/write) |
| `diff` | Diff rendering utilities |
| `pipeline` | Composable, type-safe step chains for multi-stage workflows |
Expand Down
12 changes: 7 additions & 5 deletions crates/zeph-llm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,20 @@ Defines the `LlmProvider` trait and ships concrete backends for Ollama, Claude,

| Module | Description |
|--------|-------------|
| `provider` | `LlmProvider` trait — unified inference interface |
| `provider` | `LlmProvider` trait — unified inference interface; `name()` returns `&str` (no longer `&'static str`) |
| `ollama` | Ollama HTTP backend |
| `claude` | Anthropic Claude backend |
| `openai` | OpenAI backend |
| `claude` | Anthropic Claude backend with `with_client()` builder for shared `reqwest::Client` |
| `openai` | OpenAI backend with `with_client()` builder for shared `reqwest::Client` |
| `compatible` | Generic OpenAI-compatible endpoint backend |
| `candle_provider` | Local inference via Candle (optional feature) |
| `orchestrator` | Multi-model coordination and fallback |
| `orchestrator` | Multi-model coordination and fallback; `send_with_retry()` helper deduplicates retry logic |
| `router` | Model selection and routing logic |
| `vision` | Image input support — base64-encoded images in LLM requests; optional dedicated `vision_model` per provider |
| `extractor` | `chat_typed<T>()` — typed LLM output via JSON Schema (`schemars`) |
| `extractor` | `chat_typed<T>()` — typed LLM output via JSON Schema (`schemars`); per-`TypeId` schema caching |
| `sse` | Shared `sse_to_chat_stream()` helpers for Claude and OpenAI SSE parsing |
| `stt` | `SpeechToText` trait and `WhisperProvider` (OpenAI Whisper, feature-gated behind `stt`) |
| `candle_whisper` | Local offline STT via Candle (whisper-tiny/base/small, feature-gated behind `candle`) |
| `http` | `default_client()` — shared HTTP client with standard timeouts and user-agent |
| `error` | `LlmError` — unified error type |

**Re-exports:** `LlmProvider`, `LlmError`
Expand Down
2 changes: 1 addition & 1 deletion crates/zeph-mcp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Implements the Model Context Protocol client for Zeph, managing connections to m
## Key Modules

- **client** — low-level MCP transport and session handling
- **manager** — `McpManager`, `McpTransport`, `ServerEntry` for multi-server lifecycle
- **manager** — `McpManager`, `McpTransport`, `ServerEntry` for multi-server lifecycle; command allowlist validation (npx, uvx, node, python3, docker, etc.), env var blocklist (LD_PRELOAD, DYLD_*, NODE_OPTIONS, etc.), and path separator rejection
- **executor** — `McpToolExecutor` bridging MCP tools into the `ToolExecutor` trait
- **registry** — `McpToolRegistry` for tool lookup and optional Qdrant-backed search
- **tool** — `McpTool` wrapper with schema and metadata
Expand Down
3 changes: 2 additions & 1 deletion crates/zeph-memory/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,11 @@ Includes a document ingestion subsystem for loading, chunking, and storing user
| `document::pipeline` | `IngestionPipeline` — load, split, embed, store via Qdrant |
| `vector_store` | `VectorStore` trait and `VectorPoint` types |
| `embedding_store` | `EmbeddingStore` — high-level embedding CRUD |
| `embeddable` | `Embeddable` trait and `EmbeddingRegistry<T>` — generic Qdrant sync/search for any embeddable type |
| `types` | `ConversationId`, `MessageId`, shared types |
| `error` | `MemoryError` — unified error type |

**Re-exports:** `MemoryError`, `QdrantOps`, `ConversationId`, `MessageId`, `Document`, `DocumentLoader`, `TextLoader`, `TextSplitter`, `IngestionPipeline`, `Chunk`, `SplitterConfig`, `DocumentError`, `DocumentMetadata`, `PdfLoader` (behind `pdf` feature)
**Re-exports:** `MemoryError`, `QdrantOps`, `ConversationId`, `MessageId`, `Document`, `DocumentLoader`, `TextLoader`, `TextSplitter`, `IngestionPipeline`, `Chunk`, `SplitterConfig`, `DocumentError`, `DocumentMetadata`, `PdfLoader` (behind `pdf` feature), `Embeddable`, `EmbeddingRegistry`

## Features

Expand Down
2 changes: 1 addition & 1 deletion crates/zeph-scheduler/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ scheduler.register_handler(&TaskKind::UpdateCheck, Box::new(handler));
Notification format sent via the channel:

```
New version available: v0.12.0 (current: v0.11.2).
New version available: v0.12.0 (current: v0.11.3).
Update: https://github.com/bug-ops/zeph/releases/tag/v0.12.0
```

Expand Down
4 changes: 2 additions & 2 deletions crates/zeph-tools/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ Defines the `ToolExecutor` trait for sandboxed tool invocation and ships concret
| Module | Description |
|--------|-------------|
| `executor` | `ToolExecutor` trait, `ToolOutput`, `ToolCall` |
| `shell` | Shell command executor |
| `shell` | Shell command executor with tokenizer-based command detection, escape normalization, and transparent wrapper skipping |
| `file` | File operation executor |
| `scrape` | Web scraping executor |
| `scrape` | Web scraping executor with SSRF protection (post-DNS private IP validation, pinned address client) |
| `composite` | `CompositeExecutor` — chains executors with middleware |
| `filter` | Output filtering pipeline |
| `permissions` | Permission checks for tool invocation |
Expand Down
2 changes: 2 additions & 0 deletions crates/zeph-tui/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Provides a terminal UI for monitoring the Zeph agent in real time. Built on rata

- **app** — `App` state machine driving the render/event loop
- **channel** — `TuiChannel` implementing the `Channel` trait for agent I/O
- **command_palette** — fuzzy-matching command palette with daemon commands (`daemon:connect`, `daemon:disconnect`, `daemon:status`), action commands (`app:quit`, `app:help`, `session:new`, `app:theme`), and keybinding hints
- **event** — `AgentEvent`, `AppEvent`, `EventReader` for async event dispatch
- **file_picker** — `@`-triggered fuzzy file search with `nucleo-matcher` and `ignore` crate
- **highlight** — syntax highlighting for code blocks
Expand All @@ -18,6 +19,7 @@ Provides a terminal UI for monitoring the Zeph agent in real time. Built on rata
- **metrics** — `MetricsCollector`, `MetricsSnapshot` for live telemetry
- **theme** — color palette and style definitions
- **widgets** — reusable ratatui widget components
- **error** — `TuiError` typed error enum (Io, Channel)

## Usage

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
---
source: crates/zeph-tui/src/widgets/splash.rs
assertion_line: 76
expression: output
---
┌──────────────────────────────────────────────────────────┐
Expand All @@ -15,7 +14,7 @@ expression: output
│ ███████╗███████╗██║ ██║ ██║ │
│ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═╝ │
│ │
│ v0.11.2
│ v0.11.3
│ │
│ Type a message to start. │
│ │
Expand Down
4 changes: 2 additions & 2 deletions docs/src/advanced/tui.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ When using `--connect`, the TUI renders token-by-token streaming from the remote

```text
+-------------------------------------------------------------+
| Zeph v0.11.2 | Provider: orchestrator | Model: claude-son... |
| Zeph v0.11.3 | Provider: orchestrator | Model: claude-son... |
+----------------------------------------+--------------------+
| | Skills (3/15) |
| | - setup-guide |
Expand Down Expand Up @@ -104,7 +104,7 @@ Press `Ctrl+P` in Insert mode to open the command palette. The palette provides

| Key | Action |
|-----|--------|
| Any character | Filter commands by substring match |
| Any character | Filter commands by fuzzy match |
| `Up` / `Down` | Navigate the command list |
| `Enter` | Execute selected command |
| `Backspace` | Remove last query character |
Expand Down
Loading
Loading