diff --git a/workspace.go b/workspace.go index a8ad102..6d79998 100644 --- a/workspace.go +++ b/workspace.go @@ -2,6 +2,7 @@ package gptscript import ( "context" + "os" "strings" ) @@ -19,9 +20,24 @@ func (g *GPTScript) CreateWorkspace(ctx context.Context, providerType string, fr return strings.TrimSpace(out), nil } -func (g *GPTScript) DeleteWorkspace(ctx context.Context, workspaceID string) error { +type DeleteWorkspaceOptions struct { + WorkspaceID string +} + +func (g *GPTScript) DeleteWorkspace(ctx context.Context, opts ...DeleteWorkspaceOptions) error { + var opt DeleteWorkspaceOptions + for _, o := range opts { + if o.WorkspaceID != "" { + opt.WorkspaceID = o.WorkspaceID + } + } + + if opt.WorkspaceID == "" { + opt.WorkspaceID = os.Getenv("GPTSCRIPT_WORKSPACE_ID") + } + _, err := g.runBasicCommand(ctx, "workspaces/delete", map[string]any{ - "id": workspaceID, + "id": opt.WorkspaceID, "workspaceTool": g.globalOpts.WorkspaceTool, "env": g.globalOpts.Env, }) @@ -30,19 +46,27 @@ func (g *GPTScript) DeleteWorkspace(ctx context.Context, workspaceID string) err } type ListFilesInWorkspaceOptions struct { - Prefix string + WorkspaceID string + Prefix string } -func (g *GPTScript) ListFilesInWorkspace(ctx context.Context, workspaceID string, opts ...ListFilesInWorkspaceOptions) ([]string, error) { +func (g *GPTScript) ListFilesInWorkspace(ctx context.Context, opts ...ListFilesInWorkspaceOptions) ([]string, error) { var opt ListFilesInWorkspaceOptions for _, o := range opts { if o.Prefix != "" { opt.Prefix = o.Prefix } + if o.WorkspaceID != "" { + opt.WorkspaceID = o.WorkspaceID + } + } + + if opt.WorkspaceID == "" { + opt.WorkspaceID = os.Getenv("GPTSCRIPT_WORKSPACE_ID") } out, err := g.runBasicCommand(ctx, "workspaces/list", map[string]any{ - "id": workspaceID, + "id": opt.WorkspaceID, "prefix": opt.Prefix, "workspaceTool": g.globalOpts.WorkspaceTool, "env": g.globalOpts.Env, @@ -54,10 +78,29 @@ func (g *GPTScript) ListFilesInWorkspace(ctx context.Context, workspaceID string return strings.Split(strings.TrimSpace(out), "\n"), nil } -func (g *GPTScript) RemoveAllWithPrefix(ctx context.Context, workspaceID, prefix string) error { +type RemoveAllOptions struct { + WorkspaceID string + WithPrefix string +} + +func (g *GPTScript) RemoveAll(ctx context.Context, opts ...RemoveAllOptions) error { + var opt RemoveAllOptions + for _, o := range opts { + if o.WithPrefix != "" { + opt.WithPrefix = o.WithPrefix + } + if o.WorkspaceID != "" { + opt.WorkspaceID = o.WorkspaceID + } + } + + if opt.WorkspaceID == "" { + opt.WorkspaceID = os.Getenv("GPTSCRIPT_WORKSPACE_ID") + } + _, err := g.runBasicCommand(ctx, "workspaces/remove-all-with-prefix", map[string]any{ - "id": workspaceID, - "prefix": prefix, + "id": opt.WorkspaceID, + "prefix": opt.WithPrefix, "workspaceTool": g.globalOpts.WorkspaceTool, "env": g.globalOpts.Env, }) @@ -65,9 +108,24 @@ func (g *GPTScript) RemoveAllWithPrefix(ctx context.Context, workspaceID, prefix return err } -func (g *GPTScript) WriteFileInWorkspace(ctx context.Context, workspaceID, filePath string, contents []byte) error { +type WriteFileInWorkspaceOptions struct { + WorkspaceID string +} + +func (g *GPTScript) WriteFileInWorkspace(ctx context.Context, filePath string, contents []byte, opts ...WriteFileInWorkspaceOptions) error { + var opt WriteFileInWorkspaceOptions + for _, o := range opts { + if o.WorkspaceID != "" { + opt.WorkspaceID = o.WorkspaceID + } + } + + if opt.WorkspaceID == "" { + opt.WorkspaceID = os.Getenv("GPTSCRIPT_WORKSPACE_ID") + } + _, err := g.runBasicCommand(ctx, "workspaces/write-file", map[string]any{ - "id": workspaceID, + "id": opt.WorkspaceID, "contents": contents, "filePath": filePath, "workspaceTool": g.globalOpts.WorkspaceTool, @@ -77,9 +135,24 @@ func (g *GPTScript) WriteFileInWorkspace(ctx context.Context, workspaceID, fileP return err } -func (g *GPTScript) DeleteFileInWorkspace(ctx context.Context, workspaceID, filePath string) error { +type DeleteFileInWorkspaceOptions struct { + WorkspaceID string +} + +func (g *GPTScript) DeleteFileInWorkspace(ctx context.Context, filePath string, opts ...DeleteFileInWorkspaceOptions) error { + var opt DeleteFileInWorkspaceOptions + for _, o := range opts { + if o.WorkspaceID != "" { + opt.WorkspaceID = o.WorkspaceID + } + } + + if opt.WorkspaceID == "" { + opt.WorkspaceID = os.Getenv("GPTSCRIPT_WORKSPACE_ID") + } + _, err := g.runBasicCommand(ctx, "workspaces/delete-file", map[string]any{ - "id": workspaceID, + "id": opt.WorkspaceID, "filePath": filePath, "workspaceTool": g.globalOpts.WorkspaceTool, "env": g.globalOpts.Env, @@ -88,9 +161,24 @@ func (g *GPTScript) DeleteFileInWorkspace(ctx context.Context, workspaceID, file return err } -func (g *GPTScript) ReadFileInWorkspace(ctx context.Context, workspaceID, filePath string) ([]byte, error) { +type ReadFileInWorkspaceOptions struct { + WorkspaceID string +} + +func (g *GPTScript) ReadFileInWorkspace(ctx context.Context, filePath string, opts ...ReadFileInWorkspaceOptions) ([]byte, error) { + var opt ReadFileInWorkspaceOptions + for _, o := range opts { + if o.WorkspaceID != "" { + opt.WorkspaceID = o.WorkspaceID + } + } + + if opt.WorkspaceID == "" { + opt.WorkspaceID = os.Getenv("GPTSCRIPT_WORKSPACE_ID") + } + out, err := g.runBasicCommand(ctx, "workspaces/read-file", map[string]any{ - "id": workspaceID, + "id": opt.WorkspaceID, "filePath": filePath, "workspaceTool": g.globalOpts.WorkspaceTool, "env": g.globalOpts.Env, diff --git a/workspace_test.go b/workspace_test.go index 6df5c3e..a7ff08c 100644 --- a/workspace_test.go +++ b/workspace_test.go @@ -13,7 +13,7 @@ func TestCreateAndDeleteWorkspace(t *testing.T) { t.Fatalf("Error creating workspace: %v", err) } - err = g.DeleteWorkspace(context.Background(), id) + err = g.DeleteWorkspace(context.Background(), DeleteWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Errorf("Error deleting workspace: %v", err) } @@ -26,18 +26,18 @@ func TestWriteReadAndDeleteFileFromWorkspace(t *testing.T) { } t.Cleanup(func() { - err := g.DeleteWorkspace(context.Background(), id) + err := g.DeleteWorkspace(context.Background(), DeleteWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Errorf("Error deleting workspace: %v", err) } }) - err = g.WriteFileInWorkspace(context.Background(), id, "test.txt", []byte("test")) + err = g.WriteFileInWorkspace(context.Background(), "test.txt", []byte("test"), WriteFileInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Fatalf("Error creating file: %v", err) } - content, err := g.ReadFileInWorkspace(context.Background(), id, "test.txt") + content, err := g.ReadFileInWorkspace(context.Background(), "test.txt", ReadFileInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Errorf("Error reading file: %v", err) } @@ -46,7 +46,7 @@ func TestWriteReadAndDeleteFileFromWorkspace(t *testing.T) { t.Errorf("Unexpected content: %s", content) } - err = g.DeleteFileInWorkspace(context.Background(), id, "test.txt") + err = g.DeleteFileInWorkspace(context.Background(), "test.txt", DeleteFileInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Errorf("Error deleting file: %v", err) } @@ -59,34 +59,34 @@ func TestLsComplexWorkspace(t *testing.T) { } t.Cleanup(func() { - err := g.DeleteWorkspace(context.Background(), id) + err := g.DeleteWorkspace(context.Background(), DeleteWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Errorf("Error deleting workspace: %v", err) } }) - err = g.WriteFileInWorkspace(context.Background(), id, "test/test1.txt", []byte("hello1")) + err = g.WriteFileInWorkspace(context.Background(), "test/test1.txt", []byte("hello1"), WriteFileInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Fatalf("Error creating file: %v", err) } - err = g.WriteFileInWorkspace(context.Background(), id, "test1/test2.txt", []byte("hello2")) + err = g.WriteFileInWorkspace(context.Background(), "test1/test2.txt", []byte("hello2"), WriteFileInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Fatalf("Error creating file: %v", err) } - err = g.WriteFileInWorkspace(context.Background(), id, "test1/test3.txt", []byte("hello3")) + err = g.WriteFileInWorkspace(context.Background(), "test1/test3.txt", []byte("hello3"), WriteFileInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Fatalf("Error creating file: %v", err) } - err = g.WriteFileInWorkspace(context.Background(), id, ".hidden.txt", []byte("hidden")) + err = g.WriteFileInWorkspace(context.Background(), ".hidden.txt", []byte("hidden"), WriteFileInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Fatalf("Error creating hidden file: %v", err) } // List all files - content, err := g.ListFilesInWorkspace(context.Background(), id) + content, err := g.ListFilesInWorkspace(context.Background(), ListFilesInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Fatalf("Error listing files: %v", err) } @@ -96,7 +96,7 @@ func TestLsComplexWorkspace(t *testing.T) { } // List files in subdirectory - content, err = g.ListFilesInWorkspace(context.Background(), id, ListFilesInWorkspaceOptions{Prefix: "test1"}) + content, err = g.ListFilesInWorkspace(context.Background(), ListFilesInWorkspaceOptions{WorkspaceID: id, Prefix: "test1"}) if err != nil { t.Fatalf("Error listing files: %v", err) } @@ -106,13 +106,13 @@ func TestLsComplexWorkspace(t *testing.T) { } // Remove all files with test1 prefix - err = g.RemoveAllWithPrefix(context.Background(), id, "test1") + err = g.RemoveAll(context.Background(), RemoveAllOptions{WorkspaceID: id, WithPrefix: "test1"}) if err != nil { t.Fatalf("Error removing files: %v", err) } // List files in subdirectory - content, err = g.ListFilesInWorkspace(context.Background(), id) + content, err = g.ListFilesInWorkspace(context.Background(), ListFilesInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Fatalf("Error listing files: %v", err) } @@ -132,7 +132,7 @@ func TestCreateAndDeleteWorkspaceS3(t *testing.T) { t.Fatalf("Error creating workspace: %v", err) } - err = g.DeleteWorkspace(context.Background(), id) + err = g.DeleteWorkspace(context.Background(), DeleteWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Errorf("Error deleting workspace: %v", err) } @@ -149,18 +149,18 @@ func TestWriteReadAndDeleteFileFromWorkspaceS3(t *testing.T) { } t.Cleanup(func() { - err := g.DeleteWorkspace(context.Background(), id) + err := g.DeleteWorkspace(context.Background(), DeleteWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Errorf("Error deleting workspace: %v", err) } }) - err = g.WriteFileInWorkspace(context.Background(), id, "test.txt", []byte("test")) + err = g.WriteFileInWorkspace(context.Background(), "test.txt", []byte("test"), WriteFileInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Fatalf("Error creating file: %v", err) } - content, err := g.ReadFileInWorkspace(context.Background(), id, "test.txt") + content, err := g.ReadFileInWorkspace(context.Background(), "test.txt", ReadFileInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Errorf("Error reading file: %v", err) } @@ -169,7 +169,7 @@ func TestWriteReadAndDeleteFileFromWorkspaceS3(t *testing.T) { t.Errorf("Unexpected content: %s", content) } - err = g.DeleteFileInWorkspace(context.Background(), id, "test.txt") + err = g.DeleteFileInWorkspace(context.Background(), "test.txt", DeleteFileInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Errorf("Error deleting file: %v", err) } @@ -186,34 +186,34 @@ func TestLsComplexWorkspaceS3(t *testing.T) { } t.Cleanup(func() { - err := g.DeleteWorkspace(context.Background(), id) + err := g.DeleteWorkspace(context.Background(), DeleteWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Errorf("Error deleting workspace: %v", err) } }) - err = g.WriteFileInWorkspace(context.Background(), id, "test/test1.txt", []byte("hello1")) + err = g.WriteFileInWorkspace(context.Background(), "test/test1.txt", []byte("hello1"), WriteFileInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Fatalf("Error creating file: %v", err) } - err = g.WriteFileInWorkspace(context.Background(), id, "test1/test2.txt", []byte("hello2")) + err = g.WriteFileInWorkspace(context.Background(), "test1/test2.txt", []byte("hello2"), WriteFileInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Fatalf("Error creating file: %v", err) } - err = g.WriteFileInWorkspace(context.Background(), id, "test1/test3.txt", []byte("hello3")) + err = g.WriteFileInWorkspace(context.Background(), "test1/test3.txt", []byte("hello3"), WriteFileInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Fatalf("Error creating file: %v", err) } - err = g.WriteFileInWorkspace(context.Background(), id, ".hidden.txt", []byte("hidden")) + err = g.WriteFileInWorkspace(context.Background(), ".hidden.txt", []byte("hidden"), WriteFileInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Fatalf("Error creating hidden file: %v", err) } // List all files - content, err := g.ListFilesInWorkspace(context.Background(), id) + content, err := g.ListFilesInWorkspace(context.Background(), ListFilesInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Fatalf("Error listing files: %v", err) } @@ -223,7 +223,7 @@ func TestLsComplexWorkspaceS3(t *testing.T) { } // List files in subdirectory - content, err = g.ListFilesInWorkspace(context.Background(), id, ListFilesInWorkspaceOptions{Prefix: "test1"}) + content, err = g.ListFilesInWorkspace(context.Background(), ListFilesInWorkspaceOptions{WorkspaceID: id, Prefix: "test1"}) if err != nil { t.Fatalf("Error listing files: %v", err) } @@ -233,13 +233,13 @@ func TestLsComplexWorkspaceS3(t *testing.T) { } // Remove all files with test1 prefix - err = g.RemoveAllWithPrefix(context.Background(), id, "test1") + err = g.RemoveAll(context.Background(), RemoveAllOptions{WorkspaceID: id, WithPrefix: "test1"}) if err != nil { t.Fatalf("Error removing files: %v", err) } // List files in subdirectory - content, err = g.ListFilesInWorkspace(context.Background(), id) + content, err = g.ListFilesInWorkspace(context.Background(), ListFilesInWorkspaceOptions{WorkspaceID: id}) if err != nil { t.Fatalf("Error listing files: %v", err) }