yao/sandbox/v2/types.go
Max 3f390c223c feat(sandbox/v2): enhance V2 sandbox integration and testing
- Implemented V2 sandbox initialization in the assistant loading process, allowing for standalone sandbox.yao configuration.
- Added support for V2 sandbox execution paths in the Assistant's Stream method, differentiating between V1 and V2 sandboxes.
- Introduced comprehensive tests for V2 sandbox configurations, ensuring correct loading and execution behavior.
- Updated the context and types to accommodate V2 sandbox features, including system information and workspace management.

Made-with: Cursor
2026-03-10 01:13:17 +08:00

226 lines
5.6 KiB
Go

package sandbox
import (
"context"
"io"
"time"
"github.com/yaoapp/yao/tai/workspace"
)
// ---------------------------------------------------------------------------
// Computer — unified interface for execution environments
// ---------------------------------------------------------------------------
// Computer is the unified interface for remote execution environments.
// Both Box (container) and Host (bare metal) implement it.
type Computer interface {
ComputerInfo() ComputerInfo
Exec(ctx context.Context, cmd []string, opts ...ExecOption) (*ExecResult, error)
Stream(ctx context.Context, cmd []string, opts ...ExecOption) (*ExecStream, error)
VNC(ctx context.Context) (string, error)
Proxy(ctx context.Context, port int, path string) (string, error)
BindWorkplace(workspaceID string)
Workplace() workspace.FS
}
// ComputerInfo holds identity and registry information for a Computer.
type ComputerInfo struct {
Kind string // "box" | "host"
NodeID string
TaiID string
MachineID string
Version string
System SystemInfo
Mode string // "direct" | "tunnel"
Capabilities map[string]bool
Status string
// Box-specific fields (zero values for Host)
BoxID string
ContainerID string
Owner string
Image string
Policy LifecyclePolicy
Labels map[string]string
}
// SystemInfo describes the hardware and environment of a Tai node.
type SystemInfo struct {
OS string
Arch string
Hostname string
NumCPU int
TotalMem int64
Shell string // preferred shell: "sh", "pwsh", "powershell", "cmd.exe"
TempDir string // system temp directory
}
// ---------------------------------------------------------------------------
// Lifecycle
// ---------------------------------------------------------------------------
type LifecyclePolicy string
const (
OneShot LifecyclePolicy = "oneshot"
Session LifecyclePolicy = "session"
LongRunning LifecyclePolicy = "longrunning"
Persistent LifecyclePolicy = "persistent"
)
const DefaultStopTimeout = 2 * time.Second
// ---------------------------------------------------------------------------
// Create / List options
// ---------------------------------------------------------------------------
type PortMapping struct {
ContainerPort int
HostPort int
HostIP string
Protocol string
}
type CreateOptions struct {
ID string
Owner string
Labels map[string]string
NodeID string
Image string
WorkDir string
User string
Env map[string]string
Memory int64
CPUs float64
VNC bool
Ports []PortMapping
Policy LifecyclePolicy
IdleTimeout time.Duration
MaxLifetime time.Duration
StopTimeout time.Duration
WorkspaceID string
MountMode string
MountPath string
}
type ListOptions struct {
Owner string
NodeID string
Labels map[string]string
}
// ---------------------------------------------------------------------------
// Unified ExecOption / ExecResult / ExecStream
// ---------------------------------------------------------------------------
type execConfig struct {
WorkDir string
Env map[string]string
Timeout time.Duration
Stdin []byte
MaxOutputBytes int64
}
// ExecOption configures an Exec or Stream call on any Computer.
type ExecOption func(*execConfig)
func WithWorkDir(dir string) ExecOption {
return func(c *execConfig) { c.WorkDir = dir }
}
func WithEnv(env map[string]string) ExecOption {
return func(c *execConfig) { c.Env = env }
}
func WithTimeout(timeout time.Duration) ExecOption {
return func(c *execConfig) { c.Timeout = timeout }
}
func WithStdin(data []byte) ExecOption {
return func(c *execConfig) { c.Stdin = data }
}
func WithMaxOutput(bytes int64) ExecOption {
return func(c *execConfig) { c.MaxOutputBytes = bytes }
}
// ExecResult holds the outcome of a command executed on any Computer.
type ExecResult struct {
ExitCode int
Stdout string
Stderr string
DurationMs int64
Error string
Truncated bool
}
// ExecStream provides real-time streaming I/O for a running command.
type ExecStream struct {
Stdout io.ReadCloser
Stderr io.ReadCloser
Stdin io.WriteCloser
Wait func() (int, error)
Cancel func()
}
// ---------------------------------------------------------------------------
// Attach (Box-specific, not part of Computer interface)
// ---------------------------------------------------------------------------
type attachConfig struct {
Protocol string
Path string
Headers map[string]string
}
type AttachOption func(*attachConfig)
func WithProtocol(protocol string) AttachOption {
return func(c *attachConfig) { c.Protocol = protocol }
}
func WithPath(path string) AttachOption {
return func(c *attachConfig) { c.Path = path }
}
func WithHeaders(headers map[string]string) AttachOption {
return func(c *attachConfig) { c.Headers = headers }
}
// ImagePullOptions configures an image pull operation.
type ImagePullOptions struct {
Auth *RegistryAuth
}
// RegistryAuth holds credentials for a private container registry.
type RegistryAuth struct {
Username string
Password string
Server string
}
type ServiceConn struct {
Read func() ([]byte, error)
Write func(data []byte) error
Events <-chan []byte
URL string
Close func() error
}
// BoxInfo is a snapshot of a Box's runtime state (used by Manager.List).
type BoxInfo struct {
ID string
ContainerID string
NodeID string
Owner string
Status string
Policy LifecyclePolicy
Labels map[string]string
Image string
CreatedAt time.Time
LastActive time.Time
ProcessCount int
VNC bool
}