fix: validate agent directory by Name only (not ID); gofmt all changed files
This commit is contained in:
parent
859d3cb16f
commit
19690d0ef5
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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...)
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue