yao/tai/volume/volume.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

91 lines
3.1 KiB
Go

package volume
import (
"context"
"io/fs"
"os"
"time"
)
// Volume provides filesystem IO, directory synchronization, and archive operations.
// Remote connects to Tai gRPC :19100; Local operates directly on disk.
type Volume interface {
ReadFile(ctx context.Context, sessionID, path string) ([]byte, os.FileMode, error)
WriteFile(ctx context.Context, sessionID, path string, data []byte, perm os.FileMode) error
Stat(ctx context.Context, sessionID, path string) (*FileInfo, error)
ListDir(ctx context.Context, sessionID, path string) ([]FileInfo, error)
Remove(ctx context.Context, sessionID, path string, recursive bool) error
Rename(ctx context.Context, sessionID, oldPath, newPath string) error
MkdirAll(ctx context.Context, sessionID, path string) error
SyncPush(ctx context.Context, sessionID, localDir string, opts ...SyncOption) (*SyncResult, error)
SyncPull(ctx context.Context, sessionID, localDir string, opts ...SyncOption) (*SyncResult, error)
Copy(ctx context.Context, sessionID, src, dst string, opts ...SyncOption) (*SyncResult, error)
Zip(ctx context.Context, sessionID, src, dst string, excludes []string) (*ArchiveResult, error)
Unzip(ctx context.Context, sessionID, src, dst string) (*ArchiveResult, error)
Gzip(ctx context.Context, sessionID, src, dst string) (*ArchiveResult, error)
Gunzip(ctx context.Context, sessionID, src, dst string) (*ArchiveResult, error)
Tar(ctx context.Context, sessionID, src, dst string, excludes []string) (*ArchiveResult, error)
Untar(ctx context.Context, sessionID, src, dst string) (*ArchiveResult, error)
Tgz(ctx context.Context, sessionID, src, dst string, excludes []string) (*ArchiveResult, error)
Untgz(ctx context.Context, sessionID, src, dst string) (*ArchiveResult, error)
Close() error
}
// FileInfo describes a single file or directory.
type FileInfo struct {
Path string
Size int64
Mtime time.Time
Mode fs.FileMode
IsDir bool
}
// SyncResult summarizes a SyncPush or SyncPull operation.
type SyncResult struct {
FilesSynced int
BytesTransferred int64
Duration time.Duration
}
// ArchiveResult summarizes an archive/compression operation.
type ArchiveResult struct {
SizeBytes int64
FilesCount int
}
// SyncOption configures sync behavior.
type SyncOption func(*SyncConfig)
// SyncConfig holds resolved sync options.
type SyncConfig struct {
ForceFull bool
Excludes []string
RemotePath string
}
// WithForceFull skips snapshot caches and diffs against actual disk.
func WithForceFull() SyncOption {
return func(c *SyncConfig) { c.ForceFull = true }
}
// WithExcludes adds glob patterns to exclude from sync.
func WithExcludes(patterns ...string) SyncOption {
return func(c *SyncConfig) { c.Excludes = append(c.Excludes, patterns...) }
}
// WithRemotePath sets a sub-path within the workspace root for sync operations.
func WithRemotePath(path string) SyncOption {
return func(c *SyncConfig) { c.RemotePath = path }
}
// ApplySyncOpts resolves a slice of SyncOption into a SyncConfig.
func ApplySyncOpts(opts []SyncOption) SyncConfig {
var cfg SyncConfig
for _, o := range opts {
o(&cfg)
}
return cfg
}