Commit Graph

82 Commits

Author SHA1 Message Date
Levi Neely 9d21601edf fix: session persistence across restart
Shutdown() was calling KillSession() which deleted the persisted
JSON files immediately after saveAllSessions() wrote them. Now
Shutdown() closes sessions directly without removing persistence
files, allowing restoreAllSessions() to find them on next start.
2026-07-18 16:28:12 +02:00
Levi Neely d8e0b9b5ba 9p: add /complete file for stateless code completion
Follows the Plan 9 /net/dns pattern: per-fid request-response.
Write JSON request (or plain prefix), write blocks during LLM call,
read returns the completion result. Per-fid state means concurrent
clients get independent request/response pairs.

Also includes the Complete method, findOrCreateCopilot, and noise
stripping helpers in the session package.
2026-07-18 16:00:54 +02:00
Levi Neely b13f42778a 9p: add session persistence across restarts
Sessions are saved to ~/.local/share/ollie/sessions/active-9p/ on
shutdown and restored on startup. Core auto-saves to SessionsDir
during turns. KillSession removes persisted files.

Closes the major feature gap with the D-Bus daemon.
2026-07-18 15:12:11 +02:00
Levi Neely 4ff3961dfd 9p: add proc/ directory for detached process inspection
- ls /s/{id}/proc/ lists detached PIDs
- cat /s/{id}/proc/{pid} reads ring buffer output
- rm /s/{id}/proc/{pid} dismisses the process
- echo detach > /s/{id}/ctl detaches running process
- echo "signal {pid} [TERM|KILL]" > /s/{id}/ctl signals detached process

Walk validates PID exists in detached list before succeeding.
2026-07-18 13:29:35 +02:00
Levi Neely 61240e02de 9p: add peer directory for bidirectional session communication
Implement /s/{id}/peer/ directory:
- touch /s/{id}/peer/{peer-id}: creates bidirectional peer link
- rm /s/{id}/peer/{peer-id}: removes bidirectional peer link
- ls /s/{id}/peer/: lists registered peers
- echo "prompt" > /s/{id}/peer/{peer-id}: submits prompt to peer

Peer management lives in the session Manager (core layer).
Walk validates peer existence before reporting file found.
Peer files have mode 0666 (writable).
2026-07-18 13:17:57 +02:00
Levi Neely 1db7fb9177 fix deadlock in CachedListModels: use dedicated modelsMu
content() holds sess.mu.RLock, then calls CachedListModels which
tried to acquire sess.mu.Lock for cache write — classic RLock/Lock
deadlock. Fix by giving the models cache its own mutex independent
of the session mu.
2026-07-18 12:54:38 +02:00
Levi Neely bb9b899e4e 9p: eliminate expensive API calls during readdir/stat
- Add CachedListModels() with 24h TTL to avoid repeated Models() API calls
- Cache readdir serialized bytes per-fid (rebuild only at offset=0)
- Skip all session file size computation in makeStat (report len=0)
- Short-circuit pathType() for session paths to avoid triggering Stat
- Remove e.Info() call from subdirectory readdir (unused mtime)
- Add monotonic timer to handle() for profiling 9p operations
- Add fcallTypeName() helper
- Fix stubCore for new Detach/SaveSession interface methods
- Add tools-process.md prompt

Before: ls inside a session dir took 1.38s (kiro) / 67ms (openrouter)
After: 182µs regardless of backend (7500x improvement)
2026-07-18 01:31:06 +02:00
Levi Neely 9ae36420ab strip 9P namespace to sessions only
Remove a/, p/, sk/, m/, tr/, tmp/, u/, x/, and per-session t/ from the
9P namespace. These are all files on disk that the runtime reads directly
from ~/.config/ollie/ — serving them through 9P added indirection without
value.

