Releases: weirdstuff-dev/openheim
v0.3.0
What's new in v0.3.0
Security controls
Two new controls let you lock down what the agent can touch:
- Work-directory sandbox (
work_dir) —read_fileandwrite_fileare restricted to a directory tree. Symlinks are canonicalized so they can't escape the boundary. Defaults to the directory openheim was invoked from. - Shell access control (
allow_shell) — set tofalseto removeexecute_commandfrom the tool list entirely. The LLM never sees it and cannot request it.
Both are configurable in config.toml and as builder methods (.work_dir(path) / .allow_shell(bool)) for programmatic embeddings.
System identity
~/.openheim/system.md defines the agent's base identity and is injected into every session's system prompt. openheim init creates a default file. The prompt is now structured: identity block first, then skills, separated by clear section headers.
Default skills
A new default_skills array in config.toml auto-loads skills into every session — no need to pass --skills each time. Per-session skills are merged on top with duplicates removed.
Cross-compilation
Cross.toml added for building Linux targets from macOS.
Fixes
- MCP subprocess stderr no longer leaks into the terminal
openheim runnow exits cleanly after a headless prompt completesmerge_skillsdeduplicates within thedefault_skillslist itself- Leading/trailing whitespace in
system.mdis preserved openheim initcorrectly reportssystem.mdcreation status when config already exists
Breaking changes (library users)
AppConfiggained two new public fields:work_dir: Option<PathBuf>andallow_shell: bool. Struct-literal construction must supply these fields. TOML loading is unaffected (both have serde defaults).SystemToolExecutor::buildtakes an additionalallow_shell: boolargument.
v0.2.1
v0.2.0
openheim 0.2.0
Highlights
New TUI built on ratatui
The terminal interface has been rewritten from scratch on ratatui. The result is a much faster, more responsive UI with proper event handling. Key additions:
- Interactive pickers for sessions, models, and commands — navigate with arrow keys, select with Enter, no more typing IDs.
:modelscommand — switch provider and model mid-session from an inline popup.- Themes — choose a colour theme with
:theme; the default is nowgray. - Info panels relocated to the prompt area so they no longer overlap the message list.
TerminalGuardensures the terminal is restored cleanly on panic or forced quit.
Token streaming and thinking blocks
All four LLM backends (Anthropic, OpenAI, Gemini, OpenAI-compatible) now stream tokens in real time and surface extended thinking blocks as they arrive. Previously, responses were buffered and displayed in one shot.
ACP: session/set_model
ACP clients can now call session/set_model to switch the model during an active session. The thinking convention is advertised in session metadata so clients can negotiate capabilities up front.
Bug fixes
| Area | Fix |
|---|---|
| MCP | Child server processes are killed when the client is dropped, preventing zombie processes |
| LLM / SSE | Fixed SSE buffer reallocation that silently dropped streamed tokens |
| LLM | JSON serialization errors now propagate instead of producing empty output |
| Sessions | Restoring a session from history now sets it as active and clears stale state |
| ACP | Session load now resolves the full provider config, not a partial view |
| ACP | acp_prompt resolves the per-session LLM client correctly |
| Model switch | UI now shows the full (provider, model) pair after switching |
| Provider resolution | Model-whitelist is enforced in resolve_with_provider |
| Session restore | Warning emitted when restored session references an unconfigured provider |
| TUI | Long messages now wrap correctly in the viewport |
| Tools | Execution errors are captured and reported rather than silently dropped |
| TUI | ToolResult errors rendered in red; default theme corrected from dark_gray to gray |
Upgrade
cargo install openheim --version 0.2.0Or pin in Cargo.toml:
[dependencies]
openheim = "0.2.0"v0.1.1
Fixed
- Tool call history gaps — ACP sessions were silently dropping tool calls from stored history; all tool calls are now captured correctly.
- Accurate status on replay — Replayed tool calls now emit
InProgressbefore resolving, matching the behaviour of live sessions. - Failed tool calls now surface as
Failed— Previously, tool failures were stored as plain text and replayed asCompleted. Theis_errorflag is now persisted inMessageand propagated throughStreamEvent::ToolResultso both live and replayed paths emitToolCallStatus::Failed. - Tool error logging — Improved logging for tool call errors.
Improved
- LLM accuracy on failures —
is_erroris forwarded to Anthropic'stool_resultblock, giving the model accurate signal when a tool has failed. - Added
CHANGELOG.md. - Updated documentation for
is_errorand tool call history replay semantics.
openheim — a fast, multi-provider LLM agent
What's included
- Multi-provider support — OpenAI, Anthropic, Gemini, and any OpenAI-compatible endpoint
- MCP integration — connect external tools via Model Context Protocol (stdio and HTTP transports)
- ACP server — expose the agent over the Agent Client Protocol with WebSocket streaming
- Tool execution — built-in filesystem, shell, and extensible tool framework
- Conversation history — persistent sessions with RAG context and skill injection
- Interactive REPL — terminal UI for local development
- Headless / programmatic mode — embed openheim as a library in your own Rust application
Install
cargo install openheimOr add as a library:
[dependencies]
openheim = "0.1.0"See the README for configuration and usage.