diff --git a/fs/session/create.go b/fs/session/create.go index a386547..54260f7 100644 --- a/fs/session/create.go +++ b/fs/session/create.go @@ -8,10 +8,10 @@ import ( "ollie/agent" "ollie/backend" - coresession "ollie/session" - "ollie/toolsrv" "ollie/paths" "ollie/prompts" + coresession "ollie/session" + "ollie/toolsrv" ) // Create creates a new session from key=value args. Returns the session ID. diff --git a/fs/session/files.go b/fs/session/files.go index e9442dc..45385f8 100644 --- a/fs/session/files.go +++ b/fs/session/files.go @@ -57,7 +57,7 @@ var AgentFileList = []struct { {"tools", false, false}, {"name", false, false}, {"id", false, false}, - } +} // FileList is the combined list (for backward compat in tests). var FileList = append(SessionFileList, AgentFileList...) diff --git a/fs/session/persist.go b/fs/session/persist.go index 1dafd59..f6c1d4d 100644 --- a/fs/session/persist.go +++ b/fs/session/persist.go @@ -11,9 +11,9 @@ import ( "ollie/agent" "ollie/backend" + "ollie/prompts" coresession "ollie/session" "ollie/toolsrv" - "ollie/prompts" ) // Kill terminates a session and removes it from the tree. diff --git a/fs/session/root.go b/fs/session/root.go index 3511728..42832c9 100644 --- a/fs/session/root.go +++ b/fs/session/root.go @@ -131,7 +131,9 @@ func NewRoot(cfg Config) *Tree { WithLister(func(_ []string) ([]os.DirEntry, error) { return rootList(rs) }), WithReaddir(func(_ []string, name string) ([]os.DirEntry, error) { return rootReaddir(rs, name) }), WithDeleter(func(_ []string, name string) error { return rootDel(rs, name) }), - WithCreator(func(_ []string, name string, _ os.FileMode) error { return fmt.Errorf("create not supported: %s", name) }), + WithCreator(func(_ []string, name string, _ os.FileMode) error { + return fmt.Errorf("create not supported: %s", name) + }), WithRenamer(func(_ []string, old, new string) error { if strings.Contains(old, "/agent/") { parts := strings.SplitN(old, "/", 4) @@ -267,8 +269,8 @@ func rootReaddir(rs *rootState, name string) ([]os.DirEntry, error) { } return entries, nil } - if len(parts) >= 2 && parts[1] == "agent" { - if len(parts) == 2 { + if len(parts) >= 2 && parts[1] == "agent" { + if len(parts) == 2 { agentName := sess.Core.Agent().Name() aid := sess.Core.Agent().ID() if aid == "" { @@ -280,19 +282,14 @@ func rootReaddir(rs *rootState, name string) ([]os.DirEntry, error) { } entries := []os.DirEntry{DirEntry(dirName, 0755)} return entries, nil - } - if len(parts) >= 3 { - // Accept either agent Name or ID as the directory key - aid := sess.Core.Agent().ID() - if aid == "" { - aid = "0" - } + } + if len(parts) >= 3 { agentName := sess.Core.Agent().Name() - if parts[2] != aid && parts[2] != agentName { + if agentName == "" || parts[2] != agentName { return nil, fmt.Errorf("agent %s not found in session %s", parts[2], sessID) } - } - if len(parts) == 3 { + } + if len(parts) == 3 { afs := openAgentTree(rs, sess) entries, err := afs.List() if err != nil { @@ -333,15 +330,11 @@ func rootStat(rs *rootState, name string) (os.FileInfo, error) { return &SyntheticFileInfo{Name_: "agent", Mode_: 0755, IsDir_: true}, nil } if len(parts) >= 3 { - aid := sess.Core.Agent().ID() - if aid == "" { - aid = "0" - } agentName := sess.Core.Agent().Name() - if parts[2] != aid && parts[2] != agentName { + if agentName == "" || parts[2] != agentName { return nil, fmt.Errorf("agent %s not found in session %s", parts[2], sessID) - } } + } if len(parts) == 3 { return &SyntheticFileInfo{Name_: parts[2], Mode_: 0755, IsDir_: true}, nil } @@ -393,7 +386,7 @@ func rootOpen(rs *rootState, name string) (File, error) { } switch name { -case "eventwait": + case "eventwait": return &FileConfig{ StatFn: func() (os.FileInfo, error) { return &SyntheticFileInfo{Name_: "eventwait", Mode_: Perms[PathSessions].Files["eventwait"]}, nil @@ -401,7 +394,7 @@ case "eventwait": ReadFn: func() ([]byte, error) { return []byte(buildIndex(rs)), nil }, - WriteFn: func([]byte) error { return fmt.Errorf("eventwait: read-only") }, + WriteFn: func([]byte) error { return fmt.Errorf("eventwait: read-only") }, BlockingReadFn: func(ctx context.Context, _ string) ([]byte, string, error) { ch := eventRegister() defer eventRelease(ch) @@ -456,15 +449,11 @@ case "eventwait": if len(parts) < 4 { return nil, fmt.Errorf("%s: is a directory", name) } - // Validate agent ID or Name - aid := sess.Core.Agent().ID() - if aid == "" { - aid = "0" - } - agentName := sess.Core.Agent().Name() - if parts[2] != aid && parts[2] != agentName { + // Validate agent Name + agentName := sess.Core.Agent().Name() + if agentName == "" || parts[2] != agentName { return nil, fmt.Errorf("agent %s not found in session %s", parts[2], sessID) - } + } afs := openAgentTree(rs, sess) return afs.Open(parts[3]) } @@ -513,18 +502,18 @@ func buildIndex(rs *rootState) []byte { ids = append(ids, id) } sort.Strings(ids) -for _, id := range ids { - sess := rs.sessions[id] - sess.mu.RLock() - st := sess.Core.Agent().State() - cwd := sess.Core.CWD() - be := sess.Core.Agent().BackendName() - model := sess.Core.Agent().ModelName() - ag := sess.Core.Agent().Name() - name := sess.name - sess.mu.RUnlock() - fmt.Fprintf(&sb, "%s\t%s\t%s\t%s\t%s\t%s\n", name, st, cwd, be, model, ag) - } + for _, id := range ids { + sess := rs.sessions[id] + sess.mu.RLock() + st := sess.Core.Agent().State() + cwd := sess.Core.CWD() + be := sess.Core.Agent().BackendName() + model := sess.Core.Agent().ModelName() + ag := sess.Core.Agent().Name() + name := sess.name + sess.mu.RUnlock() + fmt.Fprintf(&sb, "%s\t%s\t%s\t%s\t%s\t%s\n", name, st, cwd, be, model, ag) + } rs.mu.RUnlock() return []byte(sb.String()) } diff --git a/fs/session/types.go b/fs/session/types.go index 9c7c816..a1a2035 100644 --- a/fs/session/types.go +++ b/fs/session/types.go @@ -171,7 +171,7 @@ func NewEventHandler(as *AgentLog) agent.EventHandler { streamingRole := "" streamingResponseID := "" -return func(ev agent.Event) { + return func(ev agent.Event) { switch ev.Role { case "assistant": if streamingRole != ev.Role || (ev.Role == "assistant" && ev.ResponseID != streamingResponseID) {