Make task state store-owned and signal its changes to the lead

This commit is contained in:
Ian Gulliver
2026-10-16 11:15:32 -07:00
parent 34db128afe
commit d26c81ceb1
15 changed files with 451 additions and 199 deletions
+10 -5
View File
@@ -56,6 +56,12 @@ export function findTask(id) {
export function currentSession(taskId) {
return state.sessions.get(taskId)?.findLast((s) => s.state !== "completed") ?? state.sessions.get(taskId)?.at(-1);
}
const workingTitles = {
running: "The agent is mid-turn",
review_pending: "A review of the turn's work is about to start",
reviewing: "A review is running",
discarding: "Discarding",
};
export function taskState(task) {
const open = state.inbox.filter((item) => item.task_id === task.id);
if (open.some((item) => item.kind === "question")) {
@@ -73,8 +79,9 @@ export function taskState(task) {
if (open.length > 0) {
return { kind: "error", label: "Error", title: "The agent's session failed or hit a rate limit; see the inbox" };
}
if (task.discarding || task.reviewing || currentSession(task.id)?.state === "running") {
return { kind: "working", label: "Working", title: task.discarding ? "Discarding" : task.reviewing ? "A review is running" : "The agent is mid-turn" };
const working = workingTitles[task.state];
if (working !== undefined) {
return { kind: "working", label: "Working", title: working };
}
return { kind: "idle", label: "Idle", title: "Waiting for a message" };
}
@@ -360,6 +367,7 @@ export function handleEvent(ev) {
case "task.discard_started":
case "task.merged":
case "task.discarded":
case "task.state":
if (ev.project_id) {
void loadTasks(ev.project_id);
}
@@ -395,9 +403,6 @@ export function handleEvent(ev) {
break;
case "review.started":
case "review.finished":
if (ev.project_id) {
void loadTasks(ev.project_id);
}
if (state.inbox.some((i) => i.task_id === ev.task_id && i.kind === "question")) {
void loadInbox();
}