diff --git a/api/openapi.yaml b/api/openapi.yaml index 91319aa..a963ead 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -718,8 +718,8 @@ paths: get: operationId: getTaskImage description: > - An image file from the task's worktree, for Markdown images and image attachments. path is absolute or relative - to the worktree; after resolving symlinks it must be inside the worktree. PNG, JPEG, GIF, WebP and SVG, chosen by extension. + An image file on the server, for Markdown images and image attachments. path is absolute or relative + to the task's worktree. PNG, JPEG, GIF, WebP and SVG, chosen by extension. parameters: - { name: path, in: query, required: true, schema: { type: string } } responses: @@ -732,7 +732,6 @@ paths: image/webp: { schema: { type: string, format: binary } } image/svg+xml: { schema: { type: string, format: binary } } "400": { $ref: "#/components/responses/Error" } - "403": { $ref: "#/components/responses/Error" } "404": { $ref: "#/components/responses/Error" } "409": { $ref: "#/components/responses/Error" } @@ -763,11 +762,10 @@ paths: get: operationId: getTaskDir description: > - One directory of the task's worktree, directories first, then by name. Entries named .git are left out; - gitignored entries are included and marked. - A path that leaves the worktree, through .. or a symlink, is refused. + One directory on the server, directories first, then by name. Entries named .git are left out; + gitignored entries inside the task's worktree are included and marked. parameters: - - { name: path, in: query, required: false, schema: { type: string }, description: "Slash-separated, relative to the worktree root; empty or absent for the root." } + - { name: path, in: query, required: false, schema: { type: string }, description: "Slash-separated, absolute or relative to the task's worktree root; empty or absent for the root." } responses: "200": description: The directory's entries. @@ -784,10 +782,9 @@ paths: get: operationId: getTaskFile description: > - A regular file in the task's worktree. Text is returned up to a size limit; binary files return no content. - A path that leaves the worktree, through .. or a symlink, is refused. + A regular file on the server. Text is returned up to a size limit; binary files return no content. parameters: - - { name: path, in: query, required: true, schema: { type: string }, description: "Slash-separated, relative to the worktree root." } + - { name: path, in: query, required: true, schema: { type: string }, description: "Slash-separated, absolute or relative to the task's worktree root." } responses: "200": description: The file. @@ -804,12 +801,11 @@ paths: get: operationId: getTaskRaw description: > - A regular file in the task's worktree, whole, with a content type chosen by its extension: an HTML page in the + A regular file on the server, whole, with a content type chosen by its extension: an HTML page in the app's Page view and the stylesheets, scripts and images it loads. The response carries a sandbox Content-Security-Policy, so a page opened from this address directly can't act on the API as its viewer. - A path that leaves the worktree, through .. or a symlink, is refused. parameters: - - { name: path, in: query, required: true, schema: { type: string }, description: "Slash-separated, relative to the worktree root." } + - { name: path, in: query, required: true, schema: { type: string }, description: "Slash-separated, absolute or relative to the task's worktree root." } responses: "200": description: The file's bytes. @@ -2342,13 +2338,14 @@ components: description: Work a task agent, or a merge, asks a connected Mac to do, sent over /api/clients/connect. properties: id: { type: string } - op: { type: string, enum: [bash, exec, upload, download, read_file, write_file, hands, sign] } + op: { type: string, enum: [bash, exec, upload, download, read_file, write_file, hands, sign, open_page, open_file] } command: { type: string, description: "bash, exec: run with zsh as a login shell in the home directory, in its own process group." } timeout_ms: { type: integer, description: "bash, exec, sign: kill the process group after this long." } ident: { type: string, description: "sign: the committer, as \"Name \", to sign as when the Mac's git config has no user.signingkey." } transfer: { type: string, description: "upload: the transfer id to get from /api/clients/transfers/{transferId}. download: the transfer id to put the archive to." } dest: { type: string, description: "upload: where the archive's one entry ends up, absolute or starting with ~/; whatever is there is replaced." } - path: { type: string, description: "download, read_file, write_file: the file (or, for download, file or directory) on the client, absolute or starting with ~/." } + path: { type: string, description: "download, read_file, write_file: the file (or, for download, file or directory) on the client, absolute or starting with ~/. open_page, open_file: the file (or, for open_file, file or directory, a directory ending in /) on the server, absolute or relative to the task's worktree." } + task: { type: string, description: "open_page, open_file: the task beside whose transcript the app shows the file: open_page in its page view, open_file in its Files tab." } data: { type: string, format: byte, description: "write_file: the file's new contents; parent directories are created. sign: the unsigned commit object, which the Mac signs with the program its git config names for its gpg.format (openpgp or x509), called as git calls it." } tool: { type: string, description: "hands: the byre-hands tool to call." } arguments: diff --git a/docs/agent-corrections.md b/docs/agent-corrections.md index 0215e04..7c9c068 100644 --- a/docs/agent-corrections.md +++ b/docs/agent-corrections.md @@ -22,3 +22,4 @@ Write rules only; omit incident histories and anecdotes. ## Security - Accept other local OS accounts reaching preview forwards and Chrome’s loopback debugger on personal Macs; do not add authentication or account-isolating brokers for that threat. +- Let the app show any server file an agent can read; do not confine the file, raw, image or directory endpoints, or agent tools that show or copy files, to the task's worktree. diff --git a/internal/agents/clients.go b/internal/agents/clients.go index b932aab..7ba3e11 100644 --- a/internal/agents/clients.go +++ b/internal/agents/clients.go @@ -4,9 +4,7 @@ import ( "context" "crypto/rand" "encoding/json" - "errors" "fmt" - "io/fs" "os" "os/exec" "path/filepath" @@ -62,13 +60,13 @@ func (m *Manager) clientTools(l *live) []mcp.Tool { }, { Name: "client_upload", - Description: "Copy a file or directory from your worktree to a client Mac, replacing whatever is at dest there. " + + Description: "Copy a file or directory from the Mac byre runs on to a client Mac, replacing whatever is at dest there. " + "Directories, app bundles included, are copied whole with their permissions and symlinks.", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "client": {"type": "string", "description": "The client's name from list_clients, or its id when several are connected from that Mac."}, - "path": {"type": "string", "description": "The file or directory, relative to your worktree."}, + "path": {"type": "string", "description": "The file or directory, relative to your worktree, absolute, or starting with ~/."}, "dest": {"type": "string", "description": "Its new path on the client, absolute or starting with ~/, e.g. ~/Applications/Byre.app."} }, "required": ["client", "path", "dest"] @@ -79,13 +77,14 @@ func (m *Manager) clientTools(l *live) []mcp.Tool { }, { Name: "client_open", - Description: "Show the human a file from your worktree on a client Mac: copy it into a fresh folder under ~/Library/Caches/byre/open/ there and open it with macOS's `open`, in that Mac's default app for its type (Preview for images and PDFs, the browser for HTML). " + - "Use it when the human asks to see a file on their Mac, or for a file the Files tab can't show; it brings an app forward on their screen.", + Description: "Show the human a file from the Mac byre runs on on a client Mac: copy it into a fresh folder under ~/Library/Caches/byre/open/ there and open it with macOS's `open`, in that Mac's default app for its type (Preview for images and PDFs, the browser for HTML). " + + "Use it when the human asks to see a file on their Mac, or for a file the Files tab can't show; it brings an app forward on their screen. " + + "Only the one file is copied, so an HTML page loses the stylesheets, scripts and images beside it; to show the human a file in byre's app, use show_page or show_file.", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "client": {"type": "string", "description": "The client's name from list_clients, or its id when several are connected from that Mac."}, - "path": {"type": "string", "description": "The file or directory, relative to your worktree."} + "path": {"type": "string", "description": "The file or directory, relative to your worktree, absolute, or starting with ~/."} }, "required": ["client", "path"] }`), @@ -93,16 +92,48 @@ func (m *Manager) clientTools(l *live) []mcp.Tool { return m.clientOpen(ctx, l, raw) }, }, + { + Name: "show_page", + Description: "Show the human a file from the Mac byre runs on in byre's app on a client Mac, rendered in the page view beside this task's transcript, as a browser would show it: an HTML page (loading the stylesheets, scripts and images beside it), a PDF, an image. " + + "Use it when the human asks to see a mockup, a preview or a document as it looks.", + InputSchema: json.RawMessage(`{ + "type": "object", + "properties": { + "client": {"type": "string", "description": "The client's name from list_clients, or its id when several are connected from that Mac."}, + "path": {"type": "string", "description": "The file, relative to your worktree, absolute, or starting with ~/."} + }, + "required": ["client", "path"] + }`), + Handler: func(ctx context.Context, raw json.RawMessage) (string, error) { + return m.show(ctx, l, raw, "show_page", api.OpenPage) + }, + }, + { + Name: "show_file", + Description: "Show the human a file or directory from the Mac byre runs on in byre's app on a client Mac, in this task's Files tab beside its transcript: a file's text (Markdown rendered, images drawn), or a directory's listing. " + + "Use it when the human asks to see a file's contents or a directory.", + InputSchema: json.RawMessage(`{ + "type": "object", + "properties": { + "client": {"type": "string", "description": "The client's name from list_clients, or its id when several are connected from that Mac."}, + "path": {"type": "string", "description": "The file or directory, relative to your worktree, absolute, or starting with ~/."} + }, + "required": ["client", "path"] + }`), + Handler: func(ctx context.Context, raw json.RawMessage) (string, error) { + return m.show(ctx, l, raw, "show_file", api.OpenFile) + }, + }, { Name: "client_download", - Description: "Copy a file or directory from a client Mac into your worktree, replacing whatever is at dest there. " + + Description: "Copy a file or directory from a client Mac to the Mac byre runs on, replacing whatever is at dest there. " + "Directories are copied whole with their permissions and symlinks.", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "client": {"type": "string", "description": "The client's name from list_clients, or its id when several are connected from that Mac."}, "path": {"type": "string", "description": "The file or directory on the client, absolute or starting with ~/."}, - "dest": {"type": "string", "description": "Its new path, relative to your worktree; parent directories are created."} + "dest": {"type": "string", "description": "Its new path, relative to your worktree, absolute, or starting with ~/; parent directories are created."} }, "required": ["client", "path", "dest"] }`), @@ -296,36 +327,30 @@ func (m *Manager) clientUpload(ctx context.Context, l *live, raw json.RawMessage if err != nil { return "", err } - clean, err := m.upload(ctx, l, args.Client, args.Path, args.Dest) + full, err := l.resolve(args.Path) if err != nil { return "", err } - return fmt.Sprintf("Copied %s to %s on %s.", clean, args.Dest, args.Client), nil + err = m.upload(ctx, args.Client, filepath.Clean(full), args.Dest) + if err != nil { + return "", err + } + return fmt.Sprintf("Copied %s to %s on %s.", args.Path, args.Dest, args.Client), nil } -func (m *Manager) upload(ctx context.Context, l *live, client, path, dest string) (string, error) { - clean := filepath.Clean(path) - if filepath.IsAbs(clean) { - return "", fmt.Errorf("path %q must be relative to your worktree", path) - } - root, err := os.OpenRoot(l.dir) +func (m *Manager) upload(ctx context.Context, client, full, dest string) error { + _, err := os.Lstat(full) if err != nil { - return "", err - } - _, err = root.Lstat(clean) - root.Close() - if err != nil { - return "", fmt.Errorf("path %q: %w", path, err) + return err } - full := filepath.Join(l.dir, clean) id := m.clients.AddTransfer(clients.Transfer{Dir: filepath.Dir(full), Name: filepath.Base(full)}) defer m.clients.RemoveTransfer(id) cctx, cancel := context.WithTimeout(ctx, copyTimeout) defer cancel() _, err = m.clients.Call(cctx, client, api.ClientRequest{Op: api.Upload, Transfer: &id, Dest: &dest}) - return clean, err + return err } type clientOpenArgs struct { @@ -339,13 +364,16 @@ func (m *Manager) clientOpen(ctx context.Context, l *live, raw json.RawMessage) if err != nil { return "", fmt.Errorf("malformed client_open call: %w", err) } - dir := "~/Library/Caches/byre/open/" + rand.Text() - name := filepath.Base(filepath.Clean(args.Path)) - if name == "." { - return "", errors.New("path names your worktree, not a file in it") + full, err := l.resolve(args.Path) + if err != nil { + return "", err } + full = filepath.Clean(full) + dir := "~/Library/Caches/byre/open/" + rand.Text() + name := filepath.Base(full) dest := dir + "/" + name - clean, err := m.upload(ctx, l, args.Client, args.Path, dest) + clean := args.Path + err = m.upload(ctx, args.Client, full, dest) if err != nil { return "", err } @@ -361,6 +389,45 @@ func (m *Manager) clientOpen(ctx context.Context, l *live, raw json.RawMessage) return fmt.Sprintf("Opened %s on %s, copied to %s.", clean, args.Client, dest), nil } +func (m *Manager) show(ctx context.Context, l *live, raw json.RawMessage, tool string, op api.ClientRequestOp) (string, error) { + args := clientOpenArgs{} + err := json.Unmarshal(raw, &args) + if err != nil { + return "", fmt.Errorf("malformed %s call: %w", tool, err) + } + full, err := l.resolve(args.Path) + if err != nil { + return "", err + } + full = filepath.Clean(full) + fi, err := os.Stat(full) + if err != nil { + return "", err + } + if op == api.OpenPage && fi.IsDir() { + return "", fmt.Errorf("%s is a directory; the page view shows a file", args.Path) + } + + shown := full + rel, err := filepath.Rel(l.dir, full) + if err == nil && filepath.IsLocal(rel) { + shown = rel + } + shown = filepath.ToSlash(shown) + if shown == "." { + shown = "" + } else if fi.IsDir() { + shown += "/" + } + cctx, cancel := context.WithTimeout(ctx, fileTimeout) + defer cancel() + _, err = m.clients.Call(cctx, args.Client, api.ClientRequest{Op: op, Task: &l.taskID, Path: &shown}) + if err != nil { + return "", err + } + return fmt.Sprintf("Showing %s on %s.", shown, args.Client), nil +} + func (m *Manager) clientDownload(ctx context.Context, l *live, raw json.RawMessage) (string, error) { args := clientTransferArgs{} err := json.Unmarshal(raw, &args) @@ -371,18 +438,16 @@ func (m *Manager) clientDownload(ctx context.Context, l *live, raw json.RawMessa if err != nil { return "", err } - dest := filepath.Clean(args.Dest) - if filepath.IsAbs(dest) || dest == "." { - return "", fmt.Errorf("dest %q must be a path inside your worktree, relative to it", args.Dest) - } - - root, err := os.OpenRoot(l.dir) + dest, err := l.resolve(args.Dest) if err != nil { return "", err } - defer root.Close() + dest = filepath.Clean(dest) + if dest == filepath.Clean(l.dir) { + return "", fmt.Errorf("dest %q is your worktree itself", args.Dest) + } parent := filepath.Dir(dest) - err = root.MkdirAll(parent, 0o755) + err = os.MkdirAll(parent, 0o755) if err != nil { return "", fmt.Errorf("dest %q: %w", args.Dest, err) } @@ -403,27 +468,27 @@ func (m *Manager) clientDownload(ctx context.Context, l *live, raw json.RawMessa } stage := filepath.Join(parent, ".byre-download-"+id) - err = root.Mkdir(stage, 0o700) + err = os.Mkdir(stage, 0o700) if err != nil { return "", err } - defer root.RemoveAll(stage) - out, err := exec.CommandContext(ctx, "tar", "-xzf", filepath.Join(tmp, "archive.tgz"), "-C", filepath.Join(l.dir, stage)).CombinedOutput() + defer os.RemoveAll(stage) + out, err := exec.CommandContext(ctx, "tar", "-xzf", filepath.Join(tmp, "archive.tgz"), "-C", stage).CombinedOutput() if err != nil { return "", fmt.Errorf("unpack: %w: %s", err, out) } - entries, err := fs.ReadDir(root.FS(), stage) + entries, err := os.ReadDir(stage) if err != nil { return "", err } if len(entries) != 1 { return "", fmt.Errorf("unpack: the archive holds %d entries, not 1", len(entries)) } - err = root.RemoveAll(dest) + err = os.RemoveAll(dest) if err != nil { return "", err } - err = root.Rename(filepath.Join(stage, entries[0].Name()), dest) + err = os.Rename(filepath.Join(stage, entries[0].Name()), dest) if err != nil { return "", err } diff --git a/internal/agents/inbox.go b/internal/agents/inbox.go index acceb8a..120cf9f 100644 --- a/internal/agents/inbox.go +++ b/internal/agents/inbox.go @@ -43,8 +43,7 @@ func (m *Manager) askTool(l *live) mcp.Tool { "its example, code, commands and trade-offs, so the human never has to match a paragraph above to an option below. " + "Text above the list covers only what all the choices share. " + "To choose between images (icons, screenshots, mockups), give each choice exactly one indented line, its image " + - "(`![alt](path)`, the path relative to your worktree or absolute inside it; byre serves no image from outside the worktree, " + - "so an image in a scratch or temp directory shows as \"image not available\": copy it into the worktree first), and nothing else: the choices then show side by side as a grid " + + "(`![alt](path)`, the path relative to your worktree or absolute), and nothing else: the choices then show side by side as a grid " + "so the human can compare them at a glance. " + "End your turn after asking; the answer arrives as your next message. " + "An answer of \"Use your judgment for this decision and continue within the existing task instructions.\" lets you settle that one decision yourself; " + diff --git a/internal/api/api.gen.go b/internal/api/api.gen.go index ecc580b..5165024 100644 --- a/internal/api/api.gen.go +++ b/internal/api/api.gen.go @@ -144,6 +144,8 @@ const ( Download ClientRequestOp = "download" Exec ClientRequestOp = "exec" Hands ClientRequestOp = "hands" + OpenFile ClientRequestOp = "open_file" + OpenPage ClientRequestOp = "open_page" ReadFile ClientRequestOp = "read_file" Sign ClientRequestOp = "sign" Upload ClientRequestOp = "upload" @@ -161,6 +163,10 @@ func (e ClientRequestOp) Valid() bool { return true case Hands: return true + case OpenFile: + return true + case OpenPage: + return true case ReadFile: return true case Sign: @@ -813,9 +819,12 @@ type ClientRequest struct { Ident *string `json:"ident,omitempty"` Op ClientRequestOp `json:"op"` - // Path download, read_file, write_file: the file (or, for download, file or directory) on the client, absolute or starting with ~/. + // Path download, read_file, write_file: the file (or, for download, file or directory) on the client, absolute or starting with ~/. open_page, open_file: the file (or, for open_file, file or directory, a directory ending in /) on the server, absolute or relative to the task's worktree. Path *string `json:"path,omitempty"` + // Task open_page, open_file: the task beside whose transcript the app shows the file: open_page in its page view, open_file in its Files tab. + Task *string `json:"task,omitempty"` + // TimeoutMs bash, exec, sign: kill the process group after this long. TimeoutMs *int `json:"timeout_ms,omitempty"` @@ -1853,7 +1862,7 @@ type GetTaskDiffParams struct { // GetTaskDirParams defines parameters for GetTaskDir. type GetTaskDirParams struct { - // Path Slash-separated, relative to the worktree root; empty or absent for the root. + // Path Slash-separated, absolute or relative to the task's worktree root; empty or absent for the root. Path *string `form:"path,omitempty" json:"path,omitempty"` } @@ -1865,7 +1874,7 @@ type ListTaskEventsParams struct { // GetTaskFileParams defines parameters for GetTaskFile. type GetTaskFileParams struct { - // Path Slash-separated, relative to the worktree root. + // Path Slash-separated, absolute or relative to the task's worktree root. Path string `form:"path" json:"path"` } @@ -1894,7 +1903,7 @@ type MergeTaskJSONBodyTarget string // GetTaskRawParams defines parameters for GetTaskRaw. type GetTaskRawParams struct { - // Path Slash-separated, relative to the worktree root. + // Path Slash-separated, absolute or relative to the task's worktree root. Path string `form:"path" json:"path"` } @@ -4760,347 +4769,349 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H // const string: with thousands of chunks the chained `+` fold is several // times slower for the Go compiler than parsing a slice literal. var swaggerSpec = []string{ - "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", + "K0Sm0PbzlakZkbgJE1HAAN8BM/nVKKk/fPhfAwA=", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/internal/server/files.go b/internal/server/files.go index e690ed7..13ee79a 100644 --- a/internal/server/files.go +++ b/internal/server/files.go @@ -33,19 +33,9 @@ func (s *Server) GetTaskDir(w http.ResponseWriter, r *http.Request, taskID strin if params.Path != nil { rel = *params.Path } - name, ok := worktreeName(w, rel) - if !ok { - return - } + name, full := taskPath(t.WorktreePath, rel) - root, err := os.OpenRoot(t.WorktreePath) - if err != nil { - writeError(w, http.StatusInternalServerError, err) - return - } - defer root.Close() - - f, err := root.Open(name) + f, err := os.Open(full) if err != nil { writePathError(w, err) return @@ -73,7 +63,7 @@ func (s *Server) GetTaskDir(w http.ResponseWriter, r *http.Request, taskID strin if de.Name() == ".git" { continue } - entries = append(entries, dirEntry(root, path.Join(name, de.Name()), de)) + entries = append(entries, dirEntry(filepath.Join(full, de.Name()), de)) } slices.SortFunc(entries, func(a, b api.DirEntry) int { if (a.Type == api.DirEntryTypeDir) != (b.Type == api.DirEntryTypeDir) { @@ -94,11 +84,15 @@ func (s *Server) GetTaskDir(w http.ResponseWriter, r *http.Request, taskID strin listing.Truncated = true } - real, err := realDir(t.WorktreePath, name) + real, err := realDir(t.WorktreePath, full) if err != nil { writeError(w, http.StatusInternalServerError, err) return } + if !filepath.IsLocal(real) { + writeJSON(w, http.StatusOK, listing) + return + } paths := []string{} for _, e := range listing.Entries { paths = append(paths, path.Join(real, e.Name)) @@ -114,12 +108,12 @@ func (s *Server) GetTaskDir(w http.ResponseWriter, r *http.Request, taskID strin writeJSON(w, http.StatusOK, listing) } -func realDir(worktree, name string) (string, error) { +func realDir(worktree, full string) (string, error) { root, err := filepath.EvalSymlinks(worktree) if err != nil { return "", err } - dir, err := filepath.EvalSymlinks(filepath.Join(worktree, name)) + dir, err := filepath.EvalSymlinks(full) if err != nil { return "", err } @@ -130,14 +124,14 @@ func realDir(worktree, name string) (string, error) { return filepath.ToSlash(rel), nil } -func dirEntry(root *os.Root, name string, de fs.DirEntry) api.DirEntry { +func dirEntry(full string, de fs.DirEntry) api.DirEntry { e := api.DirEntry{Name: de.Name(), Type: api.DirEntryTypeOther} var fi fs.FileInfo var err error if de.Type()&fs.ModeSymlink != 0 { e.Symlink = true - fi, err = root.Stat(name) + fi, err = os.Stat(full) } else { fi, err = de.Info() } @@ -164,19 +158,9 @@ func (s *Server) GetTaskFile(w http.ResponseWriter, r *http.Request, taskID stri writeError(w, http.StatusBadRequest, errors.New("path is required")) return } - name, ok := worktreeName(w, params.Path) - if !ok { - return - } + name, full := taskPath(t.WorktreePath, params.Path) - root, err := os.OpenRoot(t.WorktreePath) - if err != nil { - writeError(w, http.StatusInternalServerError, err) - return - } - defer root.Close() - - fi, err := root.Stat(name) + fi, err := os.Stat(full) if err != nil { writePathError(w, err) return @@ -186,7 +170,7 @@ func (s *Server) GetTaskFile(w http.ResponseWriter, r *http.Request, taskID stri return } - f, err := root.Open(name) + f, err := os.Open(full) if err != nil { writePathError(w, err) return @@ -225,19 +209,9 @@ func (s *Server) GetTaskRaw(w http.ResponseWriter, r *http.Request, taskID strin writeError(w, http.StatusBadRequest, errors.New("path is required")) return } - name, ok := worktreeName(w, params.Path) - if !ok { - return - } + name, full := taskPath(t.WorktreePath, params.Path) - root, err := os.OpenRoot(t.WorktreePath) - if err != nil { - writeError(w, http.StatusInternalServerError, err) - return - } - defer root.Close() - - f, err := root.Open(name) + f, err := os.Open(full) if err != nil { writePathError(w, err) return @@ -265,21 +239,12 @@ func (s *Server) GetTaskRaw(w http.ResponseWriter, r *http.Request, taskID strin http.ServeContent(w, r, "", fi.ModTime(), f) } -func worktreeName(w http.ResponseWriter, rel string) (string, bool) { - if rel == "" { - return ".", true +func taskPath(worktree, p string) (string, string) { + name := filepath.Clean(filepath.FromSlash(p)) + if filepath.IsAbs(name) { + return filepath.ToSlash(name), name } - name := filepath.FromSlash(rel) - if !filepath.IsLocal(name) { - writeError(w, http.StatusBadRequest, fmt.Errorf("%s is not a path inside the worktree", rel)) - return "", false - } - name = filepath.ToSlash(filepath.Clean(name)) - if slices.Contains(strings.Split(name, "/"), ".git") { - writeError(w, http.StatusBadRequest, fmt.Errorf("%s is inside .git", rel)) - return "", false - } - return name, true + return filepath.ToSlash(name), filepath.Join(worktree, name) } func writePathError(w http.ResponseWriter, err error) { diff --git a/internal/server/images.go b/internal/server/images.go index 35daaec..18729ad 100644 --- a/internal/server/images.go +++ b/internal/server/images.go @@ -9,7 +9,6 @@ import ( "path/filepath" "strings" - "g.fc.run/ai/byre/internal/agents" "g.fc.run/ai/byre/internal/api" ) @@ -28,17 +27,6 @@ func (s *Server) GetTaskImage(w http.ResponseWriter, r *http.Request, taskID str return } - root, err := filepath.EvalSymlinks(t.WorktreePath) - if err != nil { - writeError(w, http.StatusInternalServerError, err) - return - } - media, err := filepath.EvalSymlinks(agents.MediaDir(t.WorktreePath)) - if err != nil && !errors.Is(err, fs.ErrNotExist) { - writeError(w, http.StatusInternalServerError, err) - return - } - path := params.Path if !filepath.IsAbs(path) { path = filepath.Join(t.WorktreePath, path) @@ -53,11 +41,6 @@ func (s *Server) GetTaskImage(w http.ResponseWriter, r *http.Request, taskID str return } - if !within(root, real) && (media == "" || !within(media, real)) { - writeError(w, http.StatusForbidden, fmt.Errorf("%s is outside the task's worktree and media folder", params.Path)) - return - } - contentType := worktreeImageTypes[strings.ToLower(filepath.Ext(real))] if contentType == "" { writeError(w, http.StatusBadRequest, fmt.Errorf("%s is not a PNG, JPEG, GIF, WebP or SVG file", params.Path)) @@ -87,8 +70,3 @@ func (s *Server) GetTaskImage(w http.ResponseWriter, r *http.Request, taskID str w.Header().Set("Cache-Control", "private, no-cache") http.ServeContent(w, r, "", info.ModTime(), f) } - -func within(root, path string) bool { - rel, err := filepath.Rel(root, path) - return err == nil && rel != ".." && !strings.HasPrefix(rel, ".."+string(filepath.Separator)) -} diff --git a/mac/Sources/Byre/Files.swift b/mac/Sources/Byre/Files.swift index 7758f1a..42264d8 100644 --- a/mac/Sources/Byre/Files.swift +++ b/mac/Sources/Byre/Files.swift @@ -22,21 +22,36 @@ extension Store { func openFile(_ taskId: String, _ path: String) { if isPage(path) { - route("#/task/\(taskId)") - openPage(.file(taskId: taskId, path: path)) + showPage(taskId, path) return } - filePlaces[taskId] = path.hasSuffix("/") ? FilePlace(dir: String(path.dropLast())) : FilePlace(dir: parent(path), file: path) + showInFiles(taskId, path) + } + + func showPage(_ taskId: String, _ path: String) { + route("#/task/\(taskId)") + openPage(.file(taskId: taskId, path: path)) + } + + func showInFiles(_ taskId: String, _ path: String) { + if path.isEmpty || path.hasSuffix("/") { + filePlaces[taskId] = FilePlace(dir: path == "/" ? path : String(path.dropLast())) + } else { + filePlaces[taskId] = FilePlace(dir: parent(path), file: path) + } route("#/task/\(taskId)/files") } } private func join(_ dir: String, _ name: String) -> String { - dir.isEmpty ? name : "\(dir)/\(name)" + dir.isEmpty ? name : dir.hasSuffix("/") ? "\(dir)\(name)" : "\(dir)/\(name)" } private func parent(_ path: String) -> String { - path.lastIndex(of: "/").map { String(path[..<$0]) } ?? "" + guard let i = path.lastIndex(of: "/") else { + return "" + } + return i == path.startIndex ? "/" : String(path[.. String { @@ -202,13 +217,18 @@ private struct FilesHead: View { var body: some View { let p = model.place let path = p.file ?? p.dir - let parts = path.isEmpty ? [] : path.components(separatedBy: "/") + let absolute = path.hasPrefix("/") + let rest = absolute ? String(path.dropFirst()) : path + let parts = rest.isEmpty ? [] : rest.components(separatedBy: "/") + let base = absolute ? "/" : "" HStack(alignment: .firstTextBaseline, spacing: 12) { FlowLayout(spacing: 2) { - crumb("worktree", "", parts.isEmpty) + crumb(absolute ? "/" : "worktree", base, parts.isEmpty) ForEach(Array(parts.enumerated()), id: \.offset) { i, part in - Text("/").foregroundStyle(Palette.muted) - crumb(part, parts[...i].joined(separator: "/"), i == parts.count - 1) + if !absolute || i > 0 { + Text("/").foregroundStyle(Palette.muted) + } + crumb(part, base + parts[...i].joined(separator: "/"), i == parts.count - 1) } } Spacer(minLength: 0) @@ -261,7 +281,7 @@ private struct FilesBody: View { } else if let l = model.listing { ScrollView { VStack(alignment: .leading, spacing: 0) { - if !l.path.isEmpty { + if !l.path.isEmpty && l.path != "/" { EntryRow(label: "../", kind: .dir, ignored: false, meta: "", symlink: false) { model.go(FilePlace(dir: parent(l.path))) } diff --git a/mac/Sources/Byre/Questions.swift b/mac/Sources/Byre/Questions.swift index 4310e8a..6a6c70f 100644 --- a/mac/Sources/Byre/Questions.swift +++ b/mac/Sources/Byre/Questions.swift @@ -509,7 +509,7 @@ private struct Attachments: View { let path = a.path ?? "" let root = (store.findTask(taskId)?.worktreePath ?? "") + "/" let rel = path.hasPrefix(root) ? String(path.dropFirst(root.count)) : path - if isPage(rel) && !rel.hasPrefix("/") { + if isPage(rel) { Button(path) { store.openFile(taskId, rel) } diff --git a/mac/Sources/Byre/Remote.swift b/mac/Sources/Byre/Remote.swift index 5eed96a..acfb0b2 100644 --- a/mac/Sources/Byre/Remote.swift +++ b/mac/Sources/Byre/Remote.swift @@ -30,6 +30,7 @@ private let signScript = """ @MainActor final class Remote { let api: API + weak var store: Store? private var ws: URLSessionWebSocketTask? private var stopped = false private var heard = Date() @@ -188,6 +189,12 @@ final class Remote { case .sign: let (code, status, signature) = try await sign(Data(req.data?.data ?? []), as: req.ident ?? "", timeoutMs: req.timeoutMs ?? 120_000) return ClientReply(id: req.id, exitCode: code, output: status, data: Base64EncodedData(signature)) + case .openPage: + store!.showPage(req.task ?? "", req.path ?? "") + return ClientReply(id: req.id) + case .openFile: + store!.showInFiles(req.task ?? "", req.path ?? "") + return ClientReply(id: req.id) } } diff --git a/mac/Sources/Byre/Store.swift b/mac/Sources/Byre/Store.swift index 1b0481b..142b631 100644 --- a/mac/Sources/Byre/Store.swift +++ b/mac/Sources/Byre/Store.swift @@ -111,6 +111,7 @@ final class Store { leadFeed = Feed(shown: { true }) paneFocus = PaneFocus(api: api) remote = Remote(api: api) + remote.store = self } func sends(_ key: String) -> LocalSends {