Quoted '*' in rc switch cases is a literal character, not a wildcard.
Replace '/cmd *' patterns with /cmd?* so rc treats them as globs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the Python raw-mode multiline hack (readmulti) with an inline
bash read -e loop using backslash continuation. Add show_new to display
the server response after /model, /agent, /backend cfg writes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- README.md: add feature summary with bulleted list
- acme: add README documenting ollie-acme and Kmpl
- el: refactor completion to shell out to u/complete
- u/complete: improve prompt and strip leaked tags
u/complete is now acme-free: reads prefix from stdin, takes -suffix,
-file, -model, -backend flags. Prints completion to stdout.
acme/scripts/Kmpl is the thin acme wrapper that extracts prefix/suffix
from the window and pipes to u/complete.
Also fixes prefix truncation bug (bash substring returning empty when
string is shorter than offset) and updates core submodule with
interrupt handling improvements.
Use deterministic session ID derived from cwd hash instead of
timestamp. Concurrent invocations for the same directory now
converge on the same session name, and the server rejects the
duplicate atomically.
- Replace per-invocation s/bfg calls with a persistent *-copilot session
looked up from s/idx; first call in a cwd spawns the session, subsequent
calls reuse it, skipping s/new overhead
- Clear context after each completion so inference stays fast
- Fix session lookup to read s/idx instead of globbing the 9P mount
- Add x/freeloader turnError hook to copilot.json
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add -model and -backend flags; read OLLIE_COMPLETE_MODEL /
OLLIE_COMPLETE_BACKEND as defaults; error if neither is set
- Guard against winid=0 (acme column tag / +Errors window)
- Document OLLIE_COMPLETE_MODEL and OLLIE_COMPLETE_BACKEND in
README.md and doc/env.sample
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds a u/complete script that reads prefix/suffix from the current acme
window via dot position, submits a fill-in-the-middle prompt to ollie
via s/bfg, and writes the completion to a new ollie/complete window.
Also adds a minimal copilot agent config (no system prompt, no tools)
for use by u/complete, and wires both into the install target in mkfile.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- scripts/x/freeloader: track tried models per-session in freeloader-tried-$SID;
walk the full sorted :free pool in order before exiting 1; write recovery
prompt to fifo.in (not prompt) to avoid goroutine race
- core submodule: 404 tool_unsupported detection + FIFO drain on error
- tui submodule: fix mid-stream newlines from backgroundTail chatOff race
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- scripts/x/freeloader: hook-driven script; intercepts rate_limit and
tool_unsupported on :free models; auto-blacklists on tool_unsupported;
cycles to next non-blacklisted free model; exits 1 for unhandled errors
- agents: add turnError hook to all agent configs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace 'task prime' hook with inline .beads walk in all agent configs —
no wrapper script needed. Drop 'prime' subcommand from scripts/x/task.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add x/elevate-adapter-start: checks if the adapter is already listening
(connect test), starts it in the background if not. Exits 0 always so it
never blocks session startup. Wire it into agentSpawn in all agent configs
and install it via mkfile.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Python adds the script directory to sys.path[0] at startup and tries to
create a FileFinder for it. When the script lives on a 9P FUSE mount the
FileFinder init fails before any stdlib import can succeed. sys is a
builtin and loads without filesystem access, so strip the path first.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Both x/elevate and elevate-adapter-superpowerd now default the socket
path to $XDG_RUNTIME_DIR/ollie/elevate.sock (falling back to
/run/user/<uid>/ollie/elevate.sock) when OLLIE_ELEVATE_SOCKET is unset.
Add OLLIE_ELEVATE_SOCKET to env sections of both sandbox configs.
Add {XDG_RUNTIME_DIR}/ollie to restricted sandbox filesystem rw rules
so x/elevate can reach the socket. Update README env block and
scripts/README socket path docs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
x/elevate is now a generic client: reads OLLIE_ELEVATE_SOCKET, sends
{cmd,cwd}, reads back {stdout,stderr,exit_code}. All backend-specific
logic moves to adapters. Add elevate-adapter-superpowerd as the
reference adapter: owns the socket lifecycle, translates the ollie
protocol to superpowerd JSON-RPC ExecuteCommand. Add OLLIE_ELEVATE_SOCKET
to env docs. Update scripts/README.md with protocol spec, adapter
setup, and guide for writing custom adapters.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The purpose is to run steps outside the Landlock sandbox, not to gain
privileges. Clarify the constraint (kernel-enforced, must reach an
external process), reframe the minimal example and superpowerd walkthrough
accordingly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sudo/doas don't work: Landlock is kernel-level and applies regardless
of user privileges within the sandboxed process. The backend must hand
the command to a process spawned outside landrun entirely. The
superpowerd Unix socket pattern is the right model.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
x/elevate handles token acquisition itself via the re-exec through
superpowers run-session when SUPERPOWERD_SESSION_TOKEN is absent.
No manual injection is needed; the paragraph was wrong.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Document the plugin interface contract (args, cwd, stdout/exit code),
plugin path resolution (OLLIE_PLUGINS_PATH / ~/.config/ollie/scripts/x/),
a minimal exec-only example, a step-by-step walkthrough of the default
superpowerd implementation including session token injection, and custom
backend examples (sudo, doas, disable).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add x/ to the namespace list and add an x/elevate section describing
its role as the elevation plugin for execute_code elevated steps, the
calling convention, the default superpowerd implementation, and how to
replace or disable it.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Batch and session namespaces are now a single s/ concept. s/bfg blocks
until the agent finishes and writes to stdout; s/bbg returns immediately
and prints the session path. s/b is the core one-shot runner. Remove all
b/ references from README, USAGE, ARCHITECTURE, and scripts/README.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
FUSE entry cache may not reflect the new session directory immediately
after the write to s/new returns. Poll until it appears, mirroring the
approach in s/sh.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bash's printf builtin issues one write() syscall per call; the server
processes each write independently, so the first write (name= only)
would fail the cwd-required check. Build the full KV string first,
then write once.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Batch jobs were a front-end concern. All one-shot query workflows now
compose session primitives via s/b (engine), s/bfg (foreground), and
s/bbg (background). Parallel execution is a shell loop.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
tui/session: IsIdle reads spec and parses state= key.
scripts/s/sh, sh.rc: add spec_get helper; is_idle, /cwd, /model,
/agent, /backend read via spec_get; writes go to spec as key=value.
el/ellie.el: ellie--state reads spec with string-match on state=.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Option C implementation: single namespace with composable file tables.
Batch jobs are sessions with a reduced file set — the directory
contents declare the capability.
- core: SessionStore absorbs BatchStore; s/new detects batch format
- 9p: /b/ removed entirely; all routing through /s/
- scripts/b/* moved to scripts/s/*; paths updated
- subagent_spawn, optimize: /b/q -> /s/q
- scripts/b/ removed
Simplify the script to fix the timing/display problem where LLM responses
weren't shown in real-time and user typing wasn't echoed properly.
The fix:
1. Block on statewait file until agent leaves idle state
2. Stream chat output in loop while agent is not idle
3. Use simple tail -c +offset to read new chat content
4. Remove complex buffering logic and background processes
This resolves the issue where assistant responses would appear one prompt
late and user typing wasn't visible during LLM response generation.
b/job now blocks on statewait instead of polling; b/cleanup reads state.
Update all documentation references. Bump 9p submodule.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove Go template syntax from all prompt files (converted to envsubst
variables in prior commits). Agent agentSpawn hooks now call prime for
each prompt file explicitly, replacing the automatic Go-based directory
scan. coding agent gets 08_tool-elevate; default does not.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
prime <name> prints $OLLIE/p/<name>[.md] to stdout, which the agentSpawn
hook captures as context. Allows agent prompt composition to be driven
entirely from hook config rather than built-in Go code.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Submodules have .git as a file, not a directory. -d was stopping the
walk immediately in submodule directories.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Walk up from CWD only while .git exists at each level. Stops at the
first directory without .git, preventing false positives outside the repo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The bd wrapper walks up from CWD to find a .beads directory and sets
BEADS_DIR, so bd works from any subdirectory of a monorepo without the
model needing to know about it.
The execute server now always prepends $OLLIE/x/ to PATH for tool
subprocesses, so wrappers placed there shadow system binaries transparently.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>