diff --git a/README.md b/README.md index b2e9d79..c5dbe04 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,7 @@ Monorepo with Git submodules. Each submodule has its own Go module (except `el` - **Sandboxed execution** — every tool call and every `shell` command runs inside a Landlock sandbox with per-profile filesystem access rules. Promoted tools are not exempt — they execute through the same sandbox path as inline shell commands. - **Extensible tools** — tools are executable scripts with header metadata; add one by dropping a file in a directory -- **Lazy-loading tool registry** — all tools are discoverable; only loaded tools are callable. Write a tool name to `s/{sid}/tools` to promote it to a native callable function — no MCP server, no SDK, no protocol boilerplate +- **Dynamic tool registry** — tools are discoverable and hot-reloadable; add, modify, or remove tool scripts at any time without restarting the server. Only loaded tools are callable. Write a tool name to `s/{sid}/tools` to promote it to a native callable function — no MCP server, no SDK, no protocol boilerplate - **Elevation** — commands that need to escape the sandbox can request elevation through a streaming protocol (frame-based, over unix socket) ### Agents @@ -200,7 +200,7 @@ graph TB SM[Session Manager] CORE[Core Library
agent loop · compaction
prompt templates] ROUTE[Router
complete · generate · route] - TOOLS[Tool Registry
lazy-load · dispatch] + TOOLS[Tool Registry
dynamic · lazy-load · dispatch] SB[Landlock Sandbox] end @@ -390,12 +390,12 @@ The D-Bus interface is what makes native desktop integration possible: All of these talk to `org.ollie.SessionManager` over D-Bus using Qt's native bindings — no IPC glue code, no subprocess management. -### Tool registry: lazy-loading native tools +### Tool registry: dynamic native tools -Tools are scripts in `~/.config/ollie/tools/`. Write one, add a JSON schema header, and it's **discoverable** immediately. But it's only **callable** when you promote it into your session. +Tools are scripts in `~/.config/ollie/tools/`. Write one, add a JSON schema header, and it's **discoverable** immediately — no server restart needed. Add, modify, or remove tools at any time; the registry re-reads from disk on every `tool_list` and `tool_load`. A tool is only **callable** when you promote it into your session. ```bash -# Discover all available tools +# Discover all available tools (always reflects current directory contents) cat s/{sid}/tools # Load one into your session — it becomes a native callable function diff --git a/doc/EVOLUTION.md b/doc/EVOLUTION.md index b73b1fc..25792cf 100644 --- a/doc/EVOLUTION.md +++ b/doc/EVOLUTION.md @@ -78,7 +78,7 @@ Tools evolved through several incarnations: 2. **Shell/Python scripts** in `~/.config/ollie/tools/` — lightweight, sandboxed 3. **execute_code** as the single built-in tool — all scripts invoked through it 4. **call_tool/pipe** — named tool dispatch and cross-tool pipelines -5. **Tool registry** (final form) — lazy-loading via `tool_list`/`tool_load`/`tool_active`; `execute_code` renamed to `shell` +5. **Tool registry** (final form) — dynamic lazy-loading via `tool_list`/`tool_load`/`tool_active`; `execute_code` renamed to `shell`; tools hot-reloadable without server restart The file tools (`file_read`, `file_write`, `file_edit`, `file_grep`, `file_glob`) were extracted into standalone Python scripts. Memory (`memory_remember`, diff --git a/doc/OBSERVATIONS.md b/doc/OBSERVATIONS.md index b13fc84..ae9060a 100644 --- a/doc/OBSERVATIONS.md +++ b/doc/OBSERVATIONS.md @@ -6,7 +6,7 @@ **Crash resiliency** — Memory (`m/`) is written to persistent storage outside the session. If a session crashes or is killed mid-task, it is not lost — a fresh session picks up where the previous one left off. -**Lazy tool loading** — After transitioning from `execute_code`/`call_tool`/`pipe` to a unified `shell` primitive, ollie adopted a lazy loading architecture. The system has 7 primitives: `shell` (sandboxed), `tool_load`/`tool_list`/`tool_active`, `skill_load`/`skill_list`/`skill_active`, plus associated 9P filesystem endpoints. Tools are executable scripts discovered from `OLLIE_TOOLS_PATH`; skills are `SKILL.md` directories discovered from `OLLIE_SKILLS_PATH`. Both use session-scoped registries with per-session load tracking. The agent autonomously loads tools and skills as needed — no explicit user permission required. +**Dynamic tool loading** — After transitioning from `execute_code`/`call_tool`/`pipe` to a unified `shell` primitive, ollie adopted a dynamic lazy-loading architecture. The system has 7 primitives: `shell` (sandboxed), `tool_load`/`tool_list`/`tool_active`, `skill_load`/`skill_list`/`skill_active`, plus associated 9P filesystem endpoints. Tools are executable scripts discovered from `OLLIE_TOOLS_PATH`; skills are `SKILL.md` directories discovered from `OLLIE_SKILLS_PATH`. Both use session-scoped registries with per-session load tracking and dynamic discovery — tools and skills can be added, modified, or removed at any time without restarting the server. The agent autonomously loads tools and skills as needed — no explicit user permission required. **Both shell and tools are sandboxed** — Promoted tools are not exempt from sandboxing. They execute through the same `executeWithStdin` path as inline `shell` commands, running inside a Landlock sandbox with the same per-profile filesystem access rules. The sandbox applies to every code path that touches user data — there is no bypass by loading a tool.