Skip to content

Commit c3a3279

Browse files
authored
feat: simplify the workspace API and add support for s3 (#878)
Signed-off-by: Donnie Adams <donnie@acorn.io>
1 parent 419ccbb commit c3a3279

File tree

2 files changed

+25
-72
lines changed

2 files changed

+25
-72
lines changed

pkg/sdkserver/routes.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,7 @@ func (s *server) addRoutes(mux *http.ServeMux) {
7676
mux.HandleFunc("POST /workspaces/create", s.createWorkspace)
7777
mux.HandleFunc("POST /workspaces/delete", s.deleteWorkspace)
7878
mux.HandleFunc("POST /workspaces/list", s.listWorkspaceContents)
79-
mux.HandleFunc("POST /workspaces/mkdir", s.mkDirInWorkspace)
80-
mux.HandleFunc("POST /workspaces/rmdir", s.rmDirInWorkspace)
79+
mux.HandleFunc("POST /workspaces/remove-all-with-prefix", s.removeAllWithPrefixInWorkspace)
8180
mux.HandleFunc("POST /workspaces/write-file", s.writeFileInWorkspace)
8281
mux.HandleFunc("POST /workspaces/delete-file", s.removeFileInWorkspace)
8382
mux.HandleFunc("POST /workspaces/read-file", s.readFileInWorkspace)

pkg/sdkserver/workspaces.go

Lines changed: 24 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import (
1111
)
1212

1313
type workspaceCommonRequest struct {
14-
ID string `json:"id"`
15-
WorkspaceTool string `json:"workspaceTool"`
14+
ID string `json:"id"`
15+
WorkspaceTool string `json:"workspaceTool"`
16+
Env []string `json:"env"`
1617
}
1718

1819
func (w workspaceCommonRequest) getToolRepo() string {
@@ -50,7 +51,7 @@ func (s *server) createWorkspace(w http.ResponseWriter, r *http.Request) {
5051
out, err := s.client.Run(
5152
r.Context(),
5253
prg,
53-
s.gptscriptOpts.Env,
54+
reqObject.Env,
5455
fmt.Sprintf(
5556
`{"provider": "%s", "data_home": "%s", "workspace_ids": "%s"}`,
5657
reqObject.ProviderType, reqObject.DirectoryDataHome, strings.Join(reqObject.FromWorkspaceIDs, ","),
@@ -85,7 +86,7 @@ func (s *server) deleteWorkspace(w http.ResponseWriter, r *http.Request) {
8586
out, err := s.client.Run(
8687
r.Context(),
8788
prg,
88-
s.gptscriptOpts.Env,
89+
reqObject.Env,
8990
fmt.Sprintf(
9091
`{"workspace_id": "%s"}`,
9192
reqObject.ID,
@@ -102,10 +103,7 @@ func (s *server) deleteWorkspace(w http.ResponseWriter, r *http.Request) {
102103
type listWorkspaceContentsRequest struct {
103104
workspaceCommonRequest `json:",inline"`
104105
ID string `json:"id"`
105-
SubDir string `json:"subDir"`
106-
NonRecursive bool `json:"nonRecursive"`
107-
ExcludeHidden bool `json:"excludeHidden"`
108-
JSON bool `json:"json"`
106+
Prefix string `json:"prefix"`
109107
}
110108

111109
func (s *server) listWorkspaceContents(w http.ResponseWriter, r *http.Request) {
@@ -125,10 +123,10 @@ func (s *server) listWorkspaceContents(w http.ResponseWriter, r *http.Request) {
125123
out, err := s.client.Run(
126124
r.Context(),
127125
prg,
128-
s.gptscriptOpts.Env,
126+
reqObject.Env,
129127
fmt.Sprintf(
130-
`{"workspace_id": "%s", "ls_sub_dir": "%s", "ls_non_recursive": %t, "ls_exclude_hidden": %t, "ls_json": %t}`,
131-
reqObject.ID, reqObject.SubDir, reqObject.NonRecursive, reqObject.ExcludeHidden, reqObject.JSON,
128+
`{"workspace_id": "%s", "ls_prefix": "%s"}`,
129+
reqObject.ID, reqObject.Prefix,
132130
),
133131
)
134132
if err != nil {
@@ -139,22 +137,20 @@ func (s *server) listWorkspaceContents(w http.ResponseWriter, r *http.Request) {
139137
writeResponse(logger, w, map[string]any{"stdout": out})
140138
}
141139

142-
type mkDirRequest struct {
140+
type removeAllWithPrefixInWorkspaceRequest struct {
143141
workspaceCommonRequest `json:",inline"`
144-
DirectoryName string `json:"directoryName"`
145-
IgnoreExists bool `json:"ignoreExists"`
146-
CreateDirs bool `json:"createDirs"`
142+
Prefix string `json:"prefix"`
147143
}
148144

149-
func (s *server) mkDirInWorkspace(w http.ResponseWriter, r *http.Request) {
145+
func (s *server) removeAllWithPrefixInWorkspace(w http.ResponseWriter, r *http.Request) {
150146
logger := gcontext.GetLogger(r.Context())
151-
var reqObject mkDirRequest
147+
var reqObject removeAllWithPrefixInWorkspaceRequest
152148
if err := json.NewDecoder(r.Body).Decode(&reqObject); err != nil {
153149
writeError(logger, w, http.StatusBadRequest, fmt.Errorf("invalid request body: %w", err))
154150
return
155151
}
156152

157-
prg, err := loader.Program(r.Context(), reqObject.getToolRepo(), "Create Directory In Workspace", loader.Options{Cache: s.client.Cache})
153+
prg, err := loader.Program(r.Context(), reqObject.getToolRepo(), "Remove All With Prefix In Workspace", loader.Options{Cache: s.client.Cache})
158154
if err != nil {
159155
writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to load program: %w", err))
160156
return
@@ -163,48 +159,10 @@ func (s *server) mkDirInWorkspace(w http.ResponseWriter, r *http.Request) {
163159
out, err := s.client.Run(
164160
r.Context(),
165161
prg,
166-
s.gptscriptOpts.Env,
162+
reqObject.Env,
167163
fmt.Sprintf(
168-
`{"workspace_id": "%s", "directory_name": "%s", "mk_dir_ignore_exists": %t, "mk_dir_create_dirs": %t}`,
169-
reqObject.ID, reqObject.DirectoryName, reqObject.IgnoreExists, reqObject.CreateDirs,
170-
),
171-
)
172-
if err != nil {
173-
writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to run program: %w", err))
174-
return
175-
}
176-
177-
writeResponse(logger, w, map[string]any{"stdout": out})
178-
}
179-
180-
type rmDirRequest struct {
181-
workspaceCommonRequest `json:",inline"`
182-
DirectoryName string `json:"directoryName"`
183-
IgnoreNotFound bool `json:"ignoreNotFound"`
184-
MustBeEmpty bool `json:"mustBeEmpty"`
185-
}
186-
187-
func (s *server) rmDirInWorkspace(w http.ResponseWriter, r *http.Request) {
188-
logger := gcontext.GetLogger(r.Context())
189-
var reqObject rmDirRequest
190-
if err := json.NewDecoder(r.Body).Decode(&reqObject); err != nil {
191-
writeError(logger, w, http.StatusBadRequest, fmt.Errorf("invalid request body: %w", err))
192-
return
193-
}
194-
195-
prg, err := loader.Program(r.Context(), reqObject.getToolRepo(), "Remove Directory In Workspace", loader.Options{Cache: s.client.Cache})
196-
if err != nil {
197-
writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to load program: %w", err))
198-
return
199-
}
200-
201-
out, err := s.client.Run(
202-
r.Context(),
203-
prg,
204-
s.gptscriptOpts.Env,
205-
fmt.Sprintf(
206-
`{"workspace_id": "%s", "directory_name": "%s", "ignore_not_found": %t, "rm_dir_must_be_empty": %t}`,
207-
reqObject.ID, reqObject.DirectoryName, reqObject.IgnoreNotFound, reqObject.MustBeEmpty,
164+
`{"workspace_id": "%s", "prefix": "%s"}`,
165+
reqObject.ID, reqObject.Prefix,
208166
),
209167
)
210168
if err != nil {
@@ -220,9 +178,6 @@ type writeFileInWorkspaceRequest struct {
220178
FilePath string `json:"filePath"`
221179
Contents string `json:"contents"`
222180
Base64EncodedInput bool `json:"base64EncodedInput"`
223-
MustNotExist bool `json:"mustNotExist"`
224-
CreateDirs bool `json:"createDirs"`
225-
WithoutCreate bool `json:"withoutCreate"`
226181
}
227182

228183
func (s *server) writeFileInWorkspace(w http.ResponseWriter, r *http.Request) {
@@ -242,10 +197,10 @@ func (s *server) writeFileInWorkspace(w http.ResponseWriter, r *http.Request) {
242197
out, err := s.client.Run(
243198
r.Context(),
244199
prg,
245-
s.gptscriptOpts.Env,
200+
reqObject.Env,
246201
fmt.Sprintf(
247-
`{"workspace_id": "%s", "file_path": "%s", "file_contents": "%s", "write_file_must_not_exist": %t, "write_file_create_dirs": %t, "write_file_without_create": %t, "write_file_base64_encoded_input": %t}`,
248-
reqObject.ID, reqObject.FilePath, reqObject.Contents, reqObject.MustNotExist, reqObject.CreateDirs, reqObject.WithoutCreate, reqObject.Base64EncodedInput,
202+
`{"workspace_id": "%s", "file_path": "%s", "file_contents": "%s", "write_file_base64_encoded_input": %t}`,
203+
reqObject.ID, reqObject.FilePath, reqObject.Contents, reqObject.Base64EncodedInput,
249204
),
250205
)
251206
if err != nil {
@@ -259,7 +214,6 @@ func (s *server) writeFileInWorkspace(w http.ResponseWriter, r *http.Request) {
259214
type rmFileInWorkspaceRequest struct {
260215
workspaceCommonRequest `json:",inline"`
261216
FilePath string `json:"filePath"`
262-
IgnoreNotFound bool `json:"ignoreNotFound"`
263217
}
264218

265219
func (s *server) removeFileInWorkspace(w http.ResponseWriter, r *http.Request) {
@@ -279,10 +233,10 @@ func (s *server) removeFileInWorkspace(w http.ResponseWriter, r *http.Request) {
279233
out, err := s.client.Run(
280234
r.Context(),
281235
prg,
282-
s.gptscriptOpts.Env,
236+
reqObject.Env,
283237
fmt.Sprintf(
284-
`{"workspace_id": "%s", "file_path": "%s", "ignore_not_found": %t}`,
285-
reqObject.ID, reqObject.FilePath, reqObject.IgnoreNotFound,
238+
`{"workspace_id": "%s", "file_path": "%s"}`,
239+
reqObject.ID, reqObject.FilePath,
286240
),
287241
)
288242
if err != nil {
@@ -316,7 +270,7 @@ func (s *server) readFileInWorkspace(w http.ResponseWriter, r *http.Request) {
316270
out, err := s.client.Run(
317271
r.Context(),
318272
prg,
319-
s.gptscriptOpts.Env,
273+
reqObject.Env,
320274
fmt.Sprintf(
321275
`{"workspace_id": "%s", "file_path": "%s", "read_file_base64_encode_output": %t}`,
322276
reqObject.ID, reqObject.FilePath, reqObject.Base64EncodeOutput,

0 commit comments

Comments
 (0)