ollie is a 9p-based generative agent surface
Go to file
Levi Neely 44592065d8 fix: respect agent-provided timeout and sandbox params in callPromotedTool
callPromotedTool was hardcoding timeout=30 and sandbox="default" for all
promoted tool executions, ignoring the timeout and sandbox parameters
provided by the agent in tool call args. Extract these from the JSON args
map (same pattern as elevated) and pass them through to the execution
functions.
2026-08-06 11:17:10 +02:00
agent Good idea fairy cleanup: ~960 lines removed 2026-08-05 21:51:55 +02:00
backend Good idea fairy cleanup: ~960 lines removed 2026-08-05 21:51:55 +02:00
cmd Good idea fairy cleanup: ~960 lines removed 2026-08-05 21:51:55 +02:00
contrib/elisp ellie: point preservation, stale-stream guard, block-headers, keybinding polish, and doc screenshot 2026-08-04 20:59:23 +02:00
data Good idea fairy cleanup: ~960 lines removed 2026-08-05 21:51:55 +02:00
detach Good idea fairy cleanup: ~960 lines removed 2026-08-05 21:51:55 +02:00
doc Remove OLLIE_TIER_* from env.sample 2026-08-05 19:45:45 +02:00
elevate elevate: broker credential support for privileged tool execution 2026-07-30 23:37:57 +02:00
env Remove OLLIE_ELEVATE_SOCKET from config: derived from XDG_RUNTIME_DIR convention 2026-08-05 19:43:52 +02:00
fs Good idea fairy cleanup: ~960 lines removed 2026-08-05 21:51:55 +02:00
fsedsl fsedsl: simplify README usage section 2026-08-04 12:48:39 +02:00
kde@9a1704d728 Update kde submodule: remove D-Bus mentions 2026-08-05 19:01:37 +02:00
lib9p lib9p: remove test.c (confuses cgo) 2026-08-03 20:05:48 +02:00
log flatten: absorb submodules into single Go module 2026-07-30 18:57:51 +02:00
paths flatten: absorb submodules into single Go module 2026-07-30 18:57:51 +02:00
prompts Remove tool_active/skill_active references from system prompts and core.md 2026-08-05 19:40:21 +02:00
sandbox multiplex toolsrv, wip zero-tool server 2026-08-02 19:18:39 +02:00
session Remove OLLIE_*_PATH env vars: paths follow ~/.config/ollie/ convention 2026-08-05 19:37:13 +02:00
skills Remove OLLIE_*_PATH env vars: paths follow ~/.config/ollie/ convention 2026-08-05 19:37:13 +02:00
tools/lsp move LSP .meta files to live alongside their Go code 2026-08-03 01:03:27 +02:00
toolsrv fix: respect agent-provided timeout and sandbox params in callPromotedTool 2026-08-06 11:17:10 +02:00
.gitignore Prefix binary entries with / in .gitignore for consistency 2026-08-05 19:49:10 +02:00
.gitmodules remove httpgw and webui; update AGENTS.md to reflect current structure 2026-07-30 20:19:32 +02:00
.plan.md Good idea fairy cleanup: ~960 lines removed 2026-08-05 21:51:55 +02:00
AGENTS.md Remove dead OLLIE_ENABLED_BACKENDS from docs 2026-08-05 19:45:13 +02:00
Containerfile add remote access via TCP: Containerfile, mount subcommand, docs 2026-04-16 23:32:37 +02:00
README.md Remove dead OLLIE_ENABLED_BACKENDS from docs 2026-08-05 19:45:13 +02:00
go.mod Extract EDSL to fsedsl/ library 2026-08-04 12:02:32 +02:00
go.sum Revert "remove dead mount/ package and olliesrv mount subcommand" 2026-07-30 21:19:11 +02:00
justfile Good idea fairy cleanup: ~960 lines removed 2026-08-05 21:51:55 +02:00
pull.sh pull.sh: update for flattened repo (only . kde webui remain) 2026-07-30 19:42:21 +02:00

README.md

ollie

Ollie is an AI agent runtime. A single binary (olliesrv) exposes agent sessions over a single surface: a 9P2000 filesystem. The core is deliberately minimal; capabilities come from composing small pieces — tool executables, skill files, metadata sidecars — rather than building a monolithic framework.

Building

git clone --recurse-submodules https://git.lneely.de/lkn/ollie.git
cd ollie
just

Requires just:

cargo install just

See doc/usage.md for usage instructions.

Configuration

Environment: ~/.config/ollie/env

