diff --git a/api/openapi.yaml b/api/openapi.yaml index c41d9dc..3f18782 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -298,19 +298,6 @@ paths: schema: { $ref: "#/components/schemas/Project" } "400": { $ref: "#/components/responses/Error" } - /api/projects/{projectId}: - parameters: - - { name: projectId, in: path, required: true, schema: { type: string } } - get: - operationId: getProject - responses: - "200": - description: The project. - content: - application/json: - schema: { $ref: "#/components/schemas/Project" } - "404": { $ref: "#/components/responses/Error" } - /api/projects/{projectId}/review-workflow: parameters: - { name: projectId, in: path, required: true, schema: { type: string } } @@ -573,22 +560,6 @@ paths: schema: { $ref: "#/components/schemas/Task" } "404": { $ref: "#/components/responses/Error" } - /api/tasks/{taskId}/workflow: - parameters: - - { name: taskId, in: path, required: true, schema: { type: string } } - get: - operationId: getTaskWorkflow - description: > - The workflow the task's run froze when it was created, as it was then, for a workflow run's task or one of - its stage tasks. Later edits and deletes of the workflow don't change it. - responses: - "200": - description: The frozen workflow. - content: - application/json: - schema: { $ref: "#/components/schemas/TaskWorkflow" } - "404": { $ref: "#/components/responses/Error" } - /api/tasks/{taskId}/summary-read: parameters: - { name: taskId, in: path, required: true, schema: { type: string } } @@ -993,40 +964,6 @@ paths: items: { $ref: "#/components/schemas/Preview" } "404": { $ref: "#/components/responses/Error" } - /api/tasks/{taskId}/snapshots: - parameters: - - { name: taskId, in: path, required: true, schema: { type: string } } - get: - operationId: listSnapshots - description: > - The task's snapshots, oldest first. Each is a commit of the worktree as if everything were staged, kept at - refs/byre/tasks/{taskId}/snap/{n} until the task is merged or discarded; the rows remain after that. - responses: - "200": - description: The snapshots. - content: - application/json: - schema: - type: array - items: { $ref: "#/components/schemas/Snapshot" } - "404": { $ref: "#/components/responses/Error" } - - /api/tasks/{taskId}/reviews: - parameters: - - { name: taskId, in: path, required: true, schema: { type: string } } - get: - operationId: listReviews - description: The task's reviews, one per snapshot, oldest first. - responses: - "200": - description: The reviews. - content: - application/json: - schema: - type: array - items: { $ref: "#/components/schemas/Review" } - "404": { $ref: "#/components/responses/Error" } - /api/reviews/{reviewId}/findings/{index}: parameters: - { name: reviewId, in: path, required: true, schema: { type: string } } @@ -1141,19 +1078,6 @@ paths: "404": { $ref: "#/components/responses/Error" } "409": { $ref: "#/components/responses/Error" } - /api/sessions/{sessionId}: - parameters: - - { name: sessionId, in: path, required: true, schema: { type: string } } - get: - operationId: getSession - responses: - "200": - description: The session. - content: - application/json: - schema: { $ref: "#/components/schemas/AgentSession" } - "404": { $ref: "#/components/responses/Error" } - /api/sessions/{sessionId}/messages: parameters: - { name: sessionId, in: path, required: true, schema: { type: string } } @@ -1283,35 +1207,16 @@ paths: /api/inbox: get: operationId: listInbox - description: > - Inbox items, oldest first. - Filters narrow the one query to a project's or a task's view. - parameters: - - { name: project_id, in: query, required: false, schema: { type: string } } - - { name: task_id, in: query, required: false, schema: { type: string } } - - { name: state, in: query, required: false, schema: { $ref: "#/components/schemas/InboxState" } } + description: Open inbox items with their responses, oldest first. responses: "200": - description: Matching items with their responses. Defaults to open items. + description: The open items. content: application/json: schema: type: array items: { $ref: "#/components/schemas/InboxItem" } - /api/inbox/{itemId}: - parameters: - - { name: itemId, in: path, required: true, schema: { type: string } } - get: - operationId: getInboxItem - responses: - "200": - description: The item with its responses. - content: - application/json: - schema: { $ref: "#/components/schemas/InboxItem" } - "404": { $ref: "#/components/responses/Error" } - /api/inbox/{itemId}/dismiss: parameters: - { name: itemId, in: path, required: true, schema: { type: string } } @@ -1706,7 +1611,7 @@ components: forked_from: { type: string, description: "The task this one was forked from; absent for other tasks." } forked_at: { type: integer, description: "With forked_from: the n of the snapshot it was forked at; absent when it continues a closed task from its end." } merge_queued_at: { type: string, format: date-time, description: "When Merge was requested while another task in the project was merging; absent once the merge starts or when none is held." } - workflow: { type: string, description: "For a workflow run's task: the name of the workflow it froze at creation (getTaskWorkflow has its copy). A run's task has no agent, worktree or branch (branch, worktree_path and base_ref are empty); its stage tasks are its subtasks, and it closes once they all have, as merged when any of them merged. Absent for other tasks." } + workflow: { type: string, description: "For a workflow run's task: the name of the workflow it froze at creation (getWorkflowRun has its copy). A run's task has no agent, worktree or branch (branch, worktree_path and base_ref are empty); its stage tasks are its subtasks, and it closes once they all have, as merged when any of them merged. Absent for other tasks." } workflow_stage: { type: string, description: "For a stage task of a workflow run: the name of the stage it runs; parent_task_id is the run's task. Absent for other tasks." } audit: { type: string, description: "The default branch commit an audit audits, on the task of a run of its project's audit workflow; absent for other tasks." } background: { type: boolean, description: "Whether the task is an audit's run or stage task that hasn't asked for attention yet: no question, ready_for_merge or error so far (for a run, from any of its stage tasks). The app keeps it out of the task switcher and shows it muted on the project's dashboard, and the lead gets no signals about it." } @@ -1882,14 +1787,6 @@ components: effort: { type: string, x-go-type-skip-optional-pointer: true, description: "The agent's effort; empty means the vendor's default." } prompt: { type: string, description: "This agent's own instructions: its role in the team." } - TaskWorkflow: - type: object - description: The workflow a task froze when it was created, as it was then. - required: [name, definition] - properties: - name: { type: string } - definition: { $ref: "#/components/schemas/WorkflowDefinition" } - WorkflowRun: type: object required: [name, title, brief, definition, finished, stages] diff --git a/internal/agents/manager.go b/internal/agents/manager.go index dce4cf8..38b93ff 100644 --- a/internal/agents/manager.go +++ b/internal/agents/manager.go @@ -414,7 +414,7 @@ func (m *Manager) recoverSession(ctx context.Context, sess api.AgentSession) err l, err := m.ensureLive(ctx, sess, task) if err != nil { - return m.failResume(ctx, sess, task, err) + return m.failResume(ctx, sess, err) } notice := restartNotice @@ -429,7 +429,7 @@ func (m *Manager) recoverSession(ctx context.Context, sess api.AgentSession) err } err = m.message(ctx, sess, task, l, "byre", notice, nil) if err != nil { - return m.failResume(ctx, sess, task, err) + return m.failResume(ctx, sess, err) } slog.Info("resumed session", "session", sess.Id, "task", task.Id, "owner", sess.Owner) m.logUndelivered(ctx, sess.Id, "resumed with restart notice") @@ -508,7 +508,7 @@ func (m *Manager) Recover(ctx context.Context) error { return nil } -func (m *Manager) failResume(ctx context.Context, sess api.AgentSession, task api.Task, err error) error { +func (m *Manager) failResume(ctx context.Context, sess api.AgentSession, err error) error { slog.Error("resume session", "session", sess.Id, "err", err) if sess.Role == api.Reviewer { r, rerr := m.store.ReviewBySession(ctx, sess.Id) diff --git a/internal/agents/mergein.go b/internal/agents/mergein.go index 948d582..fb35596 100644 --- a/internal/agents/mergein.go +++ b/internal/agents/mergein.go @@ -256,10 +256,6 @@ func (m *Manager) fileError(ctx context.Context, taskID, msg string) { slog.Error("list sessions to file error on", "task", taskID, "error", msg, "err", err) return } - m.fileTaskError(ctx, task, sessions, msg) -} - -func (m *Manager) fileTaskError(ctx context.Context, task api.Task, sessions []api.AgentSession, msg string) { if len(sessions) == 0 { slog.Error("no session to file task error on", "task", task.Id, "error", msg) return diff --git a/internal/agents/workflows.go b/internal/agents/workflows.go index 764d79d..ecc9c6f 100644 --- a/internal/agents/workflows.go +++ b/internal/agents/workflows.go @@ -77,14 +77,6 @@ func reviewProblem(def api.WorkflowDefinition) error { return nil } -func (m *Manager) TaskWorkflow(ctx context.Context, taskID string) (api.TaskWorkflow, error) { - frozen, err := m.store.TaskWorkflow(ctx, taskID) - if err != nil { - return api.TaskWorkflow{}, err - } - return api.TaskWorkflow{Name: frozen.Name, Definition: frozen.Definition}, nil -} - func (m *Manager) WorkflowRun(ctx context.Context, taskID string) (api.WorkflowRun, error) { task, err := m.store.GetTask(ctx, taskID) if err != nil { @@ -306,14 +298,14 @@ func (m *Manager) startStage(ctx context.Context, project api.Project, creator a if err != nil { return api.Task{}, err } - _, err = m.beginStage(ctx, task, project, creator, frozen, parents, actor) + err = m.beginStage(ctx, task, project, creator, frozen, parents, actor) if err != nil { return task, fmt.Errorf("task %s created, but its agent did not start: %w", task.Id, err) } return task, nil } -func (m *Manager) beginStage(ctx context.Context, task api.Task, project api.Project, creator api.User, frozen store.FrozenWorkflow, parents []parentStage, actor string) (api.AgentSession, error) { +func (m *Manager) beginStage(ctx context.Context, task api.Task, project api.Project, creator api.User, frozen store.FrozenWorkflow, parents []parentStage, actor string) error { stage := *task.WorkflowStage after := []string{} for _, p := range parents { @@ -327,19 +319,15 @@ func (m *Manager) beginStage(ctx context.Context, task api.Task, project api.Pro Payload: map[string]any{"id": task.Id, "workflow": frozen.Name, "run": *task.ParentTaskId, "stage": stage, "after": after}, }) if err != nil { - return api.AgentSession{}, err + return err } s := workflow.Get(frozen.Definition, stage) message := stageMessage(frozen, stage, parents, project.DefaultBranch) if s.Agents == nil { - return m.create(ctx, task, creator, "", "byre", Prompt{Text: message, Model: s.Model, Effort: s.Effort}) + _, err = m.create(ctx, task, creator, "", "byre", Prompt{Text: message, Model: s.Model, Effort: s.Effort}) + return err } - err = m.startTeam(ctx, task, creator, message, *s.Agents, "byre") - if err != nil { - return api.AgentSession{}, err - } - sess, _, err := m.liveSession(ctx, task.Id) - return sess, err + return m.startTeam(ctx, task, creator, message, *s.Agents, "byre") } func stageMessage(frozen store.FrozenWorkflow, stage string, parents []parentStage, defaultBranch string) string { @@ -576,7 +564,7 @@ func (m *Manager) resumeStage(ctx context.Context, task api.Task, project api.Pr return nil, err } if len(sessions) == 0 { - _, err := m.beginStage(ctx, task, project, creator, frozen, parents, "byre") + err := m.beginStage(ctx, task, project, creator, frozen, parents, "byre") if err != nil { return nil, err } diff --git a/internal/api/api.gen.go b/internal/api/api.gen.go index 9f2145f..d677763 100644 --- a/internal/api/api.gen.go +++ b/internal/api/api.gen.go @@ -1590,7 +1590,7 @@ type Task struct { // TodoItem The title of the TODO.md item the task was started from; absent for other tasks. TodoItem *string `json:"todo_item,omitempty"` - // Workflow For a workflow run's task: the name of the workflow it froze at creation (getTaskWorkflow has its copy). A run's task has no agent, worktree or branch (branch, worktree_path and base_ref are empty); its stage tasks are its subtasks, and it closes once they all have, as merged when any of them merged. Absent for other tasks. + // Workflow For a workflow run's task: the name of the workflow it froze at creation (getWorkflowRun has its copy). A run's task has no agent, worktree or branch (branch, worktree_path and base_ref are empty); its stage tasks are its subtasks, and it closes once they all have, as merged when any of them merged. Absent for other tasks. Workflow *string `json:"workflow,omitempty"` // WorkflowStage For a stage task of a workflow run: the name of the stage it runs; parent_task_id is the run's task. Absent for other tasks. @@ -1648,13 +1648,6 @@ type TaskTerminal struct { TaskId string `json:"task_id"` } -// TaskWorkflow The workflow a task froze when it was created, as it was then. -type TaskWorkflow struct { - // Definition A workflow's definition, which holds everything but its name: its steps, run in order. Run on a brief, each stage runs as its own task once the steps before it have finished; as a project's review workflow, each stage is a reviewer of a snapshot and gets the earlier stages' reviews. - Definition WorkflowDefinition `json:"definition"` - Name string `json:"name"` -} - // TeamMember defines model for TeamMember. type TeamMember struct { // Effort The agent's effort; empty means the vendor's default. @@ -1897,13 +1890,6 @@ type StreamEventsParams struct { LastEventID *int64 `json:"Last-Event-ID,omitempty"` } -// ListInboxParams defines parameters for ListInbox. -type ListInboxParams struct { - ProjectId *string `form:"project_id,omitempty" json:"project_id,omitempty"` - TaskId *string `form:"task_id,omitempty" json:"task_id,omitempty"` - State *InboxState `form:"state,omitempty" json:"state,omitempty"` -} - // ListLeadEventsParams defines parameters for ListLeadEvents. type ListLeadEventsParams struct { Before *int64 `form:"before,omitempty" json:"before,omitempty"` @@ -2147,7 +2133,7 @@ type ServerInterface interface { StreamEvents(w http.ResponseWriter, r *http.Request, params StreamEventsParams) // (GET /api/inbox) - ListInbox(w http.ResponseWriter, r *http.Request, params ListInboxParams) + ListInbox(w http.ResponseWriter, r *http.Request) // (POST /api/inbox/answer-again) AnswerAgain(w http.ResponseWriter, r *http.Request) @@ -2155,9 +2141,6 @@ type ServerInterface interface { // (POST /api/inbox/responses) RespondInbox(w http.ResponseWriter, r *http.Request) - // (GET /api/inbox/{itemId}) - GetInboxItem(w http.ResponseWriter, r *http.Request, itemId string) - // (POST /api/inbox/{itemId}/dismiss) DismissInbox(w http.ResponseWriter, r *http.Request, itemId string) @@ -2224,9 +2207,6 @@ type ServerInterface interface { // (POST /api/projects) CreateProject(w http.ResponseWriter, r *http.Request) - // (GET /api/projects/{projectId}) - GetProject(w http.ResponseWriter, r *http.Request, projectId string) - // (PUT /api/projects/{projectId}/audit-workflow) SetAuditWorkflow(w http.ResponseWriter, r *http.Request, projectId string) @@ -2272,9 +2252,6 @@ type ServerInterface interface { // (PUT /api/schedules/{scheduleId}) UpdateSchedule(w http.ResponseWriter, r *http.Request, scheduleId string) - // (GET /api/sessions/{sessionId}) - GetSession(w http.ResponseWriter, r *http.Request, sessionId string) - // (POST /api/sessions/{sessionId}/compact) CompactSession(w http.ResponseWriter, r *http.Request, sessionId string) @@ -2344,18 +2321,12 @@ type ServerInterface interface { // (DELETE /api/tasks/{taskId}/ready) DismissReady(w http.ResponseWriter, r *http.Request, taskId string) - // (GET /api/tasks/{taskId}/reviews) - ListReviews(w http.ResponseWriter, r *http.Request, taskId string) - // (GET /api/tasks/{taskId}/sessions) ListSessions(w http.ResponseWriter, r *http.Request, taskId string) // (POST /api/tasks/{taskId}/sessions) CreateSession(w http.ResponseWriter, r *http.Request, taskId string) - // (GET /api/tasks/{taskId}/snapshots) - ListSnapshots(w http.ResponseWriter, r *http.Request, taskId string) - // (POST /api/tasks/{taskId}/snapshots/{n}/fork) ForkSnapshot(w http.ResponseWriter, r *http.Request, taskId string, n int) @@ -2371,9 +2342,6 @@ type ServerInterface interface { // (GET /api/tasks/{taskId}/terminals/{terminalId}) GetTaskTerminal(w http.ResponseWriter, r *http.Request, taskId string, terminalId string, params GetTaskTerminalParams) - // (GET /api/tasks/{taskId}/workflow) - GetTaskWorkflow(w http.ResponseWriter, r *http.Request, taskId string) - // (GET /api/tasks/{taskId}/workflow/run) GetWorkflowRun(w http.ResponseWriter, r *http.Request, taskId string) @@ -2675,53 +2643,8 @@ func (siw *ServerInterfaceWrapper) StreamEvents(w http.ResponseWriter, r *http.R // ListInbox operation middleware func (siw *ServerInterfaceWrapper) ListInbox(w http.ResponseWriter, r *http.Request) { - var err error - _ = err - - // Parameter object where we will unmarshal all parameters from the context - var params ListInboxParams - - // ------------- Optional query parameter "project_id" ------------- - - err = runtime.BindQueryParameterWithOptions("form", true, false, "project_id", r.URL.Query(), ¶ms.ProjectId, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) - if err != nil { - var requiredError *runtime.RequiredParameterError - if errors.As(err, &requiredError) { - siw.ErrorHandlerFunc(w, r, &RequiredParamError{ParamName: "project_id"}) - } else { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "project_id", Err: err}) - } - return - } - - // ------------- Optional query parameter "task_id" ------------- - - err = runtime.BindQueryParameterWithOptions("form", true, false, "task_id", r.URL.Query(), ¶ms.TaskId, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) - if err != nil { - var requiredError *runtime.RequiredParameterError - if errors.As(err, &requiredError) { - siw.ErrorHandlerFunc(w, r, &RequiredParamError{ParamName: "task_id"}) - } else { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "task_id", Err: err}) - } - return - } - - // ------------- Optional query parameter "state" ------------- - - err = runtime.BindQueryParameterWithOptions("form", true, false, "state", r.URL.Query(), ¶ms.State, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) - if err != nil { - var requiredError *runtime.RequiredParameterError - if errors.As(err, &requiredError) { - siw.ErrorHandlerFunc(w, r, &RequiredParamError{ParamName: "state"}) - } else { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "state", Err: err}) - } - return - } - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.ListInbox(w, r, params) + siw.Handler.ListInbox(w, r) })) for _, middleware := range siw.HandlerMiddlewares { @@ -2759,32 +2682,6 @@ func (siw *ServerInterfaceWrapper) RespondInbox(w http.ResponseWriter, r *http.R handler.ServeHTTP(w, r) } -// GetInboxItem operation middleware -func (siw *ServerInterfaceWrapper) GetInboxItem(w http.ResponseWriter, r *http.Request) { - - var err error - _ = err - - // ------------- Path parameter "itemId" ------------- - var itemId string - - err = runtime.BindStyledParameterWithOptions("simple", "itemId", r.PathValue("itemId"), &itemId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "", ValueIsUnescaped: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "itemId", Err: err}) - return - } - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.GetInboxItem(w, r, itemId) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r) -} - // DismissInbox operation middleware func (siw *ServerInterfaceWrapper) DismissInbox(w http.ResponseWriter, r *http.Request) { @@ -3173,32 +3070,6 @@ func (siw *ServerInterfaceWrapper) CreateProject(w http.ResponseWriter, r *http. handler.ServeHTTP(w, r) } -// GetProject operation middleware -func (siw *ServerInterfaceWrapper) GetProject(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 - } - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.GetProject(w, r, projectId) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r) -} - // SetAuditWorkflow operation middleware func (siw *ServerInterfaceWrapper) SetAuditWorkflow(w http.ResponseWriter, r *http.Request) { @@ -3662,32 +3533,6 @@ func (siw *ServerInterfaceWrapper) UpdateSchedule(w http.ResponseWriter, r *http handler.ServeHTTP(w, r) } -// GetSession operation middleware -func (siw *ServerInterfaceWrapper) GetSession(w http.ResponseWriter, r *http.Request) { - - var err error - _ = err - - // ------------- Path parameter "sessionId" ------------- - var sessionId string - - err = runtime.BindStyledParameterWithOptions("simple", "sessionId", r.PathValue("sessionId"), &sessionId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "", ValueIsUnescaped: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "sessionId", Err: err}) - return - } - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.GetSession(w, r, sessionId) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r) -} - // CompactSession operation middleware func (siw *ServerInterfaceWrapper) CompactSession(w http.ResponseWriter, r *http.Request) { @@ -4473,32 +4318,6 @@ func (siw *ServerInterfaceWrapper) DismissReady(w http.ResponseWriter, r *http.R handler.ServeHTTP(w, r) } -// ListReviews operation middleware -func (siw *ServerInterfaceWrapper) ListReviews(w http.ResponseWriter, r *http.Request) { - - var err error - _ = err - - // ------------- Path parameter "taskId" ------------- - var taskId string - - err = runtime.BindStyledParameterWithOptions("simple", "taskId", r.PathValue("taskId"), &taskId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "", ValueIsUnescaped: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "taskId", Err: err}) - return - } - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.ListReviews(w, r, taskId) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r) -} - // ListSessions operation middleware func (siw *ServerInterfaceWrapper) ListSessions(w http.ResponseWriter, r *http.Request) { @@ -4551,32 +4370,6 @@ func (siw *ServerInterfaceWrapper) CreateSession(w http.ResponseWriter, r *http. handler.ServeHTTP(w, r) } -// ListSnapshots operation middleware -func (siw *ServerInterfaceWrapper) ListSnapshots(w http.ResponseWriter, r *http.Request) { - - var err error - _ = err - - // ------------- Path parameter "taskId" ------------- - var taskId string - - err = runtime.BindStyledParameterWithOptions("simple", "taskId", r.PathValue("taskId"), &taskId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "", ValueIsUnescaped: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "taskId", Err: err}) - return - } - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.ListSnapshots(w, r, taskId) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r) -} - // ForkSnapshot operation middleware func (siw *ServerInterfaceWrapper) ForkSnapshot(w http.ResponseWriter, r *http.Request) { @@ -4763,32 +4556,6 @@ func (siw *ServerInterfaceWrapper) GetTaskTerminal(w http.ResponseWriter, r *htt handler.ServeHTTP(w, r) } -// GetTaskWorkflow operation middleware -func (siw *ServerInterfaceWrapper) GetTaskWorkflow(w http.ResponseWriter, r *http.Request) { - - var err error - _ = err - - // ------------- Path parameter "taskId" ------------- - var taskId string - - err = runtime.BindStyledParameterWithOptions("simple", "taskId", r.PathValue("taskId"), &taskId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "", ValueIsUnescaped: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "taskId", Err: err}) - return - } - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.GetTaskWorkflow(w, r, taskId) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r) -} - // GetWorkflowRun operation middleware func (siw *ServerInterfaceWrapper) GetWorkflowRun(w http.ResponseWriter, r *http.Request) { @@ -5078,7 +4845,6 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H m.HandleFunc(http.MethodPut+" "+options.BaseURL+"/api/me/pane-focus", wrapper.SetPaneFocus) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/projects", wrapper.ListProjects) m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/projects", wrapper.CreateProject) - m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/projects/{projectId}", wrapper.GetProject) m.HandleFunc(http.MethodPut+" "+options.BaseURL+"/api/projects/{projectId}/review-workflow", wrapper.SetReviewWorkflow) m.HandleFunc(http.MethodPut+" "+options.BaseURL+"/api/projects/{projectId}/audit-workflow", wrapper.SetAuditWorkflow) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/projects/{projectId}/tasks", wrapper.ListActiveTasks) @@ -5094,7 +4860,6 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/projects/{projectId}/raw", wrapper.GetProjectRaw) 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) m.HandleFunc(http.MethodPut+" "+options.BaseURL+"/api/tasks/{taskId}/summary-read", wrapper.MarkSummaryRead) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/workflow/run", wrapper.GetWorkflowRun) m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/tasks/{taskId}/merge", wrapper.MergeTask) @@ -5115,15 +4880,12 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H m.HandleFunc(http.MethodDelete+" "+options.BaseURL+"/api/tasks/{taskId}/terminals/{terminalId}", wrapper.CloseTaskTerminal) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/terminals/{terminalId}", wrapper.GetTaskTerminal) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/previews", wrapper.ListPreviews) - m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/snapshots", wrapper.ListSnapshots) - m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/reviews", wrapper.ListReviews) m.HandleFunc(http.MethodPut+" "+options.BaseURL+"/api/reviews/{reviewId}/findings/{index}", wrapper.SetFindingState) m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/tasks/{taskId}/snapshots/{n}/fork", wrapper.ForkSnapshot) m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/sessions/{sessionId}/continue", wrapper.ContinueSession) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/sessions", wrapper.ListSessions) m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/tasks/{taskId}/sessions", wrapper.CreateSession) m.HandleFunc(http.MethodDelete+" "+options.BaseURL+"/api/tasks/{taskId}/queue/{inputId}", wrapper.WithdrawMessage) - m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/sessions/{sessionId}", wrapper.GetSession) m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/sessions/{sessionId}/messages", wrapper.SendMessage) m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/sessions/{sessionId}/compact", wrapper.CompactSession) m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/sessions/{sessionId}/interrupt", wrapper.InterruptSession) @@ -5132,7 +4894,6 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/blobs", wrapper.UploadBlob) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/blobs/{blobId}", wrapper.GetBlob) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/inbox", wrapper.ListInbox) - m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/inbox/{itemId}", wrapper.GetInboxItem) m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/inbox/{itemId}/dismiss", wrapper.DismissInbox) m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/clients/connect", wrapper.ConnectClient) m.HandleFunc(http.MethodPut+" "+options.BaseURL+"/api/clients/sync", wrapper.SetClientSync) @@ -5160,167 +4921,167 @@ 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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", @@ -5333,204 +5094,198 @@ var swaggerSpec = []string{ "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", + "MHgr7uu3pnz8+PH/HwA=", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/internal/git/git.go b/internal/git/git.go index ee4480e..ed0d4a1 100644 --- a/internal/git/git.go +++ b/internal/git/git.go @@ -53,7 +53,7 @@ func Inspect(ctx context.Context, path string) (RepoInfo, error) { return RepoInfo{}, err } - remote, _, code, err := runCode(ctx, root, nil, "remote", "get-url", Remote) + remote, _, code, err := runCode(ctx, root, "remote", "get-url", Remote) if err != nil { return RepoInfo{}, err } @@ -65,7 +65,7 @@ func Inspect(ctx context.Context, path string) (RepoInfo, error) { } func HasRemote(ctx context.Context, repo string) (bool, error) { - _, _, code, err := runCode(ctx, repo, nil, "remote", "get-url", Remote) + _, _, code, err := runCode(ctx, repo, "remote", "get-url", Remote) return err == nil && code == 0, err } @@ -92,7 +92,7 @@ func AddWorktree(ctx context.Context, repo, path, branch, base string) (string, } func EnsureBranchCommit(ctx context.Context, repo, branch string, env []string) error { - _, _, code, err := runCode(ctx, repo, nil, "rev-parse", "--verify", "--quiet", "refs/heads/"+branch+"^{commit}") + _, _, code, err := runCode(ctx, repo, "rev-parse", "--verify", "--quiet", "refs/heads/"+branch+"^{commit}") if err != nil || code == 0 { return err } @@ -152,7 +152,7 @@ func RemoveWorktree(ctx context.Context, repo, path, branch string) error { } } - _, _, code, err := runCode(ctx, repo, nil, "rev-parse", "--verify", "--quiet", "refs/heads/"+branch) + _, _, code, err := runCode(ctx, repo, "rev-parse", "--verify", "--quiet", "refs/heads/"+branch) if err != nil || code != 0 { return err } @@ -206,7 +206,7 @@ func SquashCommit(ctx context.Context, repo, worktree, target, message string, e return "", err } - out, stderr, code, err := runCode(ctx, repo, nil, "merge-tree", "--write-tree", "--name-only", "--merge-base="+base, head, tree) + out, stderr, code, err := runCode(ctx, repo, "merge-tree", "--write-tree", "--name-only", "--merge-base="+base, head, tree) if err != nil { return "", err } @@ -237,7 +237,7 @@ func SquashCommit(ctx context.Context, repo, worktree, target, message string, e if err != nil { return "", err } - signing, stderr, code, err := runCode(ctx, repo, nil, "config", "--type=bool", "--get", "commit.gpgsign") + signing, stderr, code, err := runCode(ctx, repo, "config", "--type=bool", "--get", "commit.gpgsign") if err != nil { return "", err } @@ -340,7 +340,7 @@ func BranchHead(ctx context.Context, repo, branch string) (string, error) { } func IsAncestor(ctx context.Context, dir, ancestor, descendant string) (bool, error) { - _, stderr, code, err := runCode(ctx, dir, nil, "merge-base", "--is-ancestor", ancestor, descendant) + _, stderr, code, err := runCode(ctx, dir, "merge-base", "--is-ancestor", ancestor, descendant) if err != nil { return false, err } @@ -354,7 +354,7 @@ func IsAncestor(ctx context.Context, dir, ancestor, descendant string) (bool, er } func MergeInProgress(ctx context.Context, dir string) (bool, error) { - _, _, code, err := runCode(ctx, dir, nil, "rev-parse", "--quiet", "--verify", "MERGE_HEAD") + _, _, code, err := runCode(ctx, dir, "rev-parse", "--quiet", "--verify", "MERGE_HEAD") return err == nil && code == 0, err } @@ -368,7 +368,7 @@ func AbortMerge(ctx context.Context, dir string) error { } func ReadFile(ctx context.Context, repo, rev, path string) (string, bool, error) { - _, _, code, err := runCode(ctx, repo, nil, "cat-file", "-e", rev+":"+path) + _, _, code, err := runCode(ctx, repo, "cat-file", "-e", rev+":"+path) if err != nil { return "", false, err } @@ -434,8 +434,8 @@ func runRaw(ctx context.Context, dir string, env []string, input string, args .. return out, nil } -func runCode(ctx context.Context, dir string, env []string, args ...string) (string, string, int, error) { - out, stderr, code, err := runCodeInput(context.WithoutCancel(ctx), dir, env, nil, args...) +func runCode(ctx context.Context, dir string, args ...string) (string, string, int, error) { + out, stderr, code, err := runCodeInput(context.WithoutCancel(ctx), dir, nil, nil, args...) return strings.TrimSpace(out), stderr, code, err } diff --git a/internal/git/notes.go b/internal/git/notes.go index 78c4067..0b4c8e5 100644 --- a/internal/git/notes.go +++ b/internal/git/notes.go @@ -19,7 +19,7 @@ func ConfigureNotesFetch(ctx context.Context, repo string) error { return err } key := "remote." + Remote + ".fetch" - out, stderr, code, err := runCode(ctx, repo, nil, "config", "--get-all", key) + out, stderr, code, err := runCode(ctx, repo, "config", "--get-all", key) if err != nil { return err } @@ -39,7 +39,7 @@ func NoteCommit(ctx context.Context, repo, commit, note string, env []string) (s return "", err } - parent, stderr, code, err := runCode(ctx, repo, nil, "rev-parse", "--verify", "--quiet", NotesRef) + parent, stderr, code, err := runCode(ctx, repo, "rev-parse", "--verify", "--quiet", NotesRef) if err != nil { return "", err } @@ -75,7 +75,7 @@ func NoteCommit(ctx context.Context, repo, commit, note string, env []string) (s } func AdvanceNotes(ctx context.Context, repo, notes string) error { - current, stderr, code, err := runCode(ctx, repo, nil, "rev-parse", "--verify", "--quiet", NotesRef) + current, stderr, code, err := runCode(ctx, repo, "rev-parse", "--verify", "--quiet", NotesRef) if err != nil { return err } diff --git a/internal/git/rename.go b/internal/git/rename.go index 35939c1..470cfd9 100644 --- a/internal/git/rename.go +++ b/internal/git/rename.go @@ -54,7 +54,7 @@ func RepairWorktrees(ctx context.Context, repo string, paths []string) error { } func RewriteNotes(ctx context.Context, repo string, rewrite func(string) string) error { - parent, stderr, code, err := runCode(ctx, repo, nil, "rev-parse", "--verify", "--quiet", NotesRef) + parent, stderr, code, err := runCode(ctx, repo, "rev-parse", "--verify", "--quiet", NotesRef) if err != nil { return err } diff --git a/internal/server/inbox.go b/internal/server/inbox.go index 5804477..6e7557d 100644 --- a/internal/server/inbox.go +++ b/internal/server/inbox.go @@ -7,13 +7,8 @@ import ( "g.fc.run/ai/byre/internal/store" ) -func (s *Server) ListInbox(w http.ResponseWriter, r *http.Request, params api.ListInboxParams) { - f := store.InboxFilter{State: api.Open, ProjectID: api.Deref(params.ProjectId), TaskID: api.Deref(params.TaskId)} - if params.State != nil { - f.State = *params.State - } - - items, err := s.store.ListInbox(r.Context(), f) +func (s *Server) ListInbox(w http.ResponseWriter, r *http.Request) { + items, err := s.store.ListInbox(r.Context(), store.InboxFilter{State: api.Open}) if err != nil { writeStoreError(w, err) return @@ -21,15 +16,6 @@ func (s *Server) ListInbox(w http.ResponseWriter, r *http.Request, params api.Li writeJSON(w, http.StatusOK, items) } -func (s *Server) GetInboxItem(w http.ResponseWriter, r *http.Request, itemID string) { - item, err := s.store.GetInboxItem(r.Context(), itemID) - if err != nil { - writeStoreError(w, err) - return - } - writeJSON(w, http.StatusOK, item) -} - func (s *Server) DismissInbox(w http.ResponseWriter, r *http.Request, itemID string) { item, err := s.agents.Dismiss(r.Context(), actor(r), itemID) if err != nil { diff --git a/internal/server/reviews.go b/internal/server/reviews.go index 8b52120..0b0f62f 100644 --- a/internal/server/reviews.go +++ b/internal/server/reviews.go @@ -7,19 +7,6 @@ import ( "g.fc.run/ai/byre/internal/api" ) -func (s *Server) ListReviews(w http.ResponseWriter, r *http.Request, taskID string) { - if !s.taskExists(w, r, taskID) { - return - } - - reviews, err := s.store.ListReviews(r.Context(), taskID) - if err != nil { - writeStoreError(w, err) - return - } - writeJSON(w, http.StatusOK, reviews) -} - func (s *Server) SetFindingState(w http.ResponseWriter, r *http.Request, reviewID string, index int) { req := api.FindingStateUpdate{} if !readJSON(w, r, &req) { diff --git a/internal/server/server.go b/internal/server/server.go index 8451266..57e5168 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -355,15 +355,6 @@ func (s *Server) createProject(ctx context.Context, name, repoPath, createdBy st return p, nil } -func (s *Server) GetProject(w http.ResponseWriter, r *http.Request, projectID string) { - p, err := s.store.GetProject(r.Context(), projectID) - if err != nil { - writeStoreError(w, err) - return - } - writeJSON(w, http.StatusOK, p) -} - func (s *Server) ListActiveTasks(w http.ResponseWriter, r *http.Request, projectID string) { _, err := s.store.GetProject(r.Context(), projectID) if err != nil { @@ -777,19 +768,6 @@ func (s *Server) ListTaskEvents(w http.ResponseWriter, r *http.Request, taskID s writeJSON(w, http.StatusOK, events) } -func (s *Server) ListSnapshots(w http.ResponseWriter, r *http.Request, taskID string) { - if !s.taskExists(w, r, taskID) { - return - } - - snaps, err := s.store.ListSnapshots(r.Context(), taskID) - if err != nil { - writeStoreError(w, err) - return - } - writeJSON(w, http.StatusOK, snaps) -} - func (s *Server) ListPreviews(w http.ResponseWriter, r *http.Request, taskID string) { if !s.taskExists(w, r, taskID) { return @@ -922,15 +900,6 @@ func (s *Server) CreateSession(w http.ResponseWriter, r *http.Request, taskID st writeJSON(w, http.StatusCreated, sess) } -func (s *Server) GetSession(w http.ResponseWriter, r *http.Request, sessionID string) { - sess, err := s.store.GetSession(r.Context(), sessionID) - if err != nil { - writeStoreError(w, err) - return - } - writeJSON(w, http.StatusOK, sess) -} - func (s *Server) SendMessage(w http.ResponseWriter, r *http.Request, sessionID string) { prompt, ok := s.readMessage(w, r) if !ok { diff --git a/internal/server/workflows.go b/internal/server/workflows.go index aad32b1..83cba6b 100644 --- a/internal/server/workflows.go +++ b/internal/server/workflows.go @@ -78,15 +78,6 @@ func (s *Server) DeleteWorkflow(w http.ResponseWriter, r *http.Request, name str w.WriteHeader(http.StatusNoContent) } -func (s *Server) GetTaskWorkflow(w http.ResponseWriter, r *http.Request, taskID string) { - tw, err := s.agents.TaskWorkflow(r.Context(), taskID) - if err != nil { - writeStoreError(w, err) - return - } - writeJSON(w, http.StatusOK, tw) -} - func (s *Server) GetWorkflowRun(w http.ResponseWriter, r *http.Request, taskID string) { run, err := s.agents.WorkflowRun(r.Context(), taskID) if err != nil { diff --git a/internal/store/inbox.go b/internal/store/inbox.go index 8cee512..0823f62 100644 --- a/internal/store/inbox.go +++ b/internal/store/inbox.go @@ -72,28 +72,18 @@ func (s *Store) GetInboxItem(ctx context.Context, id string) (api.InboxItem, err } type InboxFilter struct { - ProjectID string - TaskID string - SessionID string - State api.InboxState + TaskID string + State api.InboxState } func (s *Store) ListInbox(ctx context.Context, f InboxFilter) ([]api.InboxItem, error) { where := []string{"state = ?"} args := []any{string(f.State)} - if f.ProjectID != "" { - where = append(where, "project_id = ?") - args = append(args, f.ProjectID) - } if f.TaskID != "" { where = append(where, "task_id = ?") args = append(args, f.TaskID) } - if f.SessionID != "" { - where = append(where, "agent_session_id = ?") - args = append(args, f.SessionID) - } ids, err := queryIDs(ctx, s.db, `SELECT id FROM inbox_items WHERE `+strings.Join(where, " AND ")+` ORDER BY created_at`, args...) if err != nil { diff --git a/internal/store/snapshot.go b/internal/store/snapshot.go index 549300e..a706723 100644 --- a/internal/store/snapshot.go +++ b/internal/store/snapshot.go @@ -41,24 +41,6 @@ func (s *Store) CreateSnapshot(ctx context.Context, snap api.Snapshot, projectID }) } -func (s *Store) ListSnapshots(ctx context.Context, taskID string) ([]api.Snapshot, error) { - rows, err := s.db.QueryContext(ctx, `SELECT `+snapshotColumns+` FROM snapshots WHERE task_id = ? ORDER BY n`, taskID) - if err != nil { - return nil, err - } - defer rows.Close() - - snaps := []api.Snapshot{} - for rows.Next() { - snap, err := scanSnapshot(rows) - if err != nil { - return nil, err - } - snaps = append(snaps, snap) - } - return snaps, rows.Err() -} - func (s *Store) GetSnapshot(ctx context.Context, taskID string, n int) (api.Snapshot, error) { snap, err := scanSnapshot(s.db.QueryRowContext(ctx, `SELECT `+snapshotColumns+` FROM snapshots WHERE task_id = ? AND n = ?`, taskID, n)) if errors.Is(err, sql.ErrNoRows) {