fix: validate agent directory by Name only (not ID); gofmt all changed files

This commit is contained in:
Ollie Agent 2026-08-01 17:59:39 +02:00
parent 859d3cb16f
commit 19690d0ef5
5 changed files with 35 additions and 46 deletions

View File

@ -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.

View File

@ -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...)

View File

@ -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.

View File

@ -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())
}

View File

@ -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) {