What remains:
- /s/ (live sessions: the dynamic state that doesn't exist on disk)
- /backends, /models, /help (synthetic root files)

This brings olliesrv's scope in line with the D-Bus daemon: session
lifecycle, prompt submission, state observation, and streaming output.
2026-07-17 23:08:29 +02:00
Levi Neely 6c07c308e1 feat: implement 9P mount logic using core execute hooks
Created session/mount.go with all 9P FUSE mount logic previously in core.

Changes:
- New session/mount.go with MountPathFor(), WithMount9P(), and mount lifecycle functions
- WithMount9P() returns execute.Option that wires up OnEnvSet, OnPreDispatch, OnClose hooks
- Updated session.go to use WithMount9P() and MountPathFor() instead of execute.WithMount() and execute.MountPath()
- Mount logic encapsulated in mountState struct with proper synchronization

The mount implementation is now fully contained in the 9p module.
2026-07-08 15:55:23 +02:00
Levi Neely 542834b3e4 session: remove $OLLIE mount dependency
- Wire ReadPlanStep directly from sess.plan (no filesystem read)
- Add ListHandlers to ManagerConfig; passed through to AgentCoreConfig
- Hoist skillTree in main.go; populate ListHandlers for tools+skills
- Add ListHandlers to ManagerConfig
2026-06-16 12:30:42 +02:00
Levi Neely 32e8b4fc10 skip auto-mount when running with -tcp 2026-06-16 06:59:10 +02:00
ollie 60da0bbfde token efficiency: expose compactionModel in 9p cfg, fix test stubs
- Add compactionModel= to cfg read/write
- Add CompactionModel/SetCompactionModel stubs to test stubCore
- Fix NewSessionTree calls with missing invalidateModels arg
2026-05-28 18:44:57 +02:00
Levi Neely d8bd47c545 chat log: switch from line-prefix to [role] header block format 2026-05-25 23:15:02 +02:00
Levi Neely 200cb52e29 Add model cache with async prefetch and invalidate command
- Add ModelCache that prefetches models from all backends at startup
- Cache models in memory, refresh on demand via Invalidate()
- Add global /ctl file with 'invalidate' command
- Add 'invalidate' ctl command and /invalidate slash command in sessions
- Fix filePerm to query rootStore for root-level file permissions
- Add 'models' to root directory listing
2026-05-22 10:08:11 +02:00
Levi Neely e7dd3987ef refactor session handling 2026-05-21 14:42:39 +02:00
Levi Neely 06a3e0f503 update session handling 2026-05-21 12:33:11 +02:00
Levi Neely 09e4f0f678 fs: centralized permission registry; FUSE mutating operations 2026-05-21 11:50:34 +02:00
Levi Neely e77c5a09f4 Format exec events with $ prefix instead of code blocks 2026-05-20 17:24:12 +02:00
Levi Neely e101db2079 session: format exec events with code fences 2026-05-20 16:49:44 +02:00
Levi Neely afb531c936 session: subscribe to event bus for chat log, drop handler from Submit
- NewSession subscribes to bus "event" topic for chat log writing
- Remove makePublish/handler threading from all Submit call sites
- Adapt tests to new bus-based event delivery
2026-05-20 16:45:37 +02:00
Levi Neely ab909b1fec Revert "sessionfile: prompt 0446 (r--r--rw-)"
This reverts commit 6994b9bc3e.
2026-05-20 11:10:26 +02:00
Levi Neely 6994b9bc3e sessionfile: prompt 0446 (r--r--rw-) 2026-05-20 11:10:12 +02:00
Levi Neely 06ddf36de3 openStore: use sess.id instead of captured variable 2026-05-20 10:57:10 +02:00
Levi Neely 35e7b98e22 sessionfile: update ctl mode to 0666 2026-05-20 10:43:22 +02:00
Levi Neely baa7ca66e6 makeStat: delegate file modes to backing tree
Remove hardcoded permission switch in makeStat and delegate to
the underlying FileTree.Stat() instead. This makes FileList in
sessionfile.go the single source of truth for session file modes.
2026-05-20 10:42:29 +02:00
Levi Neely fe6e2c04a8 cfg: add name field, support name= writes as rename 2026-05-20 09:59:30 +02:00
Levi Neely 3df852b6de cfg: remove state field (use state file instead) 2026-05-20 09:53:39 +02:00
Levi Neely 57eb330d16 purge all 'store' vocabulary from code and comments 2026-05-19 18:40:33 +02:00
Levi Neely 038dc4b0bf purge Store/FileStore vocabulary: use Tree everywhere
- Manager.Store() → Manager.Tree()
- SessionFileStore → removed (use *fs.Tree)
- NewFileStore → NewSessionTree
- storeRead/storeWrite → readFile/writeFile
- storeRoutes → routes, routeStore → route
- SkillStore → SkillTree, ToolStore → ToolTree
- No more 'store' in public API
2026-05-19 18:39:02 +02:00
Levi Neely 2e0adffa75 main.go owns wiring: constructs all trees, passes Config to server
- server.New takes server.Config (no more internal construction)
- OnRename removed: wstat handles all fid rewriting directly
- WithStrict/WithYolo removed (passed via ManagerConfig)
- Default dir functions moved to main.go
- tool.go and root.go in main package (wiring)
- Server is now a pure protocol handler
2026-05-19 18:32:19 +02:00
Levi Neely a9e9538015 rename to 9P vocabulary: store/ → fs/, DirStore → Tree, StoreEntry → File
- Package: store → fs
- Type: DirStore → Tree, StoreEntry → File, EntryConfig → FileConfig
- Constructor: NewDirStore → NewTree, NewFileStore → NewSynth
- Methods: ListDir → Readdir, WithListDir → WithReaddir
- Interface: Store → FileTree
- Files: dirstore.go → tree.go, filestore.go → synth.go, store.go → fs.go
- Test: store_test.go → fs_test.go
2026-05-19 18:19:37 +02:00
Levi Neely d0ce8a108e session/session.go: session logic in its own package
- session.Manager (was SessionManager)
- session.ManagerConfig (was SessionManagerConfig)
- session.Session, session.NewSession
- session.FileStore, session.NewFileStore
- session.FileMode, session.FileList
- session.FormatEvent, session.FormatParams, session.ParseParams
- server.go imports olliesrv/session
- Clean package boundary: session/ = lifecycle, store/ = abstraction
2026-05-19 18:10:36 +02:00