Give each workflow run a parent task with no agent

This commit is contained in:
Ian Gulliver
2026-10-21 09:02:09 -07:00
parent d062d7ccae
commit a130b9556d
23 changed files with 661 additions and 474 deletions
+11 -8
View File
@@ -66,6 +66,7 @@ private func stateColor(_ state: String) -> Color {
struct WorkflowView: View {
@Environment(Store.self) private var store
@ViewState private var run: WorkflowRun?
@ViewState private var runId: String?
@ViewState private var error = ""
@ViewState private var target = 0
@ViewState private var loading = false
@@ -74,8 +75,8 @@ struct WorkflowView: View {
var body: some View {
let task = store.selectedTaskId.flatMap { store.findTask($0) }
VStack(spacing: 0) {
if let task, let runId = task.workflowRun {
if let run, run.run == runId {
if let task, task.workflow != nil {
if let run, runId == task.id {
HStack(alignment: .firstTextBaseline, spacing: 10) {
Text(run.name).font(Fonts.font(13, weight: 700))
Text(run.title).foregroundStyle(Palette.muted)
@@ -114,13 +115,14 @@ struct WorkflowView: View {
EmptyText(text: "Loading…")
}
} else {
EmptyText(text: task != nil ? "This task isn't part of a workflow run." : "No task selected.")
EmptyText(text: task != nil ? "This task isn't a workflow run." : "No task selected.")
}
}
.frame(maxHeight: .infinity, alignment: .top)
.task(id: store.selectedTaskId) {
target += 1
run = nil
runId = nil
error = ""
await load()
let off = store.events.add { ev in
@@ -134,7 +136,7 @@ struct WorkflowView: View {
off()
target += 1
}
.onChange(of: task?.workflowRun) {
.onChange(of: task?.workflow) {
if run == nil && !loading && error.isEmpty {
Task {
await load()
@@ -144,13 +146,13 @@ struct WorkflowView: View {
}
private func relevant(_ ev: ByreEvent) -> Bool {
guard ev.seq != 0, let run else {
guard ev.seq != 0, let run, let runId else {
return false
}
if ev.kind == "task.created" {
return ev.payload.value["workflow_run"] as? String == run.run
return ev.payload.value["parent_task_id"] as? String == runId
}
let ids = Set(run.stages.flatMap { $0.attempts.map(\.taskId) })
let ids = Set(run.stages.flatMap { $0.attempts.map(\.taskId) } + [runId])
guard let taskId = ev.taskId else {
return false
}
@@ -158,7 +160,7 @@ struct WorkflowView: View {
}
private func load() async {
guard let taskId = store.selectedTaskId, store.findTask(taskId)?.workflowRun != nil else {
guard let taskId = store.selectedTaskId, store.findTask(taskId)?.workflow != nil else {
return
}
if loading {
@@ -172,6 +174,7 @@ struct WorkflowView: View {
let fresh = try await store.api.client.getWorkflowRun(path: .init(taskId: taskId)).ok.body.json
if started == target {
run = fresh
runId = taskId
error = ""
}
} catch {