From d8ce1cee413fbaf9c2b75fe5fe749478a34f607b Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Thu, 22 Oct 2026 19:17:08 -0700 Subject: [PATCH] Add a Files tab to the project page --- api/openapi.yaml | 59 ++ internal/api/api.gen.go | 870 ++++++++++++++++------------ internal/server/files.go | 44 +- internal/server/images.go | 22 +- mac/Sources/Byre/Dialogs.swift | 6 +- mac/Sources/Byre/Files.swift | 109 +++- mac/Sources/Byre/Images.swift | 15 +- mac/Sources/Byre/MarkdownView.swift | 44 +- mac/Sources/Byre/Panes.swift | 2 +- mac/Sources/Byre/Project.swift | 31 +- mac/Sources/Byre/Questions.swift | 2 +- mac/Sources/Byre/Store.swift | 2 +- 12 files changed, 769 insertions(+), 437 deletions(-) diff --git a/api/openapi.yaml b/api/openapi.yaml index 3a07f8b..b7e9681 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -461,6 +461,65 @@ paths: schema: { $ref: "#/components/schemas/Todo" } "404": { $ref: "#/components/responses/Error" } + /api/projects/{projectId}/dir: + parameters: + - { name: projectId, in: path, required: true, schema: { type: string } } + get: + operationId: getProjectDir + description: > + One directory on the server, directories first, then by name. Entries named .git are left out; + gitignored entries inside the project's repository checkout are included and marked. + parameters: + - { name: path, in: query, required: false, schema: { type: string }, description: "Slash-separated, absolute or relative to the project's repository root; empty or absent for the root." } + responses: + "200": + description: The directory's entries. + content: + application/json: + schema: { $ref: "#/components/schemas/DirListing" } + "400": { $ref: "#/components/responses/Error" } + "404": { $ref: "#/components/responses/Error" } + + /api/projects/{projectId}/file: + parameters: + - { name: projectId, in: path, required: true, schema: { type: string } } + get: + operationId: getProjectFile + description: > + 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, absolute or relative to the project's repository root." } + responses: + "200": + description: The file. + content: + application/json: + schema: { $ref: "#/components/schemas/FileContent" } + "400": { $ref: "#/components/responses/Error" } + "404": { $ref: "#/components/responses/Error" } + + /api/projects/{projectId}/image: + parameters: + - { name: projectId, in: path, required: true, schema: { type: string } } + get: + operationId: getProjectImage + description: > + An image file on the server. path is absolute or relative to the project's repository root. + PNG, JPEG, GIF, WebP and SVG, chosen by extension. + parameters: + - { name: path, in: query, required: true, schema: { type: string } } + responses: + "200": + description: The file's bytes. + content: + image/png: { schema: { type: string, format: binary } } + image/jpeg: { schema: { type: string, format: binary } } + image/gif: { schema: { type: string, format: binary } } + image/webp: { schema: { type: string, format: binary } } + image/svg+xml: { schema: { type: string, format: binary } } + "400": { $ref: "#/components/responses/Error" } + "404": { $ref: "#/components/responses/Error" } + /api/projects/{projectId}/todo/tasks: parameters: - { name: projectId, in: path, required: true, schema: { type: string } } diff --git a/internal/api/api.gen.go b/internal/api/api.gen.go index 267766d..5ef507e 100644 --- a/internal/api/api.gen.go +++ b/internal/api/api.gen.go @@ -1873,6 +1873,23 @@ type ListLeadEventsParams struct { Turns *int `form:"turns,omitempty" json:"turns,omitempty"` } +// GetProjectDirParams defines parameters for GetProjectDir. +type GetProjectDirParams struct { + // Path Slash-separated, absolute or relative to the project's repository root; empty or absent for the root. + Path *string `form:"path,omitempty" json:"path,omitempty"` +} + +// GetProjectFileParams defines parameters for GetProjectFile. +type GetProjectFileParams struct { + // Path Slash-separated, absolute or relative to the project's repository root. + Path string `form:"path" json:"path"` +} + +// GetProjectImageParams defines parameters for GetProjectImage. +type GetProjectImageParams struct { + Path string `form:"path" json:"path"` +} + // GetTaskChangesParams defines parameters for GetTaskChanges. type GetTaskChangesParams struct { // Since A commit to compare with instead of the merge-base, such as a user.message event's head. Not allowed with snapshot. @@ -2170,6 +2187,15 @@ type ServerInterface interface { // (PUT /api/projects/{projectId}/audit-workflow) SetAuditWorkflow(w http.ResponseWriter, r *http.Request, projectId string) + // (GET /api/projects/{projectId}/dir) + GetProjectDir(w http.ResponseWriter, r *http.Request, projectId string, params GetProjectDirParams) + + // (GET /api/projects/{projectId}/file) + GetProjectFile(w http.ResponseWriter, r *http.Request, projectId string, params GetProjectFileParams) + + // (GET /api/projects/{projectId}/image) + GetProjectImage(w http.ResponseWriter, r *http.Request, projectId string, params GetProjectImageParams) + // (PUT /api/projects/{projectId}/review-workflow) SetReviewWorkflow(w http.ResponseWriter, r *http.Request, projectId string) @@ -3147,6 +3173,132 @@ func (siw *ServerInterfaceWrapper) SetAuditWorkflow(w http.ResponseWriter, r *ht handler.ServeHTTP(w, r) } +// GetProjectDir operation middleware +func (siw *ServerInterfaceWrapper) GetProjectDir(w http.ResponseWriter, r *http.Request) { + + var err error + _ = err + + // ------------- Path parameter "projectId" ------------- + var projectId string + + err = runtime.BindStyledParameterWithOptions("simple", "projectId", r.PathValue("projectId"), &projectId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "", ValueIsUnescaped: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectId", Err: err}) + return + } + + // Parameter object where we will unmarshal all parameters from the context + var params GetProjectDirParams + + // ------------- Optional query parameter "path" ------------- + + err = runtime.BindQueryParameterWithOptions("form", true, false, "path", r.URL.Query(), ¶ms.Path, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) + if err != nil { + var requiredError *runtime.RequiredParameterError + if errors.As(err, &requiredError) { + siw.ErrorHandlerFunc(w, r, &RequiredParamError{ParamName: "path"}) + } else { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "path", Err: err}) + } + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetProjectDir(w, r, projectId, params) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + +// GetProjectFile operation middleware +func (siw *ServerInterfaceWrapper) GetProjectFile(w http.ResponseWriter, r *http.Request) { + + var err error + _ = err + + // ------------- Path parameter "projectId" ------------- + var projectId string + + err = runtime.BindStyledParameterWithOptions("simple", "projectId", r.PathValue("projectId"), &projectId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "", ValueIsUnescaped: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectId", Err: err}) + return + } + + // Parameter object where we will unmarshal all parameters from the context + var params GetProjectFileParams + + // ------------- Required query parameter "path" ------------- + + err = runtime.BindQueryParameterWithOptions("form", true, true, "path", r.URL.Query(), ¶ms.Path, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) + if err != nil { + var requiredError *runtime.RequiredParameterError + if errors.As(err, &requiredError) { + siw.ErrorHandlerFunc(w, r, &RequiredParamError{ParamName: "path"}) + } else { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "path", Err: err}) + } + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetProjectFile(w, r, projectId, params) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + +// GetProjectImage operation middleware +func (siw *ServerInterfaceWrapper) GetProjectImage(w http.ResponseWriter, r *http.Request) { + + var err error + _ = err + + // ------------- Path parameter "projectId" ------------- + var projectId string + + err = runtime.BindStyledParameterWithOptions("simple", "projectId", r.PathValue("projectId"), &projectId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "", ValueIsUnescaped: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectId", Err: err}) + return + } + + // Parameter object where we will unmarshal all parameters from the context + var params GetProjectImageParams + + // ------------- Required query parameter "path" ------------- + + err = runtime.BindQueryParameterWithOptions("form", true, true, "path", r.URL.Query(), ¶ms.Path, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) + if err != nil { + var requiredError *runtime.RequiredParameterError + if errors.As(err, &requiredError) { + siw.ErrorHandlerFunc(w, r, &RequiredParamError{ParamName: "path"}) + } else { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "path", Err: err}) + } + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetProjectImage(w, r, projectId, params) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // SetReviewWorkflow operation middleware func (siw *ServerInterfaceWrapper) SetReviewWorkflow(w http.ResponseWriter, r *http.Request) { @@ -4790,6 +4942,9 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H m.HandleFunc(http.MethodDelete+" "+options.BaseURL+"/api/schedules/{scheduleId}", wrapper.DeleteSchedule) m.HandleFunc(http.MethodPut+" "+options.BaseURL+"/api/schedules/{scheduleId}", wrapper.UpdateSchedule) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/projects/{projectId}/todo", wrapper.GetTodo) + m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/projects/{projectId}/dir", wrapper.GetProjectDir) + m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/projects/{projectId}/file", wrapper.GetProjectFile) + m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/projects/{projectId}/image", wrapper.GetProjectImage) m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/projects/{projectId}/todo/tasks", wrapper.StartTodoItem) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}", wrapper.GetTask) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/workflow", wrapper.GetTaskWorkflow) @@ -4856,363 +5011,364 @@ 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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", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/internal/server/files.go b/internal/server/files.go index 13ee79a..a846a98 100644 --- a/internal/server/files.go +++ b/internal/server/files.go @@ -29,11 +29,24 @@ func (s *Server) GetTaskDir(w http.ResponseWriter, r *http.Request, taskID strin if !ok { return } - rel := "" - if params.Path != nil { - rel = *params.Path + serveDir(w, r, t.WorktreePath, params.Path) +} + +func (s *Server) GetProjectDir(w http.ResponseWriter, r *http.Request, projectID string, params api.GetProjectDirParams) { + p, err := s.store.GetProject(r.Context(), projectID) + if err != nil { + writeStoreError(w, err) + return } - name, full := taskPath(t.WorktreePath, rel) + serveDir(w, r, p.RepoPath, params.Path) +} + +func serveDir(w http.ResponseWriter, r *http.Request, root string, p *string) { + rel := "" + if p != nil { + rel = *p + } + name, full := taskPath(root, rel) f, err := os.Open(full) if err != nil { @@ -84,7 +97,7 @@ func (s *Server) GetTaskDir(w http.ResponseWriter, r *http.Request, taskID strin listing.Truncated = true } - real, err := realDir(t.WorktreePath, full) + real, err := realDir(root, full) if err != nil { writeError(w, http.StatusInternalServerError, err) return @@ -97,7 +110,7 @@ func (s *Server) GetTaskDir(w http.ResponseWriter, r *http.Request, taskID strin for _, e := range listing.Entries { paths = append(paths, path.Join(real, e.Name)) } - ignored, err := git.Ignored(r.Context(), t.WorktreePath, paths) + ignored, err := git.Ignored(r.Context(), root, paths) if err != nil { writeError(w, http.StatusInternalServerError, err) return @@ -154,11 +167,24 @@ func (s *Server) GetTaskFile(w http.ResponseWriter, r *http.Request, taskID stri if !ok { return } - if params.Path == "" { + serveFile(w, t.WorktreePath, params.Path) +} + +func (s *Server) GetProjectFile(w http.ResponseWriter, r *http.Request, projectID string, params api.GetProjectFileParams) { + p, err := s.store.GetProject(r.Context(), projectID) + if err != nil { + writeStoreError(w, err) + return + } + serveFile(w, p.RepoPath, params.Path) +} + +func serveFile(w http.ResponseWriter, root, rel string) { + if rel == "" { writeError(w, http.StatusBadRequest, errors.New("path is required")) return } - name, full := taskPath(t.WorktreePath, params.Path) + name, full := taskPath(root, rel) fi, err := os.Stat(full) if err != nil { @@ -166,7 +192,7 @@ func (s *Server) GetTaskFile(w http.ResponseWriter, r *http.Request, taskID stri return } if !fi.Mode().IsRegular() { - writeError(w, http.StatusBadRequest, fmt.Errorf("%s is not a regular file", params.Path)) + writeError(w, http.StatusBadRequest, fmt.Errorf("%s is not a regular file", rel)) return } diff --git a/internal/server/images.go b/internal/server/images.go index 18729ad..a1df07d 100644 --- a/internal/server/images.go +++ b/internal/server/images.go @@ -26,14 +26,26 @@ func (s *Server) GetTaskImage(w http.ResponseWriter, r *http.Request, taskID str if !ok { return } + serveImage(w, r, t.WorktreePath, params.Path) +} - path := params.Path +func (s *Server) GetProjectImage(w http.ResponseWriter, r *http.Request, projectID string, params api.GetProjectImageParams) { + p, err := s.store.GetProject(r.Context(), projectID) + if err != nil { + writeStoreError(w, err) + return + } + serveImage(w, r, p.RepoPath, params.Path) +} + +func serveImage(w http.ResponseWriter, r *http.Request, root, rel string) { + path := rel if !filepath.IsAbs(path) { - path = filepath.Join(t.WorktreePath, path) + path = filepath.Join(root, path) } real, err := filepath.EvalSymlinks(path) if errors.Is(err, fs.ErrNotExist) { - writeError(w, http.StatusNotFound, fmt.Errorf("%s does not exist", params.Path)) + writeError(w, http.StatusNotFound, fmt.Errorf("%s does not exist", rel)) return } if err != nil { @@ -43,7 +55,7 @@ func (s *Server) GetTaskImage(w http.ResponseWriter, r *http.Request, taskID str 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)) + writeError(w, http.StatusBadRequest, fmt.Errorf("%s is not a PNG, JPEG, GIF, WebP or SVG file", rel)) return } @@ -60,7 +72,7 @@ func (s *Server) GetTaskImage(w http.ResponseWriter, r *http.Request, taskID str return } if !info.Mode().IsRegular() { - writeError(w, http.StatusBadRequest, fmt.Errorf("%s is not a file", params.Path)) + writeError(w, http.StatusBadRequest, fmt.Errorf("%s is not a file", rel)) return } diff --git a/mac/Sources/Byre/Dialogs.swift b/mac/Sources/Byre/Dialogs.swift index a0e2609..691cee4 100644 --- a/mac/Sources/Byre/Dialogs.swift +++ b/mac/Sources/Byre/Dialogs.swift @@ -38,6 +38,10 @@ enum LeftTab: String { case lead, status, notes, workflows, server, settings } +enum ProjectTab { + case tasks, files, settings +} + @MainActor @Observable final class Overlays { @@ -53,7 +57,7 @@ final class Overlays { var leadFocus = 0 var tabFocus = 0 var projectFocus = false - var projectSettings = false + var projectTab = ProjectTab.tasks var taskList = false @ObservationIgnored var pickerFrame: CGRect = .zero @ObservationIgnored var menuHover = false diff --git a/mac/Sources/Byre/Files.swift b/mac/Sources/Byre/Files.swift index 07d99a3..8fc7a5b 100644 --- a/mac/Sources/Byre/Files.swift +++ b/mac/Sources/Byre/Files.swift @@ -5,19 +5,31 @@ typealias DirListing = Components.Schemas.DirListing typealias DirEntry = Components.Schemas.DirEntry typealias FileContent = Components.Schemas.FileContent +enum FileRoot: Hashable { + case task(String) + case project(String) + + var name: String { + if case .project = self { + return "repo" + } + return "worktree" + } +} + struct FilePlace: Equatable { var dir = "" var file: String? } private struct FilesKey: Equatable { - let taskId: String? + let root: FileRoot? let place: FilePlace } extension Store { - var filePlace: FilePlace { - selectedTaskId.flatMap { filePlaces[$0] } ?? FilePlace() + func filePlace(_ root: FileRoot?) -> FilePlace { + root.flatMap { filePlaces[$0] } ?? FilePlace() } func openFile(_ taskId: String, _ path: String) { @@ -34,13 +46,22 @@ extension Store { } 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) - } + filePlaces[.task(taskId)] = filePlace(at: path) route("#/task/\(taskId)/files") } + + func showInProjectFiles(_ projectId: String, _ path: String, _ overlays: Overlays) { + filePlaces[.project(projectId)] = filePlace(at: path) + overlays.projectTab = .files + route("#/project/\(projectId)") + } + + private func filePlace(at path: String) -> FilePlace { + if path.isEmpty || path.hasSuffix("/") { + return FilePlace(dir: path == "/" ? path : String(path.dropLast())) + } + return FilePlace(dir: parent(path), file: path) + } } private func join(_ dir: String, _ name: String) -> String { @@ -78,6 +99,7 @@ private func shown(_ c: FileContent) -> Int64 { @Observable private final class FilesModel { let store: Store + var root: FileRoot? private(set) var listing: DirListing? private(set) var content: FileContent? private(set) var error = "" @@ -91,14 +113,14 @@ private final class FilesModel { } var place: FilePlace { - store.filePlace + store.filePlace(root) } func go(_ p: FilePlace) { - guard let taskId = store.selectedTaskId else { + guard let root else { return } - store.filePlaces[taskId] = p + store.filePlaces[root] = p } func reset() { @@ -114,22 +136,29 @@ private final class FilesModel { } func load() async { - guard let taskId = store.selectedTaskId else { + guard let root else { return } target += 1 let started = target let p = place + let client = store.api.client do { if let file = p.file { - let fresh = try await store.api.client.getTaskFile(path: .init(taskId: taskId), query: .init(path: file)).ok.body.json + let fresh = switch root { + case .task(let id): try await client.getTaskFile(path: .init(taskId: id), query: .init(path: file)).ok.body.json + case .project(let id): try await client.getProjectFile(path: .init(projectId: id), query: .init(path: file)).ok.body.json + } if started == target { content = fresh listing = nil loads += 1 } } else { - let fresh = try await store.api.client.getTaskDir(path: .init(taskId: taskId), query: .init(path: p.dir)).ok.body.json + let fresh = switch root { + case .task(let id): try await client.getTaskDir(path: .init(taskId: id), query: .init(path: p.dir)).ok.body.json + case .project(let id): try await client.getProjectDir(path: .init(projectId: id), query: .init(path: p.dir)).ok.body.json + } if started == target { listing = fresh content = nil @@ -147,10 +176,7 @@ private final class FilesModel { } } - func transcript(_ fresh: [ByreEvent]) { - if !fresh.contains(where: { $0.kind == "agent.tool_result" || $0.kind == "turn.ended" }) { - return - } + func changed() { timer?.cancel() timer = Task { try? await Task.sleep(for: .milliseconds(1500)) @@ -176,11 +202,12 @@ private final class FilesModel { if let l = listing { return "\(l.entries.count)\(l.truncated ? "+" : "") \(l.entries.count == 1 ? "entry" : "entries")" } - return store.selectedTaskId != nil ? "Loading…" : "" + return root != nil ? "Loading…" : "" } } struct FilesView: View { + let root: FileRoot? @Environment(Store.self) private var store @ViewState private var model: FilesModel? @@ -192,12 +219,26 @@ struct FilesView: View { } } .frame(maxHeight: .infinity, alignment: .top) - .task(id: FilesKey(taskId: store.selectedTaskId, place: store.filePlace)) { + .task(id: FilesKey(root: root, place: store.filePlace(root))) { let m = model ?? FilesModel(store) model = m + m.root = root m.reset() - let off = store.selectedFeed?.appended.add { [weak m] events in - m?.transcript(events) + let off: (() -> Void)? = switch root { + case .task: + store.selectedFeed?.appended.add { [weak m] events in + if events.contains(where: { $0.kind == "agent.tool_result" || $0.kind == "turn.ended" }) { + m?.changed() + } + } + case .project(let id): + store.events.add { [weak m] ev in + if (ev.kind == "task.merged" || ev.kind == "task.merged_to_main") && ev.projectId == id { + m?.changed() + } + } + case nil: + nil } await untilCancelled() off?() @@ -217,7 +258,7 @@ private struct FilesHead: View { let base = absolute ? "/" : "" HStack(alignment: .firstTextBaseline, spacing: 12) { FlowLayout(spacing: 2) { - crumb(absolute ? "/" : "worktree", base, parts.isEmpty) + crumb(absolute ? "/" : model.root?.name ?? "worktree", base, parts.isEmpty) ForEach(Array(parts.enumerated()), id: \.offset) { i, part in if !absolute || i > 0 { Text("/").foregroundStyle(Palette.muted) @@ -255,18 +296,18 @@ private struct FilesBody: View { @Environment(Store.self) private var store var body: some View { - if store.selectedTaskId == nil { + if model.root == nil { EmptyText(text: "No task selected.") } else if !model.error.isEmpty { EmptyText(text: model.error, error: true) - } else if let c = model.content, let taskId = store.selectedTaskId { + } else if let c = model.content, let root = model.root { if let file = model.place.file, isImage(file) { - FileImage(taskId: taskId, path: file, load: model.loads) + FileImage(root: root, path: file, load: model.loads) .id(model.generation) } else if c.binary { EmptyText(text: "Binary file.") } else if model.place.file?.lowercased().hasSuffix(".md") == true { - FileMarkdown(content: c, taskId: taskId, dir: model.place.dir) + FileMarkdown(content: c, root: root, dir: model.place.dir) .id(model.generation) } else { FileText(content: c) @@ -285,7 +326,7 @@ private struct FilesBody: View { EntryRow(label: e._type == .dir ? "\(e.name)/" : e.name, kind: e._type, ignored: e.ignored, meta: meta, symlink: e.symlink) { if e._type == .dir { model.go(FilePlace(dir: join(l.path, e.name))) - } else if e._type == .file && isPage(e.name), let taskId = store.selectedTaskId { + } else if e._type == .file && isPage(e.name), case .task(let taskId) = model.root { store.openPage(.file(taskId: taskId, path: join(l.path, e.name))) } else if e._type == .file { model.go(FilePlace(dir: l.path, file: join(l.path, e.name))) @@ -355,13 +396,17 @@ private struct EntryRow: View { private struct FileMarkdown: View { let content: FileContent - let taskId: String? + let root: FileRoot let dir: String var body: some View { + let ctx = switch root { + case .task(let id): MDContext(taskId: id, dir: dir) + case .project(let id): MDContext(project: id, dir: dir) + } ScrollView { VStack(alignment: .leading, spacing: 0) { - MarkdownView(blocks: parseMarkdown(content.text), ctx: MDContext(taskId: taskId, dir: dir)) + MarkdownView(blocks: parseMarkdown(content.text), ctx: ctx) if content.truncated { Text("Showing the first \(bytes(shown(content))) of \(bytes(content.size)).") .foregroundStyle(Palette.muted) @@ -376,7 +421,7 @@ private struct FileMarkdown: View { } private struct FileImage: View { - let taskId: String + let root: FileRoot let path: String let load: Int @Environment(Store.self) private var store @@ -407,7 +452,7 @@ private struct FileImage: View { } .task(id: load) { do { - let data = try await ImageCache.fetch(.worktree(taskId: taskId, path: path), store.api) + let data = try await ImageCache.fetch(.file(root, path: path), store.api) guard let img = PlatformImage(data: data) else { image = nil error = "Not a readable image." diff --git a/mac/Sources/Byre/Images.swift b/mac/Sources/Byre/Images.swift index a74e74f..49d06c6 100644 --- a/mac/Sources/Byre/Images.swift +++ b/mac/Sources/Byre/Images.swift @@ -3,7 +3,7 @@ import SwiftUI enum ImageSource: Hashable { case blob(String) - case worktree(taskId: String, path: String) + case file(FileRoot, path: String) case data(Data) } @@ -11,7 +11,7 @@ private let dataImage = Re(#"^data:image/(png|jpeg|gif|webp);"#, caseless: true) private let fileURL = Re(#"^file://"#, caseless: true) private let anyScheme = Re(#"^[a-z][a-z0-9+.-]*:"#, caseless: true) -func worktreeImageSource(_ path: String, _ taskId: String?, dir: String = "") -> ImageSource? { +func worktreeImageSource(_ path: String, _ root: FileRoot?, dir: String = "") -> ImageSource? { if dataImage.test(path) { guard let comma = path.firstIndex(of: ","), path[.. } else if !dir.isEmpty && !file.hasPrefix("/") { file = "\(dir)/\(file)" } - guard let taskId else { + guard let root else { return nil } - return .worktree(taskId: taskId, path: file) + return .file(root, path: file) } @MainActor @@ -76,11 +76,16 @@ final class ImageCache { case .png(let b), .jpeg(let b), .imageGif(let b), .imageWebp(let b): b } return try await Data(collecting: body, upTo: 32 << 20) - case .worktree(let taskId, let path): + case .file(.task(let taskId), let path): let body = switch try await api.client.getTaskImage(path: .init(taskId: taskId), query: .init(path: path)).ok.body { case .png(let b), .jpeg(let b), .imageGif(let b), .imageWebp(let b), .imageSvgXml(let b): b } return try await Data(collecting: body, upTo: 32 << 20) + case .file(.project(let projectId), let path): + let body = switch try await api.client.getProjectImage(path: .init(projectId: projectId), query: .init(path: path)).ok.body { + case .png(let b), .jpeg(let b), .imageGif(let b), .imageWebp(let b), .imageSvgXml(let b): b + } + return try await Data(collecting: body, upTo: 32 << 20) } } } diff --git a/mac/Sources/Byre/MarkdownView.swift b/mac/Sources/Byre/MarkdownView.swift index dafd805..21242f7 100644 --- a/mac/Sources/Byre/MarkdownView.swift +++ b/mac/Sources/Byre/MarkdownView.swift @@ -18,11 +18,14 @@ enum AppLink { return c.url! } - static func file(_ taskId: String, _ path: String) -> URL { + static func file(_ root: FileRoot, _ path: String) -> URL { var c = URLComponents() c.scheme = "byre-app" c.host = "file" - c.queryItems = [URLQueryItem(name: "task", value: taskId), URLQueryItem(name: "path", value: path)] + c.queryItems = switch root { + case .task(let id): [URLQueryItem(name: "task", value: id), URLQueryItem(name: "path", value: path)] + case .project(let id): [URLQueryItem(name: "project", value: id), URLQueryItem(name: "path", value: path)] + } return c.url! } @@ -61,7 +64,11 @@ func openAppLink(_ url: URL, _ store: Store, _ overlays: Overlays) -> OpenURLAct case "route": store.route(q["hash"] ?? "") case "file": - store.openFile(q["task"] ?? "", q["path"] ?? "") + if let project = q["project"] { + store.showInProjectFiles(project, q["path"] ?? "", overlays) + } else { + store.openFile(q["task"] ?? "", q["path"] ?? "") + } case "preview": let taskId = q["task"] ?? "" store.route("#/task/\(taskId)") @@ -169,17 +176,23 @@ struct InlineRenderer { let store: Store let size: CGFloat let taskId: String? + let project: String? let weight: CGFloat let dir: String private let root: String - init(store: Store, size: CGFloat, taskId: String?, weight: CGFloat = 400, dir: String = "") { + init(store: Store, size: CGFloat, taskId: String?, project: String? = nil, weight: CGFloat = 400, dir: String = "") { self.store = store self.size = size self.taskId = taskId + self.project = project self.weight = weight self.dir = dir - root = taskId.flatMap { store.findTask($0)?.worktreePath } ?? "" + if let taskId { + root = store.findTask(taskId)?.worktreePath ?? "" + } else { + root = project.flatMap { id in store.projects.first { $0.id == id }?.repoPath } ?? "" + } } private struct Style { @@ -275,7 +288,7 @@ struct InlineRenderer { s.italic = true render(inner, s, &out) case .image(let src, let alt): - if let source = worktreeImageSource(src, taskId, dir: dir) { + if let source = worktreeImageSource(src, files, dir: dir) { out.append(.image(source, src: src)) } else { link(src, [.text(alt.isEmpty ? src : alt)], style, &out) @@ -327,11 +340,15 @@ struct InlineRenderer { render(inner, style, &out) } + private var files: FileRoot? { + taskId.map(FileRoot.task) ?? project.map(FileRoot.project) + } + private func fileLink(_ path: String) -> URL? { - guard let taskId, !root.isEmpty, let p = normalPath(path) else { + guard let files, !root.isEmpty, let p = normalPath(path) else { return nil } - return AppLink.file(taskId, p) + return AppLink.file(files, p) } private func codeFile(_ code: String) -> URL? { @@ -451,6 +468,7 @@ struct MDContext { var size: CGFloat = 13 var color: Color = Palette.text var taskId: String? + var project: String? var choice: ((MDItem, Bool) -> AnyView)? var discuss: ((MDItem) -> AnyView)? var gridColumns = 4 @@ -590,7 +608,7 @@ private struct FlowBuilder { } private func inline(_ inlines: [MDInline], _ size: CGFloat) -> NSAttributedString { - let a = InlineRenderer(store: store, size: size, taskId: ctx.taskId, weight: ctx.weight, dir: ctx.dir).text(inlines) + let a = InlineRenderer(store: store, size: size, taskId: ctx.taskId, project: ctx.project, weight: ctx.weight, dir: ctx.dir).text(inlines) return nativeString(a) } @@ -902,7 +920,7 @@ struct InlineView: View { @Environment(\.centerImages) private var centerImages var body: some View { - let segs = InlineRenderer(store: store, size: ctx.size, taskId: ctx.taskId, weight: ctx.weight, dir: ctx.dir).segments(inlines) + let segs = InlineRenderer(store: store, size: ctx.size, taskId: ctx.taskId, project: ctx.project, weight: ctx.weight, dir: ctx.dir).segments(inlines) VStack(alignment: .leading, spacing: 4) { ForEach(Array(segs.enumerated()), id: \.offset) { _, seg in switch seg { @@ -948,7 +966,7 @@ private struct BlockView: View { case .paragraph(let inlines): InlineView(inlines: inlines, ctx: ctx) case .heading(let level, let inlines): - InlineView(inlines: [.strong(inlines)], ctx: MDContext(size: level == 3 ? 14 : 13, color: ctx.color, taskId: ctx.taskId, dir: ctx.dir)) + InlineView(inlines: [.strong(inlines)], ctx: MDContext(size: level == 3 ? 14 : 13, color: ctx.color, taskId: ctx.taskId, project: ctx.project, dir: ctx.dir)) .padding(.top, 4) case .rule: Rectangle() @@ -956,7 +974,7 @@ private struct BlockView: View { .frame(height: 1) .padding(.vertical, 2) case .quote(let blocks): - MarkdownView(blocks: blocks, ctx: MDContext(size: ctx.size, color: Palette.muted, taskId: ctx.taskId, dir: ctx.dir)) + MarkdownView(blocks: blocks, ctx: MDContext(size: ctx.size, color: Palette.muted, taskId: ctx.taskId, project: ctx.project, dir: ctx.dir)) .padding(.leading, 13) .overlay(alignment: .leading) { Rectangle().fill(Palette.border).frame(width: 3) @@ -1107,7 +1125,7 @@ private struct DetailsBlock: View { HStack(alignment: .firstTextBaseline, spacing: 4) { Text(open ? "▾" : "▸") .foregroundStyle(Palette.accent) - InlineView(inlines: summary, ctx: MDContext(size: ctx.size, color: Palette.accent, taskId: ctx.taskId, dir: ctx.dir)) + InlineView(inlines: summary, ctx: MDContext(size: ctx.size, color: Palette.accent, taskId: ctx.taskId, project: ctx.project, dir: ctx.dir)) } .contentShape(Rectangle()) } diff --git a/mac/Sources/Byre/Panes.swift b/mac/Sources/Byre/Panes.swift index f121c3a..66b840c 100644 --- a/mac/Sources/Byre/Panes.swift +++ b/mac/Sources/Byre/Panes.swift @@ -244,7 +244,7 @@ struct TaskTabBody: View { case .changes: ChangesView() case .files: - FilesView() + FilesView(root: store.selectedTaskId.map(FileRoot.task)) case .page: if let shown = store.selectedTaskId.flatMap({ store.shownPages[$0] }) { PageTabs(shown: shown) diff --git a/mac/Sources/Byre/Project.swift b/mac/Sources/Byre/Project.swift index 5e550ba..065c26f 100644 --- a/mac/Sources/Byre/Project.swift +++ b/mac/Sources/Byre/Project.swift @@ -17,11 +17,14 @@ struct ProjectView: View { VStack(spacing: 0) { if store.focusedProject() != nil { HStack(spacing: 4) { - PaneTabButton(label: "Tasks", active: !overlays.projectSettings) { - overlays.projectSettings = false + PaneTabButton(label: "Tasks", active: overlays.projectTab == .tasks) { + overlays.projectTab = .tasks } - PaneTabButton(label: "Settings", active: overlays.projectSettings) { - overlays.projectSettings = true + PaneTabButton(label: "Files", active: overlays.projectTab == .files) { + overlays.projectTab = .files + } + PaneTabButton(label: "Settings", active: overlays.projectTab == .settings) { + overlays.projectTab = .settings } Spacer(minLength: 0) } @@ -30,14 +33,18 @@ struct ProjectView: View { Rectangle().fill(Palette.border).frame(height: 1) } } - ScrollView { - if let p = store.focusedProject() { - ProjectBlock(project: p, todo: todos[p.id], settings: overlays.projectSettings) - .padding(.horizontal, 16) - .padding(.top, 8) - .padding(.bottom, 16) - } else { - Muted(text: "No project selected.") + if let p = store.focusedProject(), overlays.projectTab == .files { + FilesView(root: .project(p.id)) + } else { + ScrollView { + if let p = store.focusedProject() { + ProjectBlock(project: p, todo: todos[p.id], settings: overlays.projectTab == .settings) + .padding(.horizontal, 16) + .padding(.top, 8) + .padding(.bottom, 16) + } else { + Muted(text: "No project selected.") + } } } } diff --git a/mac/Sources/Byre/Questions.swift b/mac/Sources/Byre/Questions.swift index 6a6c70f..21776bf 100644 --- a/mac/Sources/Byre/Questions.swift +++ b/mac/Sources/Byre/Questions.swift @@ -525,7 +525,7 @@ private struct Attachments: View { case .image: let src = (a.image?.isEmpty == false ? a.image : a.path) ?? "" let caption = a.caption ?? "" - if let source = worktreeImageSource(src, taskId) { + if let source = worktreeImageSource(src, .task(taskId)) { ByreImage(source: source, src: src) } else if !src.isEmpty { InlineView(inlines: [.link(href: src, [.text(caption.isEmpty ? src : caption)])], ctx: MDContext(taskId: taskId)) diff --git a/mac/Sources/Byre/Store.swift b/mac/Sources/Byre/Store.swift index bf96caa..57a4870 100644 --- a/mac/Sources/Byre/Store.swift +++ b/mac/Sources/Byre/Store.swift @@ -83,7 +83,7 @@ final class Store { private(set) var leadMore = false var todoBusy: [String: String] = [:] var pickedMembers: [String: String] = [:] - var filePlaces: [String: FilePlace] = [:] + var filePlaces: [FileRoot: FilePlace] = [:] private(set) var drafts: Drafts? let images: ImageDrafts let imageCache = ImageCache()