OLLIE_BACKEND=openai           # ollama | openai | anthropic | copilot | kiro (default: ollama)
OLLIE_OLLAMA_URL=              # base URL for Ollama (default: http://localhost:11434)
OLLIE_OPENAI_URL=https://openrouter.ai/api
OLLIE_OPENAI_KEY=sk-or-...
OLLIE_ANTHROPIC_KEY=sk-ant-...
OLLIE_COPILOT_TOKEN=...
OLLIE_KIRO_TOKEN=...           # bearer token or sqlite:// path (auto-detected from Kiro CLI if unset)
OLLIE_MODEL=qwen/qwen3-235b-a22b
OLLIE_COMPLETE_BACKEND=ollama             # backend for code completion
OLLIE_COMPLETE_MODEL=qwen3:latest         # model for code completion
OLLIE_ROUTE_BACKEND=ollama               # backend for the /route classifier
OLLIE_ROUTE_MODEL=qwen3:8b               # model for task routing

Everything lives under ~/.config/ollie/ by convention — tools in tools/, memory in memory/, agents in agents/, prompts in prompts/, skills in skills/. Shell environment variables take precedence over the env file.

What you can do

Capability How
CLI o — unified namespace CLI with read, write, readloop, ls, ctl, prompt, tail, env, stop, kill
Terminal TUI o tui — tmux + two shell commands, no widgets
One-shot LLM o generate "explain monads" or echo "prompt" | o generate
Code completion o complete '{"file":"main.go","prefix":"func "}' or echo '{"file":"..."}' | o complete
Task routing o route "implement login" or echo "task" | o route → backend=X model=Y
Run an agent Create a session + agent via 9P — then connect with any frontend (ellie, KDE (GUI/KRunner/Kate), o tui)
Remote execution Set remote=user@host in session config
Agents Write a JSON config in data/agents/ with agent prompt in data/prompts/
Tools Drop an executable + .meta in ~/.config/ollie/tools/ — then load at runtime via tool_load
Domain skills Load markdown skill modules at runtime

Repository layout

Single Go module with one Git submodule (kde).

Directory Language Description
agent/ Go Agent loop, history, hooks, prompt resolution, commands
backend/ Go LLM providers (Anthropic, OpenAI, Ollama, Gemini, Copilot, CodeWhisperer)
toolsrv/ Go Tool server, dynamic tool dispatch, sandboxed execution, remote execution
tools/lsp/ Go LSP bridge daemon + client library (gopls, clangd, intelephense)
session/ Go Session lifecycle, config, persistence
fs/ Go 9P filesystem tree for session namespace
detach/ Go Background process management
elevate/ Go Elevation broker (privilege escalation)
sandbox/ Go Landlock sandbox config
cmd/olliesrv/ Go The main binary
cmd/ollie-9p/ Go 9P client
cmd/ollie-remote/ Go Remote execution binary
kde/ C++/Qt6 KDE plasmoid, GUI, Kate plugin, KRunner (submodule)
data/agents/ JSON Agent configs
data/prompts/ Markdown System prompt templates
data/tools/ Mixed Tool executables (scripts + compiled) + .meta sidecar files
data/skills/ Markdown Domain knowledge modules
doc/ Markdown Architecture docs, usage guide

Architecture

graph TB
    subgraph Frontends
        ACME[Plan 9 acme]
        EMACS[Emacs<br>ellie.el]
        KDE[KDE<br>GUI / Kate / KRunner]
    end

    subgraph "olliesrv"
        P9[9P Filesystem<br>session/ namespace]
        SM[Session Manager]
        AG[agent.Agent<br>loop · compaction<br>prompt templates]
        ROUTE[Router<br>complete · generate · route]
        TOOLS[toolsrv.Server<br>dynamic dispatch · sandbox]
    end

    subgraph "LLM Backends"
        OLL[Ollama]
        OAI[OpenAI / OpenRouter]
        ANT[Anthropic]
        COP[Copilot]
        KIRO[Kiro]
    end

    subgraph Execution
        LOCAL[Tool Scripts<br>loaded via 9P write<br>· shell, reasoning_think<br>· file_*, lsp_*, memory_*<br>· gui_*, subagent_*]
        REMOTE[ollie-remote<br>via SSH · no embedded tools]
    end

    ACME & EMACS & KDE --> P9
    P9 --> SM
    SM --> AG
    AG --> ROUTE
    AG --> TOOLS

    AG -->|streaming| OLL & OAI & ANT & COP & KIRO

    TOOLS --> LOCAL
    TOOLS -->|SSH| REMOTE

olliesrv exposes the agent runtime over a single surface: a 9P2000 filesystem. KDE GUI, Kate plugin, and KRunner all use 9P internally. For a deep dive into the filesystem, see doc/resources/9p.md.

Credits

  • Plan 9 from Bell Labs — for an interesting system
  • @9fans — for the Plan 9 port
  • Suckless — for articulating good software development principles
  • @simonfxr — for a solid agent baseline to "borrow" from
  • @aws — for a solid open-source agent implementation

License

GPLv3