ollie is a 9p-based generative agent surface
Go to file
Levi Neely d41eea54f1 cleanup agents 2026-04-14 19:38:03 +02:00
9p@dfd7dc2ef3 update submodules: tmpdir lifecycle owned by core 2026-04-14 19:30:32 +02:00
agents cleanup agents 2026-04-14 19:38:03 +02:00
core@ee82ac7181 update core submodule: ! commands run in session cwd 2026-04-14 19:35:27 +02:00
doc update submodules and tools: consistent memory path, sandbox RWX 2026-04-14 16:16:00 +02:00
el@30b11c3a6a update el submodule: ollie-show-system-prompt 2026-04-14 19:21:36 +02:00
prompts update submodules; document s/{id}/systemprompt in base prompt 2026-04-14 19:17:10 +02:00
sandbox rename OLLIE_9MOUNT → OLLIE throughout; update submodules 2026-04-14 17:39:48 +02:00
skills@e7464dd0c9 prompts: split SYSTEM_PROMPT.md into ordered p/ parts 2026-04-14 19:15:25 +02:00
tools tools: clear usage messages on all tools when called with no/bad args 2026-04-14 18:21:35 +02:00
toys rename workdir to cwd in docs, toys, and submodule refs 2026-04-13 15:51:58 +02:00
tui@19bbfac1dc update tui submodule: /sp command 2026-04-14 19:20:34 +02:00
.gitmodules submodules: add agent-skills 2026-04-11 16:13:47 +02:00
README.md readme: add env configuration section; update core submodule ref 2026-04-14 08:48:07 +02:00
mkfile mkfile: update help text to mention tools 2026-04-14 09:02:32 +02:00

README.md

ollie

What happens if agent primitives are exposed as an ordinary filesystem? How much can be subtracted from AI agent implementations without reducing their usefulness? These are some of the motivating questions behind ollie.

  • The core system provides a public library of AI agent primitives.
  • The 9p filesystem server (Go) creates a virtual filesystem exposing the important state and behaviors as ordinary files and operations.
  • A reference TUI implementation proves that it is possible to build a functioning and user-friendly terminal front-end using only the Go standard library.
  • And, just because I like my Emacs friends, a reference Emacs interface front-end implementation.

Project Structure

  • core/:
  • tui/:
  • 9p/:
  • el/:

Getting Started

Clone with submodules:

git clone --recurse-submodules https://github.com/lneely/ollie.git

Or after cloning:

git submodule update --init --recursive

Building

Build everything from the monorepo root:

mk

Or build specific components:

mk core    # Build core library
mk tui     # Build terminal UI
mk 9p      # Build 9p filesystem server

For Emacs Lisp, copy el/ollie.el into your own Emacs configuration directory, and:

(require 'ollie)

Configuration

Environment: ~/.config/ollie/env

OLLIE_BACKEND=openai           # ollama | openai | openrouter | 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_TOOLS_PATH=~/.config/ollie/tools    # directory for execute_tool scripts
OLLIE_MEMORY_PATH=~/.config/ollie/memory  # directory for memory files (ollie/m)

Shell environment variables take precedence over the env file.

Development

Update all submodules to latest:

git submodule update --remote

Observed Benefits

Filesystem as interface — if you know how to operate a filesystem, you know how to operate ollie. Rename a session → mv the session directory. Start a new session → open s/new, fill in the fields, save. Prompt the agent → write your prompt to s/{id}/prompt. Check status → cat s/{id}/state. Any tool that reads and writes files — shell scripts, ed, a GUI file manager, vim, Python, even cat and echo — is already a fully capable ollie client. No SDK, no API, no protocol to learn.

Simple front-ends — building a front-end is just reading and writing files. A TUI reads chat, writes prompt, polls state. A web UI does the same over a thin bridge. An Emacs mode opens files it already knows how to edit. The protocol surface is zero because the protocol is the filesystem.

Crash resiliency — reasoning_plan persists plans to the ollie/pl filesystem by default. If a session crashes or is killed mid-task, recovery is trivial: point a fresh session at the plan that was being executed. The agent's prompting already tells it how to discover plans in pl/, so it can resume cold — reading the plan, seeing which steps are done and which aren't, and picking up where the previous session left off. No context replay, no manual re-prompting, no lost work.

Credits

Many sources of inspiration:

  • 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, and other nifty ideas
  • @aws — for a solid open-source agent implementation

License

GPLv3