From 44a6dda695419ea27d514f35639de3e0f7edbf51 Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Wed, 29 Jul 2026 20:47:04 +0200 Subject: [PATCH] session: split FileList into SessionFileList + AgentFileList MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prepare for agent/{aid} sublevel: - SessionFileList: plan, env (session-level) - AgentFileList: 21 agent-level files (prompt, state, cfg, etc.) - NewAgentTree builder for agent file tree - FileList kept as combined for backward compat No routing changes yet — existing flat layout still works. --- session/sessionfile.go | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/session/sessionfile.go b/session/sessionfile.go index 13dad9b..03031cc 100644 --- a/session/sessionfile.go +++ b/session/sessionfile.go @@ -15,14 +15,22 @@ import ( "olliesrv/fs" ) -// FileList defines the fixed set of files in a session directory. -// Permissions come from fs.Perms[fs.PathSessionFile].Files. -var FileList = []struct { +// SessionFileList defines session-level files (shared across agents). +var SessionFileList = []struct { Name string OneShot bool Async bool }{ {"plan", false, false}, + {"env", false, false}, +} + +// AgentFileList defines agent-level files. +var AgentFileList = []struct { + Name string + OneShot bool + Async bool +}{ {"ctl", false, true}, {"prompt", false, true}, {"fifo.in", false, true}, @@ -37,7 +45,6 @@ var FileList = []struct { {"ctxsz", false, false}, {"models", false, false}, {"systemprompt", false, false}, - {"env", false, false}, {"tail", false, false}, {"prompt.prev", false, false}, {"context", false, false}, @@ -48,6 +55,9 @@ var FileList = []struct { {"tools", false, false}, } +// FileList is the combined list (for backward compat in tests). +var FileList = append(SessionFileList, AgentFileList...) + // sessionFilePerms returns the permission registry for per-session files. func sessionFilePerms() map[string]os.FileMode { return fs.Perms[fs.PathSessionFile].Files @@ -65,6 +75,19 @@ func NewSessionTree(sess *Session, log *olog.Logger, kill func(), rename func(ne return fs.NewSynth(specs) } +// NewAgentTree builds the file tree for a single agent within a session. +func NewAgentTree(sess *Session, log *olog.Logger, saveTranscript func([]byte) error, invalidateModels func(), resetElevation func(), toolRegistry *tools.Registry) *fs.Tree { + h := &sessionHelper{sess: sess, log: log, saveTranscript: saveTranscript, invalidateModels: invalidateModels, resetElevation: resetElevation, toolRegistry: toolRegistry} + perms := sessionFilePerms() + specs := make([]fs.FileSpec, len(AgentFileList)) + for i, f := range AgentFileList { + specs[i] = h.fileSpec(f.Name, perms[f.Name]) + specs[i].OneShot = f.OneShot + specs[i].Async = f.Async + } + return fs.NewSynth(specs) +} + // sessionHelper holds the dependencies needed to build session FileSpecs. type sessionHelper struct { sess *Session