All tool logic lives in the multicall main.go at each family root.
Move .meta files to data/tools/ (single canonical location).
Expand test-core to cover all tools.
Moves package lsp and cmdutil under tools/lsp/internal/ so the
multicall binary can live at tools/lsp/main.go — same layout as
codeintel and filetools.
- Multicall pattern for tool families: one binary per family with
symlinks for each tool name. Reduces tools dir from 156MB to 31MB.
codeintel (6 tools), filetools (5 tools), lsptools (7 tools).
- Build with -ldflags="-s -w" to strip debug symbols.
- Fix Landlock EINVAL on regular files: filter directory-only access
rights (READ_DIR, MAKE_*, REMOVE_*) when adding rules for non-
directory paths.
- Fix toolsrv CWD initialization: pass --cwd flag value to server
state at startup so {CWD} in sandbox.yaml expands correctly.
Rename ToolInfo.ReadOnly bool → ToolInfo.Scope string with three values:
- "read" — path-scoped read, never conflicts (always parallel)
- "write" — path-scoped write, conflicts on same file path only
- "global" — full serialization barrier, runs alone
Tools declare scope in their .meta file. If unset, inferred from path
arg presence (write if path exists, global otherwise).
This correctly classifies lsp_rename as global (cross-file workspace
edits) despite having a path argument. The path arg in lsp_rename is
a symbol coordinate, not a resource scope.
All .meta files updated: readOnly:true → scope:read,
readOnly:false → scope:global, lsp_rename gets scope:global.
Each lsp_*.meta now lives in tools/lsp/cmd/<name>/ alongside
main.go, rather than in data/tools/. The lsp-tools just target
was updated to install both the binary and its .meta sidecar.
AGENTS.md updated to document the pattern for compiled tools.
With the zero-tools transition complete, the tools/builtin/ package
served no purpose — Builtins() returned nil. Removed:
- tools/builtin/builtins.go and the directory
- builtins field, WithBuiltins, Dispatch from toolsrv.Server
- Handler type from toolsrv (only used by builtins)
- OnPreDispatch/WithOnPreDispatch (dead code)
- Strict field and WithStrict (dead code, never read)
- CallTool simplified — no fallback to Dispatch
- builtin import and WithBuiltins/WithStrict calls from ollie-remote
- tools/builtin from justfile build/test targets
Updated AGENTS.md, ARCHITECTURE.md, README.md, EVOLUTION.md
skill_list and skill_load are now external shell scripts (data/tools/).
Removed from builtins: SkillList, SkillLoad, SkillActive.
Removed: toolsrv/skills.go, tools/builtin/skill.go, WithSkillsRegistry,
SkillsRegistry accessor, ListSkillsTools.
ollie-remote no longer initializes a skills registry.
The demarcation: built-ins mutate agent internals (tool schema, context
injection). Skills are just file reads — no special treatment needed.
Binaries now read path/line/col (matching the .meta schema the model
sees) instead of file/line/character. Also fix col to be 1-indexed
(matching the schema description) with proper -1 conversion to LSP
0-indexed protocol.
All tools now receive arguments as a JSON object on stdin instead of
positional CLI args. Each tool declares its schema via # args_json:
header comment.
New shared helpers:
- _lib/args.py: Python parse_args() -> Args with require/get/get_bool/etc
- _lib/args.sh: Bash arg_require/arg_get/arg_bool via jq
Removed denote_view (unused).
Updated WRITING_TOOLS.md to document the new contract.
All tools in ./tools/ now output a JSON schema when arguments fail
to parse, instead of raw usage strings. Formats handled:
- echo/print usage replacement
- dollar-brace-var-colon-? usage expansion to if-statements
- die() function replacement
- argparse ArgumentParser subclass with error() override
Deleted env (use shell instead) and grep (use file_grep instead).
Removed root-level /tools from 9P filesystem listing.
- prompts/session-9p.md: all operations use `9p` commands
- LSP tools: sys.path from $OLLIE_TOOLS_PATH (no mount needed)
- 9p: removed auto-mount + OLLIE= env var from sessions
Agents now use the standalone 9p client binary for all 9P access.
Mounts remain available for human convenience but are not required.
The D-Bus adapter only exposed 4 parameters (cwd, backend, model, agent)
but the session manager supports 6 (+ system_prompt, remote). The remote
had already added system_prompt as the 5th; this adds remote as the 6th.
All frontends (KDE plasmoid, Kate, tray, dolphin, webui, httpgw) and
tool scripts now pass the correct 6 arguments.
Complete migration: process_*, route, subagent_*, env, grep,
image_read, gui_*, browser_screencap, denote_view.
Every tool script now self-documents its usage. BuildRuntime
automatically extracts and injects these into the system prompt.
Migrate usage documentation from separate tools-*.md prompt files
into the tool scripts themselves via ollie:prompt...ollie:end blocks.
BuildRuntime automatically extracts and appends these to the preamble.
Migrated: file_read, file_write, file_edit, file_glob, file_grep,
lsp_definition, lsp_references, lsp_hover, lsp_rename, lsp_symbols,
lsp_diagnostics, lsp_completion, reasoning_think, memory_remember,
memory_recall.
Usage documentation is now embedded in the script header and
automatically extracted into the system prompt by BuildRuntime.
This replaces the corresponding section in tools-file.md.
Replace Makefile/mkfile with justfile (just command runner).
Move tools from kde/tools to root (uses physical paths, not 9P).
Add process_*, env, grep tools that were missing from submodules.
just: 9P path (default), just dbus: D-Bus path.
- prompts/, skills/, tools/ removed from monorepo root
- 9p/: gains prompts/skills/tools with 9P filesystem API (unchanged)
- kde/: gains prompts/skills/tools rewritten for D-Bus API
- mkfile: data target no longer installs prompts/skills/tools
- 9p/mkfile: install target now includes data (prompts/skills/tools)
- kde/Makefile: all target now includes data (prompts/skills/tools)
- SYSTEM_PROMPT_QWEN and SYSTEM_PROMPT_DEVSTRAL updated in both
submodules to include the operational world model
Bash builtin echo/printf may split multi-line content across
multiple write syscalls, which the FUSE 9P proxy rejects.
/bin/echo (coreutils) does a single write.
- Resolves model from OLLIE_TIER_{WORKER|EXPERT}_{backend}
- Falls back to legacy OLLIE_CASCADE_MODEL/OLLIE_ESCALATE_MODEL
- --backend flag lets orchestrator pick a different backend
- Inherits parent session's backend by default
- OLLIE_ENABLED_BACKENDS documents available backends
- README updated with tier config examples