- 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
91 lines
3.1 KiB
Go
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
|
|
}
|