diff --git a/TODO.md b/TODO.md index fe1965a..e247e5f 100644 --- a/TODO.md +++ b/TODO.md @@ -12,8 +12,6 @@ - Workflow tab A read-only right-pane tab on tasks with a `workflow_run`, showing the frozen graph (lazy-loaded Mermaid) and a textual stage list linking to each stage's task attempts and their finish_stage output. Each stage shows waiting on named dependencies, running, idle but not finished, finished, discarded before finishing, or discarded by normal cleanup after finishing, and which fork attempt fed the next stage. Backed by a typed run-progress API carrying the frozen definition, attempts, completion and dependency provenance, updated from sibling-task events. -- Start a workflow from the switcher - A "Start workflow…" entry beside "New task in …" in the switcher starts a saved workflow. # M6 — Fan-out diff --git a/api/openapi.yaml b/api/openapi.yaml index 54445fc..186acae 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -194,7 +194,9 @@ paths: "404": { $ref: "#/components/responses/Error" } post: operationId: createTask - description: Creates the task's branch and worktree from the project's default branch. + description: > + Creates the task's branch and worktree from the project's default branch, or with workflow, starts a run of + that workflow from it. requestBody: required: true content: @@ -1048,6 +1050,12 @@ components: required: [title] properties: title: { type: string } + workflow: + type: string + description: > + The name of a saved workflow to run instead of creating one task with no agent: each stage with no after + stages becomes its own task, titled ": <stage>", with the title as the run's brief. The response is + the first of those tasks. WorkflowSummary: type: object diff --git a/docs/operations.md b/docs/operations.md index 2fc1f96..79d3c27 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -293,14 +293,14 @@ Every new snapshot of a task gets a review: a separate agent session on the vend ## Workflows -A workflow is a named graph of stages, each a stage name, the stages it comes after, where its branch starts, a model and the stage agent's prompt written out in full. Every stage runs as its own task, once all the stages it comes after have finished, so one stage's output can go to several stages (fan-out) and one stage can wait for several (fan-in). Workflows live in byre's database, in the `workflows` table (`name`, and the definition's JSON as `definition`), shared by every project and never in a repo. byre stores, validates, exports, imports and freezes them, and runs each run's frozen copy stage by stage (`internal/agents/workflows.go`; the graph helpers `After`, `Next`, `Starts` and `FromMain` are in `internal/workflow/workflow.go`). There is no UI for starting or managing them: the lead does both with its tools, and draws a workflow for the human as a Mermaid flowchart of its stage names, which its chat renders (see "Inbox"). +A workflow is a named graph of stages, each a stage name, the stages it comes after, where its branch starts, a model and the stage agent's prompt written out in full. Every stage runs as its own task, once all the stages it comes after have finished, so one stage's output can go to several stages (fan-out) and one stage can wait for several (fan-in). Workflows live in byre's database, in the `workflows` table (`name`, and the definition's JSON as `definition`), shared by every project and never in a repo. byre stores, validates, exports, imports and freezes them, and runs each run's frozen copy stage by stage (`internal/agents/workflows.go`; the graph helpers `After`, `Next`, `Starts` and `FromMain` are in `internal/workflow/workflow.go`). The human starts one from the task switcher (see "Starting"); there is no UI for managing them: the lead does that with its tools, and draws a workflow for the human as a Mermaid flowchart of its stage names, which its chat renders (see "Inbox"). - **Names.** The name is the workflow's key and is shown to the human on buttons and pickers, so it is free text: one line of 1 to 100 characters, trimmed (`workflow.CleanName`). It isn't part of the definition, so the file doesn't carry it. In URLs it is a path-escaped segment. - **File.** One workflow per file: the `WorkflowDefinition` (`api/openapi.yaml`) as YAML, an optional `description` and its `stages`. A stage's `after` lists the stages whose outputs it gets; absent, it means the previous stage in the list (none for the first), so a file without `after` is a chain; `[]` means the stage starts from the brief. Its `base` is `parent` (the default: the commit its one `after` stage finished at, or for a stage with none, where the run was started from) or `main` (the project's default branch); a stage with more than one `after` stage always starts from the default branch. `workflow.Format` writes it with multi-line prompts as literal blocks; `workflow.Parse` reads YAML or JSON and refuses unknown fields. The download is named after the workflow with `/\:*?"<>|` replaced by `_` (`workflow.Filename`). - **Validation.** `workflow.Validate` refuses a definition (400, everything wrong listed) with no stages, a stage name that isn't a valid one-line name or repeats another stage's, an empty model or an empty prompt, a `base` other than `parent` or `main`, a `base` on a stage with more than one `after` stage, an `after` naming the stage itself, a name twice or a name that isn't a stage, a cycle, or anything but exactly one final stage (one no other stage comes after). A stage's vendor follows from its model (`workflow.VendorOf`, the same rule sessions use: `gpt-*` is Codex, everything else Claude Code); a file with a `vendor` key is refused as an unknown field. - **API.** `GET /api/workflows` lists every workflow's name and description. `GET /api/workflows/{name}` downloads its file; `PUT` takes a file as the body and creates or replaces the workflow; `DELETE` removes it. Each save or delete records a `workflow.updated` or `workflow.deleted` event carrying the name. `sqlite3 byre.db 'SELECT name FROM workflows'` lists them. Saves and reads go through the Manager (`internal/agents/workflows.go`) so the HTTP API and the lead's tools share them. - **Lead tools.** `list_workflows`, `read_workflow` (`name`, or `task_id` for a task's frozen copy), `save_workflow` (`name` and `definition`, the file as YAML) and `delete_workflow`, with the same checks and errors as the API. Task agents don't get them. -- **Starting.** The lead's `create_task` and `start_todo` take an optional `workflow` (404 when there is none of that name) and then start a run of it instead of an agent on the prompt (`Manager.StartWorkflow`); `model` together with `workflow` is refused, since each stage names its own. A run gets a new id and creates a task for every stage with no `after` stages, branched from the default branch, or for a stage with `base: parent`, from the lead's `from_task_id` HEAD when given. Each stage task copies the workflow's name and definition as they are when the run starts into `tasks.workflow_name` and `tasks.workflow_definition`, so later saves or deletes don't change it; its brief into `tasks.workflow_brief` (the lead's `create_task` `prompt`, optional with a workflow and may be empty, or for `start_todo` the TODO item as `todoPrompt` words it); the run's title into `tasks.workflow_title`; the run id into `tasks.workflow_run`; and its stage's name into `tasks.workflow_stage`. Stage tasks are titled `<title>: <stage>`, with the run's title as their merge title, and carry the run's TODO item. The Task's `workflow`, `workflow_run` and `workflow_stage` are those; `GET /api/tasks/{id}/workflow` returns the copy as `{name, definition}` with the definition as YAML (404 for a task without one). A task agent's `create_subtask`, `POST /api/projects/{id}/tasks` and the Project tab's Start create tasks without one. A fork of a stage task copies its frozen workflow, brief, title, run and stage, so it is another attempt at the same stage of the same run. `sqlite3 byre.db "SELECT id, status, workflow_stage, stage_output != '' FROM tasks WHERE workflow_run = '<run>'"` lists a run's tasks and which have finished. +- **Starting.** The lead's `create_task` and `start_todo` take an optional `workflow` (404 when there is none of that name) and then start a run of it instead of an agent on the prompt (`Manager.StartWorkflow`); `model` together with `workflow` is refused, since each stage names its own. `POST /api/projects/{id}/tasks` takes the same optional `workflow`, with the title as the run's brief, and returns the run's first stage task. The task switcher (`web/src/switcher.ts`) offers it as a "Start workflow…" row after each "New task in …" row: picking that lists `GET /api/workflows`, filtered by what is typed next (Esc goes back to the task list), and picking a workflow starts the run with the typed title and opens its first stage task. A run gets a new id and creates a task for every stage with no `after` stages, branched from the default branch, or for a stage with `base: parent`, from the lead's `from_task_id` HEAD when given. Each stage task copies the workflow's name and definition as they are when the run starts into `tasks.workflow_name` and `tasks.workflow_definition`, so later saves or deletes don't change it; its brief into `tasks.workflow_brief` (the lead's `create_task` `prompt`, optional with a workflow and may be empty, or for `start_todo` the TODO item as `todoPrompt` words it); the run's title into `tasks.workflow_title`; the run id into `tasks.workflow_run`; and its stage's name into `tasks.workflow_stage`. Stage tasks are titled `<title>: <stage>`, with the run's title as their merge title, and carry the run's TODO item. The Task's `workflow`, `workflow_run` and `workflow_stage` are those; `GET /api/tasks/{id}/workflow` returns the copy as `{name, definition}` with the definition as YAML (404 for a task without one). A task agent's `create_subtask`, `POST /api/projects/{id}/tasks` without `workflow` and the Project tab's Start create tasks without one. A fork of a stage task copies its frozen workflow, brief, title, run and stage, so it is another attempt at the same stage of the same run. `sqlite3 byre.db "SELECT id, status, workflow_stage, stage_output != '' FROM tasks WHERE workflow_run = '<run>'"` lists a run's tasks and which have finished. - **Stages.** A stage task's agent is an implementer session on the stage's model, created by the user who started the run; any later session of the task (a Compact handoff's, one started by a message) runs the same stage, since the stage belongs to the task. Starting a stage records a `task.workflow_stage` event on its task (`workflow`, `run`, `stage` the name, `after` the ids of the tasks whose outputs it gets; actor the lead for the stages a run starts with, `byre` after) and sends the session its first message, actor `byre`, so the transcript shows it collapsed under its first line: `Workflow "<name>", stage "<stage>"`, then the stage's prompt, a `## Brief` section when the brief isn't empty, a `## From stage "<stage>" (task <id>, branch <branch>)` section with each `after` stage's output, and a line saying where the task starts: from the default branch, with the branches above to `git merge` or read as it needs, or from the commit its one `after` stage finished at. Nothing else of earlier stages is passed on; their branches carry their work. - **Advancing.** A stage session gets the `finish_stage` tool (`output`, required) and a guidance line naming the workflow, its stage and the stages after it. The call stores the output in `agent_sessions.stage_output`, replacing any earlier one; it is refused once the task's stage has finished. When a turn of that session ends normally (not an error or interrupt, not a handoff, not a Merge turn that squashes) with an output stored, byre sets `agent_sessions.stage_finished` before marking the session idle, and then advances (`nextStage`): it records the output and the worktree's HEAD in `tasks.stage_output` and `tasks.stage_commit`, then, holding `workflowMu` so two stages finishing at once can't both start the one after them, goes through each stage after this one. A stage starts once every stage it comes after has a finished task in the run (the latest one, when a fork made several); its task branches from that task's `stage_commit` for `base: parent` with one `after` stage, else from the default branch. Once every stage after it has been dealt with, byre clears `stage_output` and `stage_finished` on the session. The session stays idle in its task for more messages, and queued messages and held answers are delivered to it once advancing is done. When the final stage finishes, byre starts discarding every other active task of the run (as `byre`, through the same `Discard` as the button, so each gets its summary turn first and closes when that turn ends; one already merging or being discarded is skipped and logged as `stage task not discarded`), then records `task.workflow_finished` (`workflow`, `output`) on the final task and clears the flags in the same transaction, leaving the final task for the human to merge. A turn that ends without the call leaves the task in its stage. The output belongs to the turn that stored it: when that turn ends any other way (an error, an interrupt, a handoff, a Merge turn that squashes, an agent process that exits mid-turn, or a session that can't be resumed after a restart), byre clears `stage_output` before marking the session idle, so a later turn can't hand off a stale output; the agent calls `finish_stage` again. A turn cut off by a byre restart and resumed keeps it. If a stage can't start, byre logs `advance workflow stage` and files the error in the finishing task's inbox, and the flag stays set. On startup, before resuming running sessions, `recoverStages` advances every session with `stage_finished` set, skipping the steps already done: the recorded output isn't overwritten; a stage that already has a task in the run isn't created again, but when that task is active and has no session, its session is started, and when its session never got a message (`SessionStarted`), it is sent the stage's first message, and the restart notice isn't sent to it. `sqlite3 byre.db 'SELECT id, task_id FROM agent_sessions WHERE stage_finished = 1'` lists stages waiting to advance. `list_tasks` shows each stage task's workflow and `stage "<name>"`, with `(finished)` once its stage has finished and `workflow finished` once any task of the run has a `task.workflow_finished` event. Nothing reads or writes `agent_sessions.workflow_stage`; it stays in the schema so builds from older branches keep working against the same database. diff --git a/internal/api/api.gen.go b/internal/api/api.gen.go index 0f690c6..1398cee 100644 --- a/internal/api/api.gen.go +++ b/internal/api/api.gen.go @@ -982,6 +982,9 @@ type TaskChanges struct { // TaskCreate defines model for TaskCreate. type TaskCreate struct { Title string `json:"title"` + + // Workflow The name of a saved workflow to run instead of creating one task with no agent: each stage with no after stages becomes its own task, titled "<title>: <stage>", with the title as the run's brief. The response is the first of those tasks. + Workflow *string `json:"workflow,omitempty"` } // TaskTab defines model for TaskTab. @@ -3066,195 +3069,197 @@ 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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", + "HkO+U13kjx//fwAAAP//", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/internal/server/server.go b/internal/server/server.go index cf359a1..83659e5 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -276,6 +276,21 @@ func (s *Server) CreateTask(w http.ResponseWriter, r *http.Request, projectID st return } + if req.Workflow != nil { + u, err := s.store.GetUser(r.Context(), actor(r)) + if err != nil { + writeStoreError(w, err) + return + } + tasks, err := s.agents.StartWorkflow(r.Context(), p, u, req.Title, p.DefaultBranch, u.Login, *req.Workflow, req.Title, nil) + if err != nil { + writeAgentError(w, err) + return + } + writeJSON(w, http.StatusCreated, tasks[0]) + return + } + t, err := s.agents.CreateTask(r.Context(), p, req.Title, actor(r), p.DefaultBranch, actor(r)) if err != nil { writeAgentError(w, err) diff --git a/web/dist/api.js.map b/web/dist/api.js.map index 064ecde..bb4cc64 100644 --- a/web/dist/api.js.map +++ b/web/dist/api.js.map @@ -1 +1 @@ -{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAkDA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACZ;IAArB,YAAqB,MAAc,EAAE,OAAe;QAClD,KAAK,CAAC,OAAO,CAAC,CAAC;QADI,WAAM,GAAN,MAAM,CAAQ;IAEnC,CAAC;CACF;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,IAAyC;IACrE,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;IAChE,IAAI,GAAG,GAAW,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE;QAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAC,EAAE,CAAC;QACzF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACnB,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAS,EACT,IAAO,EACP,OAA0B,EAAE;IAE5B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,KAAK,EAAE,CAAC;IAC/F,IAAI,IAAI,CAAC,IAAI,YAAY,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,0BAA0B,EAAE,CAAC;QAChF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,SAA6B,CAAC;IACvC,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAG,IAAyB,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,IAAwB,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,CAA6B,IAAO,EAAE,IAA4B,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrH,MAAM,CAAC,MAAM,IAAI,GAAG,CAA8B,IAAO,EAAE,IAA6B,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACzH,MAAM,CAAC,MAAM,GAAG,GAAG,CAA6B,IAAO,EAAE,IAA4B,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrH,MAAM,CAAC,MAAM,GAAG,GAAG,CAAgC,IAAO,EAAE,IAA+B,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE9H,MAAM,UAAU,MAAM,CAA6B,IAAO,EAAE,IAA2B;IACrF,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACtH,EAAE,CAAC,UAAU,GAAG,aAAa,CAAC;IAC9B,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,YAAY,GAAG,KAAK,CAAC;AAE3B,MAAM,UAAU,SAAS,CACvB,KAAa,EACb,MAA4C,EAC5C,OAAgC,EAChC,OAAqC,EACrC,OAAmB;IAEnB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,MAA+B,CAAC;IACpC,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC;QAClD,MAAM,GAAG,CAAC,CAAC;QACX,CAAC,CAAC,MAAM,GAAG,GAAG,EAAE;YACd,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC;QACF,CAAC,CAAC,OAAO,GAAG,GAAG,EAAE;YACf,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,IAAI,CAAC,CAAC,UAAU,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;gBACxC,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC;QACF,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;YAC9B,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YAC/B,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,SAAS,GAAG,CAAC,GAAyB,EAAE,EAAE;YAC1C,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAc,CAAC;YAC7C,IAAI,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;gBAClB,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC;YAChB,CAAC;YACD,OAAO,CAAC,EAAE,CAAC,CAAC;QACd,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,YAAY,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YAC3C,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3C,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpC,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;IACzD,OAAO,EAAE,CAAC;IACV,OAAO,GAAG,EAAE;QACV,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvC,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,EAAE,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC"} \ No newline at end of file diff --git a/web/dist/switcher.js b/web/dist/switcher.js index 7bb9af9..6d7abd0 100644 --- a/web/dist/switcher.js +++ b/web/dist/switcher.js @@ -1,4 +1,4 @@ -import { post } from "./api.js"; +import { get, post } from "./api.js"; import { errorText, h, replace, showAlert } from "./dom.js"; import { focusLead } from "./panes.js"; import { activeTasks, findTask, focusedProject, focusProject, focusTab, focusTask, lastVisits, onEach, state, taskState } from "./state.js"; @@ -51,6 +51,7 @@ const shortcuts = [ ["↑ ↓", "Move the highlight"], ["Enter", "Pick the highlighted row"], ["name: title", "Create the task in the project whose name starts with name"], + ["Esc", "Back from the workflow list to the task list"], ], ], [ @@ -81,12 +82,14 @@ export function openSwitcher() { if (document.querySelector(".switcher")) { return; } - const input = h("input", { placeholder: "Go to a task, or type a title to create one…", autocomplete: "off" }); + const placeholder = "Go to a task, or type a title to create one…"; + const input = h("input", { placeholder, autocomplete: "off" }); const list = h("ul", { class: "switcher-list" }); const backdrop = h("div", { class: "switcher-backdrop" }); const box = h("div", { class: "switcher" }, input, list); let selected = 0; let rows = []; + let picking = null; const offs = onEach(["projects", "tasks", "sessions", "inbox"], () => render()); const onEscape = (e) => { if (e.key !== "Escape") { @@ -94,6 +97,14 @@ export function openSwitcher() { } e.preventDefault(); e.stopPropagation(); + if (picking) { + input.value = picking.typed; + input.placeholder = placeholder; + picking = null; + selected = 0; + render(); + return; + } close(); }; addEventListener("keydown", onEscape, { capture: true }); @@ -107,17 +118,62 @@ export function openSwitcher() { close(); focusTask(taskId, state.inbox.some((item) => item.task_id === taskId) ? "inbox" : "transcript"); }; - const create = async (projectId, title) => { + const create = async (projectId, title, workflow) => { close(); try { - const task = await post("/api/projects/{projectId}/tasks", { path: { projectId }, body: { title } }); + const task = await post("/api/projects/{projectId}/tasks", { path: { projectId }, body: { title, workflow } }); go(task.id); } catch (err) { void showAlert(errorText(err)); } }; + const pickWorkflow = async (project, title) => { + const p = { project, title, typed: input.value, workflows: undefined }; + picking = p; + input.value = ""; + input.placeholder = `Pick a workflow to start in ${project.name}: ${title}`; + selected = 0; + render(); + input.focus(); + try { + p.workflows = await get("/api/workflows"); + } + catch (err) { + close(); + void showAlert(errorText(err)); + return; + } + if (picking === p) { + render(); + } + }; + const renderWorkflows = (p) => { + const q = input.value.trim().toLowerCase(); + rows = (p.workflows ?? []) + .filter((w) => `${w.name} ${w.description}`.toLowerCase().includes(q)) + .map((w) => { + const el = h("li", { class: "new-task" }, h("span", { class: "task-title" }, "Start ", h("span", { class: "workflow-name" }, w.name), " in ", h("span", { class: "project-name" }, p.project.name), ": ", p.title, w.description && h("span", { class: "workflow-description" }, w.description)), h("span", { class: "task-state" }, "workflow")); + return { el, pick: () => void create(p.project.id, p.title, w.name) }; + }); + if (p.workflows === undefined) { + return "Loading workflows…"; + } + return p.workflows.length === 0 ? "No saved workflows." : "No workflow matches."; + }; const render = () => { + const empty = picking ? renderWorkflows(picking) : renderTasks(); + selected = Math.min(selected, Math.max(rows.length - 1, 0)); + rows.forEach((row, i) => { + row.el.classList.toggle("selected", i === selected); + row.el.onmousedown = (e) => { + e.preventDefault(); + row.pick(); + }; + }); + replace(list, ...rows.map((r) => r.el), rows.length === 0 && h("li", { class: "empty-row" }, empty)); + }; + const renderTasks = () => { const typed = input.value.trim(); const prefix = /^([^:\s]+):\s*(.*)$/.exec(typed); const named = prefix ? state.projects.filter((p) => p.name.toLowerCase().startsWith(prefix[1].toLowerCase())) : []; @@ -149,16 +205,10 @@ export function openSwitcher() { for (const project of title ? (targets ?? (fallback ? [fallback] : [])) : []) { const el = h("li", { class: "new-task" }, h("span", { class: "task-title" }, "New task in ", h("span", { class: "project-name" }, project.name), ": ", title), h("span", { class: "task-state", title: "Model for the first message" }, models[0])); rows.push({ el, pick: () => void create(project.id, title) }); + const wf = h("li", { class: "new-task" }, h("span", { class: "task-title" }, "Start workflow… in ", h("span", { class: "project-name" }, project.name), ": ", title), h("span", { class: "task-state" }, "workflow")); + rows.push({ el: wf, pick: () => void pickWorkflow(project, title) }); } - selected = Math.min(selected, Math.max(rows.length - 1, 0)); - rows.forEach((row, i) => { - row.el.classList.toggle("selected", i === selected); - row.el.onmousedown = (e) => { - e.preventDefault(); - row.pick(); - }; - }); - replace(list, ...rows.map((r) => r.el), rows.length === 0 && h("li", { class: "empty-row" }, "No active tasks. Type a title to create one.")); + return "No active tasks. Type a title to create one."; }; input.oninput = () => { selected = 0; diff --git a/web/dist/switcher.js.map b/web/dist/switcher.js.map index 3042de3..3a480a7 100644 --- a/web/dist/switcher.js.map +++ b/web/dist/switcher.js.map @@ -1 +1 @@ -{"version":3,"file":"switcher.js","sourceRoot":"","sources":["../src/switcher.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"switcher.js","sourceRoot":"","sources":["../src/switcher.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/web/src/api.gen.ts b/web/src/api.gen.ts index 5d6e0f9..2c1f745 100644 --- a/web/src/api.gen.ts +++ b/web/src/api.gen.ts @@ -185,7 +185,7 @@ export interface paths { }; get: operations["listTasks"]; put?: never; - /** @description Creates the task's branch and worktree from the project's default branch. */ + /** @description Creates the task's branch and worktree from the project's default branch, or with workflow, starts a run of that workflow from it. */ post: operations["createTask"]; delete?: never; options?: never; @@ -978,6 +978,8 @@ export interface components { }; TaskCreate: { title: string; + /** @description The name of a saved workflow to run instead of creating one task with no agent: each stage with no after stages becomes its own task, titled "<title>: <stage>", with the title as the run's brief. The response is the first of those tasks. */ + workflow?: string; }; WorkflowSummary: { name: string; diff --git a/web/src/api.ts b/web/src/api.ts index 507079b..6e01d65 100644 --- a/web/src/api.ts +++ b/web/src/api.ts @@ -21,6 +21,7 @@ export type Participant = Schemas["Participant"]; export type Focus = Schemas["Focus"]; export type TaskTab = Schemas["TaskTab"]; export type LeadNote = Schemas["LeadNote"]; +export type WorkflowSummary = Schemas["WorkflowSummary"]; type Method = "get" | "post" | "put" | "delete"; diff --git a/web/src/switcher.ts b/web/src/switcher.ts index f082a0f..f339428 100644 --- a/web/src/switcher.ts +++ b/web/src/switcher.ts @@ -1,4 +1,4 @@ -import { post } from "./api.js"; +import { get, post, type Project, type WorkflowSummary } from "./api.js"; import { errorText, h, replace, showAlert } from "./dom.js"; import { focusLead } from "./panes.js"; import { activeTasks, findTask, focusedProject, focusProject, focusTab, focusTask, lastVisits, onEach, state, taskState } from "./state.js"; @@ -49,6 +49,7 @@ const shortcuts: [string, [string, string][]][] = [ ["↑ ↓", "Move the highlight"], ["Enter", "Pick the highlighted row"], ["name: title", "Create the task in the project whose name starts with name"], + ["Esc", "Back from the workflow list to the task list"], ], ], [ @@ -89,12 +90,14 @@ export function openSwitcher(): void { return; } - const input = h("input", { placeholder: "Go to a task, or type a title to create one…", autocomplete: "off" }); + const placeholder = "Go to a task, or type a title to create one…"; + const input = h("input", { placeholder, autocomplete: "off" }); const list = h("ul", { class: "switcher-list" }); const backdrop = h("div", { class: "switcher-backdrop" }); const box = h("div", { class: "switcher" }, input, list); let selected = 0; let rows: { el: HTMLElement; pick: () => void }[] = []; + let picking: { project: Project; title: string; typed: string; workflows: WorkflowSummary[] | undefined } | null = null; const offs = onEach(["projects", "tasks", "sessions", "inbox"], () => render()); const onEscape = (e: KeyboardEvent) => { @@ -103,6 +106,14 @@ export function openSwitcher(): void { } e.preventDefault(); e.stopPropagation(); + if (picking) { + input.value = picking.typed; + input.placeholder = placeholder; + picking = null; + selected = 0; + render(); + return; + } close(); }; addEventListener("keydown", onEscape, { capture: true }); @@ -118,17 +129,79 @@ export function openSwitcher(): void { focusTask(taskId, state.inbox.some((item) => item.task_id === taskId) ? "inbox" : "transcript"); }; - const create = async (projectId: string, title: string) => { + const create = async (projectId: string, title: string, workflow?: string) => { close(); try { - const task = await post("/api/projects/{projectId}/tasks", { path: { projectId }, body: { title } }); + const task = await post("/api/projects/{projectId}/tasks", { path: { projectId }, body: { title, workflow } }); go(task.id); } catch (err) { void showAlert(errorText(err)); } }; + const pickWorkflow = async (project: Project, title: string) => { + const p = { project, title, typed: input.value, workflows: undefined as WorkflowSummary[] | undefined }; + picking = p; + input.value = ""; + input.placeholder = `Pick a workflow to start in ${project.name}: ${title}`; + selected = 0; + render(); + input.focus(); + try { + p.workflows = await get("/api/workflows"); + } catch (err) { + close(); + void showAlert(errorText(err)); + return; + } + if (picking === p) { + render(); + } + }; + + const renderWorkflows = (p: NonNullable<typeof picking>) => { + const q = input.value.trim().toLowerCase(); + rows = (p.workflows ?? []) + .filter((w) => `${w.name} ${w.description}`.toLowerCase().includes(q)) + .map((w) => { + const el = h( + "li", + { class: "new-task" }, + h( + "span", + { class: "task-title" }, + "Start ", + h("span", { class: "workflow-name" }, w.name), + " in ", + h("span", { class: "project-name" }, p.project.name), + ": ", + p.title, + w.description && h("span", { class: "workflow-description" }, w.description), + ), + h("span", { class: "task-state" }, "workflow"), + ); + return { el, pick: () => void create(p.project.id, p.title, w.name) }; + }); + if (p.workflows === undefined) { + return "Loading workflows…"; + } + return p.workflows.length === 0 ? "No saved workflows." : "No workflow matches."; + }; + const render = () => { + const empty = picking ? renderWorkflows(picking) : renderTasks(); + selected = Math.min(selected, Math.max(rows.length - 1, 0)); + rows.forEach((row, i) => { + row.el.classList.toggle("selected", i === selected); + row.el.onmousedown = (e) => { + e.preventDefault(); + row.pick(); + }; + }); + replace(list, ...rows.map((r) => r.el), rows.length === 0 && h("li", { class: "empty-row" }, empty)); + }; + + const renderTasks = () => { const typed = input.value.trim(); const prefix = /^([^:\s]+):\s*(.*)$/.exec(typed); const named = prefix ? state.projects.filter((p) => p.name.toLowerCase().startsWith(prefix[1]!.toLowerCase())) : []; @@ -181,16 +254,15 @@ export function openSwitcher(): void { h("span", { class: "task-state", title: "Model for the first message" }, models[0]), ); rows.push({ el, pick: () => void create(project.id, title) }); + const wf = h( + "li", + { class: "new-task" }, + h("span", { class: "task-title" }, "Start workflow… in ", h("span", { class: "project-name" }, project.name), ": ", title), + h("span", { class: "task-state" }, "workflow"), + ); + rows.push({ el: wf, pick: () => void pickWorkflow(project, title) }); } - selected = Math.min(selected, Math.max(rows.length - 1, 0)); - rows.forEach((row, i) => { - row.el.classList.toggle("selected", i === selected); - row.el.onmousedown = (e) => { - e.preventDefault(); - row.pick(); - }; - }); - replace(list, ...rows.map((r) => r.el), rows.length === 0 && h("li", { class: "empty-row" }, "No active tasks. Type a title to create one.")); + return "No active tasks. Type a title to create one."; }; input.oninput = () => { diff --git a/web/style.css b/web/style.css index f04ff19..89bf219 100644 --- a/web/style.css +++ b/web/style.css @@ -2180,6 +2180,15 @@ button.danger-primary { color: var(--accent); } +.switcher-list .workflow-name { + font-weight: 700; +} + +.switcher-list .workflow-description { + display: block; + color: var(--muted); +} + .switcher-list li.selected { background: var(--accent-tint); }