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
This commit is contained in:
Levi Neely 2026-08-04 15:22:18 +02:00
parent e1b732f09a
commit d200fbad05
4 changed files with 39 additions and 30 deletions

View File

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

2
kde

@ -1 +1 @@
Subproject commit ec89eaae1876500509395253c58972309c6ce968
Subproject commit 265a1fdda9c47244d0238b855c2d3ac0ae1b6efb

View File

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

View File

@ -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,
}
}