diff --git a/cmd/olliesrv/internal/fs/spec.go b/cmd/olliesrv/internal/fs/spec.go index 3bc7d99..b6440da 100644 --- a/cmd/olliesrv/internal/fs/spec.go +++ b/cmd/olliesrv/internal/fs/spec.go @@ -662,52 +662,18 @@ func buildAgentChildren(a *agent.Agent, s *session.Session) []virtfs.FsNodeDecl if ts == nil { return nil, fmt.Errorf("no tool server") } - if len(args) == 0 { - raw := ts.ListDetachedRaw() - if len(raw) == 0 { + if len(args) == 0 || args[0] == "top" { + data, err := ts.ListProcs() + if err != nil { + return nil, err + } + if len(data) == 0 { return []byte("(no background processes)\n"), nil } - var sb strings.Builder - for _, r := range raw { - m, ok := r.(map[string]any) - if !ok { - continue - } - pid, _ := m["pid"].(int) - cmd, _ := m["command"].(string) - status := "running" - if exited, ok := m["exited"].(bool); ok && exited { - code, _ := m["exit_code"].(int) - status = fmt.Sprintf("exited (%d)", code) - } - fmt.Fprintf(&sb, "%d\t%s\tshell\t%s\n", pid, status, cmd) - } - return []byte(sb.String()), nil + return data, nil } subcmd := args[0] switch subcmd { - case "top": - raw := ts.ListDetachedRaw() - if len(raw) == 0 { - return []byte("(no background processes)\n"), nil - } - var sb strings.Builder - fmt.Fprintf(&sb, "%-8s %-10s %-16s %s\n", "PID", "STATUS", "TOOL", "CMD") - for _, r := range raw { - m, ok := r.(map[string]any) - if !ok { - continue - } - pid, _ := m["pid"].(int) - cmd, _ := m["command"].(string) - status := "running" - if exited, ok := m["exited"].(bool); ok && exited { - code, _ := m["exit_code"].(int) - status = fmt.Sprintf("exited (%d)", code) - } - fmt.Fprintf(&sb, "%-8d %-10s %-16s %s\n", pid, status, "shell", cmd) - } - return []byte(sb.String()), nil case "term": if len(args) < 2 { return nil, fmt.Errorf("proc term requires pid") @@ -757,18 +723,8 @@ func buildAgentChildren(a *agent.Agent, s *session.Session) []virtfs.FsNodeDecl return nil, fmt.Errorf("process %d not found", pid) } return []byte("ok\n"), nil - case "raw": - raw := ts.ListDetachedRaw() - if len(raw) == 0 { - return []byte("(no procs in toolsrv)\n"), nil - } - var sb strings.Builder - for _, r := range raw { - fmt.Fprintf(&sb, "%v\n", r) - } - return []byte(sb.String()), nil default: - return nil, fmt.Errorf("unknown proc subcommand: %s (use: top, term , kill , out , dismiss , raw)", subcmd) + return nil, fmt.Errorf("unknown proc subcommand: %s (use: top, term , kill , out , dismiss )", subcmd) } }, "systemprompt": func(_ []string) ([]byte, error) { diff --git a/toolsrv/client9p.go b/toolsrv/client9p.go index 172f5e9..fb7ad82 100644 --- a/toolsrv/client9p.go +++ b/toolsrv/client9p.go @@ -379,32 +379,20 @@ func (c *Conn) Detach() bool { return err == nil } -// ListDetachedRaw returns raw info about detached processes. -func (c *Conn) ListDetachedRaw() []any { - fid, err := c.fsys.Open("proc", plan9.OREAD) +// ListProcs returns the proc listing for this agent (filtered by agent ID). +func (c *Conn) ListProcs() ([]byte, error) { + fid, err := c.fsys.Open("proc/list", plan9.ORDWR) if err != nil { - return nil + return nil, err } defer fid.Close() - - var result []any - // Read directory entries - for { - dirs, err := fid.Dirread() - if err != nil || len(dirs) == 0 { - break - } - for _, d := range dirs { - if d.Name == "new" || d.Name == "new.bg" || d.Name == "list" { - continue - } - info := c.readProcInfo(d.Name) - if info != nil { - result = append(result, info) - } - } + if _, err := fid.Write([]byte(c.agentID)); err != nil { + return nil, err } - return result + if _, err := fid.Seek(0, 0); err != nil { + return nil, err + } + return io.ReadAll(fid) } // readProcInfo reads info about a single proc.