From d200fbad05e8cf5cac60d42ccd962d52422224fd Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Tue, 4 Aug 2026 15:22:18 +0200 Subject: [PATCH] refactor: promote remote to session level - CreateEmpty(name, remote) now spawns remote toolsrv when remote is set - requestSessionNew parses remote= argument - Add Session.SetRemote() method - Update kde submodule --- fs/handlers.go | 12 +++++++++--- kde | 2 +- session/registry.go | 34 ++++++++++++++-------------------- session/session.go | 21 +++++++++++++++------ 4 files changed, 39 insertions(+), 30 deletions(-) diff --git a/fs/handlers.go b/fs/handlers.go index 0f254af..c68eee6 100644 --- a/fs/handlers.go +++ b/fs/handlers.go @@ -243,12 +243,18 @@ func readSessionIdx(_ HandlerCtx) ([]byte, error) { func requestSessionNew(_ HandlerCtx, data []byte) ([]byte, error) { args := strings.Fields(string(data)) name := "" + remote := "" for _, arg := range args { - if k, v, ok := strings.Cut(arg, "="); ok && k == "name" { - name = v + if k, v, ok := strings.Cut(arg, "="); ok { + switch k { + case "name": + name = v + case "remote": + remote = v + } } } - sess, err := session.CreateEmpty(name) + sess, err := session.CreateEmpty(name, remote) if err != nil { return nil, err } diff --git a/kde b/kde index ec89eaa..265a1fd 160000 --- a/kde +++ b/kde @@ -1 +1 @@ -Subproject commit ec89eaae1876500509395253c58972309c6ce968 +Subproject commit 265a1fdda9c47244d0238b855c2d3ac0ae1b6efb diff --git a/session/registry.go b/session/registry.go index 9d295ca..da5d43f 100644 --- a/session/registry.go +++ b/session/registry.go @@ -13,7 +13,6 @@ import ( "ollie/agent" "ollie/backend" olog "ollie/log" - "ollie/toolsrv" ) // Package-level session registry with thread-safe access. @@ -244,7 +243,8 @@ func BuildIndex() []byte { } // CreateEmpty creates an empty session (no agent). -func CreateEmpty(name string) (*Session, error) { +// If remote is non-empty, spawns a remote tool server via SSH. +func CreateEmpty(name, remote string) (*Session, error) { sessID := NewSessionID() if name == "" { name = sessID @@ -262,29 +262,23 @@ func CreateEmpty(name string) (*Session, error) { ctx, cancel := context.WithCancel(pkgCtx) sess := NewEmpty(sessID, ctx, cancel) + sess.SetRemote(remote) - // Spawn tool server + // Spawn tool server (local or remote) cwd, _ := os.Getwd() - var dialOpts []toolsrv.Option - if pkgYolo { - dialOpts = append(dialOpts, toolsrv.WithYolo()) - } - proc, err := toolsrv.Spawn(ctx, cwd, dialOpts...) + infra, err := SetupToolServer(ToolServerConfig{ + Ctx: ctx, + CWD: cwd, + RemoteTarget: remote, + Yolo: pkgYolo, + }) if err != nil { cancel() - return nil, fmt.Errorf("spawn tool server: %w", err) + return nil, fmt.Errorf("setup tool server: %w", err) } - sess.SetProc(proc) - sess.SetKeeper(toolsrv.NewProcessKeeper(ctx, proc, func(ctx context.Context) (*toolsrv.Process, error) { - return toolsrv.Spawn(ctx, cwd, dialOpts...) - })) - conn, err := toolsrv.Dial(ctx, toolsrv.LocalAddr(proc.Socket)) - if err != nil { - cancel() - proc.Close() - return nil, fmt.Errorf("dial tool server: %w", err) - } - sess.SetToolsConn(conn) + sess.SetProc(infra.Proc) + sess.SetKeeper(infra.Keeper) + sess.SetToolsConn(infra.ToolsConn) mu.Lock() sessions[name] = sess diff --git a/session/session.go b/session/session.go index 0766bad..65b9702 100644 --- a/session/session.go +++ b/session/session.go @@ -289,6 +289,11 @@ func (a *Session) Remote() string { return a.remote } +// SetRemote sets the remote target for this session. +func (a *Session) SetRemote(remote string) { + a.remote = remote +} + // SetCWD validates and sets the working directory on all agents. func (a *Session) SetCWD(dir string) error { dir = paths.ExpandHome(dir) @@ -578,12 +583,16 @@ func NewEmpty(id string, ctx context.Context, cancel context.CancelFunc) *Sessio if idx := strings.IndexByte(id, '-'); idx > 0 { name = id[:idx] } + log := pkgSink.NewLogger("session") return &Session{ - id: id, - name: name, - ctx: ctx, - cancel: cancel, - env: make(map[string]string), - agents: make([]*agent.Agent, 0), + id: id, + name: name, + ctx: ctx, + cancel: cancel, + env: make(map[string]string), + agents: make([]*agent.Agent, 0), + log: log, + auditLog: log.Sub("audit"), + sessionsDir: pkgSessionsDir, } }