Replaces /tmp/ollie per-session scratch space with a 9P-served tmp/
directory backed by OLLIE_TMP_PATH (~/.local/share/ollie/tmp by default).
Markers are now global, hash-addressed by absolute file path, and shared
across all sessions. OLLIE_TMP_PATH is always set by ensureEnv().
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
flags after the subcommand (e.g. start -tcp :564) were silently ignored
because flag.Parse() stopped at the first non-flag argument. parse
os.Args[2:] after extracting the subcommand from os.Args[1].
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- -tcp <addr> flag on start/fgstart listens on TCP in addition to the Unix socket
- mount <address> [mountpoint] mounts a remote olliesrv namespace locally via 9pfuse
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Capture chatOffset after the user event is appended rather than
before Submit, so tail -c +$((offset+1)) yields only the model
response for that turn.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Records the byte position of chat EOF immediately before each prompt
is submitted. Clients can read offset after a turn completes and use
tail -c +$((offset+1)) to extract just the new output without needing
a dedicated reply file.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
On failure, result is empty and only status carries the error.
Callers (subagent_spawn, oq) now always have a useful value in
result regardless of success or failure.
executeJob was only capturing 'assistant' events from core.Submit.
Backend errors emit an 'error' event that was silently dropped,
causing jobs with nonexistent models to show status=done with empty
result instead of status=failed.
- Add b/ to filesystem layout (job spec, status, result, usage, ctxsz)
- Add BatchStore to backing stores table
- Add Batch jobs section with submit/poll/remove examples and oq reference
- Remove s/{id}/reply from layout
Introduces b/ as a first-class 9P namespace alongside s/. Writing to
b/new creates one or more ephemeral agent jobs (parallel=N suffix -0..-N)
each running the same prompt in an independent agentCore with no
persistent session state.
Per-job files: spec, status, result, usage, ctxsz.
BatchStore/BatchJobStore mirror SessionStore/SessionFileStore.
rm -r b/{id} cancels and removes the job.
Also removes s/{id}/reply: b/{id}/result is the purpose-built
replacement for one-shot prompt->reply use cases.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ensure all OLLIE_* path env vars (OLLIE, OLLIE_TOOLS_PATH,
OLLIE_SKILLS_PATH, OLLIE_PLAN_PATH, OLLIE_MEMORY_PATH) are set
to their default values via os.Setenv before the server or any
session is created. This guarantees they are visible to tool
subprocesses without requiring explicit external configuration.
makeStat was reporting Length=0 for /s/new, /s/idx, /backends, /help,
and all store-backed files (/a/*, /p/*, /sk/*, /t/*). Clients that
check stat before reading (cat, 9pfuse) saw an empty file and never
issued Tread.
Also adds debug logging (OLLIE_9P_DEBUG=1) across all 9P operations,
tagged with "9p:" prefix.
rm -r first unlinks each synthetic file in s/{id}/ before removing the
directory. The remove handler was passing the file basename to
SessionStore.Delete, which failed with "session not found".
Treat /s/{id}/{file} removes as no-ops so rm -r can proceed to the
directory removal, which triggers the actual session kill.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All /s/ directory operations now route through SessionStore:
- pathType uses sessionStore.Stat for /s/{name} entries
- readDir uses sessionStore.List for /s/ listing
- wstat uses sessionStore.Rename for session renames
- read/write/remove for /s/new and /s/{id} already updated
README.md changes excluded (unrelated to store work).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add ReadableStore, WritableStore, ReadWriteStore, BlobStore, and Store
interfaces with FlatDirStore as the default filesystem-backed implementation.
Each 9P directory endpoint is now backed by a named store:
/a/ agentStore (Store - FlatDirStore)
/p/ promptStore (ReadableStore - FlatDirStore)
/m/ memStore (Store - FlatDirStore)
/pl/ planStore (Store - FlatDirStore)
/t/ toolStore (Store - ToolStore, synthetic idx)
/sk/ skillStore (Store - SkillStore, wraps skills package)
/s/{id}/ per-session (ReadWriteStore - SessionFileStore, in-memory)
Swapping a backend (e.g. /m/ to a vector store, /pl/ to beads) now requires
only a new Store implementation — no changes to the 9P server logic.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Create handler initializes an empty file in memDir; write handler
(called from clunk) writes the full content to disk. Removes
temporary debug logging.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add explicit idx check in pathType() before the os.Stat fallback,
add idx entry to /t directory listing with mode 0444, and set
/t/idx stat mode to 0444. The read handler already generated live
content from tool headers — only the routing was broken.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove file.Decl and reasoning.Decl from dispatcher
- go mod tidy: drop go-udiff dependency
- Initialize /tmp/ollie/$sessID on session create (rm -rf + mkdir)
- Rename /tmp/ollie/$oldID -> $newID on session rename
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Both are generated on read from current state — no physical files.
t/idx scans ToolsPath() headers; sk/idx uses skills.List().
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sk/idx is written by rebuildSkillsIdx() at session start but was
invisible via 9P since sk/ reads go through skills.Read() which only
knows skill directories. Add explicit handling in pathType, read, stat,
and directory listing — same pattern as s/idx.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Synthetic read-only file at ollie/s/idx. Each line is tab-separated:
{id} {state} {cwd} {backend} {model}
Generated on demand from live session state so it's always current.
Enables agents to discover peers by cwd or name without polling
individual session files.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
OLLIE_MEMORY_PATH and OLLIE_PLAN_PATH are now configured via sandbox
yaml overlays rather than injected at session creation. Remove the
SetEnv calls so the sandbox can pick them up from the environment if
the user has set them.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Wire /m as a read-write directory that maps to s.memDir
(OLLIE_MEMORY_PATH or ~/.local/share/ollie/memory). Handles
fileType, create, read, write, rename, remove, stat, and directory
listing — mirrors /pl exactly. Inject OLLIE_MEMORY_PATH into the
execute server env alongside OLLIE_PLAN_PATH.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Register memory.Decl() and task.Decl(planDir) in the dispatcher.
Remove filePlanBackend (plan logic now lives in core/pkg/tools/task).
Drop WithFallbackPlanBackend now that BuildAgentEnv takes no options.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ctl now validates the first word of input against a closed set of
known commands. Unrecognized input returns an error instead of being
silently forwarded as a prompt to the agent.
- Support mv on session directories (wstat rename)
- Track connections globally for fid path rewriting on rename
- Add kill and rn <name> to ctl handler
- Append rename notification to chat log
- Update README with rename and ctl docs