Q130: every open task says why it is not moving, when it resumes, and who must act

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ZacharyZhang-NYandClaude Opus 5.5 committed 2026-10-08 21:27:29 -04:00
1 parent 271a83a7bc
commit 074a1fc8e3
14 files changed
+255 -7

No files matched your search

+5
View File
@@ -31,6 +31,11 @@ export const zh: Record<string, string> = {
"Writing": "写作方式",
"superseded": "已被取代",
"stalled": "已停滞",
"needs you": "待你处理",
"waiting": "等待中",
"Resumes on its own at {time}.": "将于 {time} 自动恢复。",
"Waiting on you, or resumes on its own at {time}.": "等待你处理,或于 {time} 自动恢复。",
"Waiting on you.": "等待你处理。",
"Resume": "恢复",
"Missing this run": "本次运行缺少的能力",
"Disconnect": "断开连接",
+5
View File
@@ -338,6 +338,11 @@ function TaskCard({
<div className="row" style={{ flexWrap: "wrap", gap: 6, minWidth: 0 }}>
{project ? <Pill>{project.name}</Pill> : <Pill>{capitalize(task.risk)}</Pill>}
{task.stalledReason && task.status !== "done" && <Pill tone="red">{t("stalled")}</Pill>}
{task.hold && !task.stalledReason && (
<span title={task.hold.reason} style={{ display: "inline-flex" }}>
<Pill tone={task.hold.waitingOn === "operator" ? "red" : "amber"}>{task.hold.waitingOn === "operator" ? t("needs you") : t("waiting")}</Pill>
</span>
)}
{task.status !== "done" && latestRun && (
<span style={{ flexShrink: 0, display: "inline-flex" }}>
<Pill tone={runTone(latestRun.state)}>{prettyRunState(latestRun.state)}</Pill>
@@ -1,3 +1,4 @@
import { TaskHoldNotice } from "./TaskHoldNotice";
import { useState, type FormEvent } from "react";
import { Avatar, Button, Field, Icon, IconButton, Pill, Segmented } from "../../shared/ui";
import type {
@@ -142,7 +143,7 @@ function OverviewTab({ task, assignee, project, goal, workspace, provider, runs
}) {
return (
<>
{task.stalledReason && <div className="form-error" role="alert" style={{ marginBottom: 12 }}>{task.stalledReason}</div>}
{task.hold && <TaskHoldNotice hold={task.hold} />}
{task.description && (
<p style={{ margin: "0 0 14px", color: "var(--text-2)", fontSize: 14, lineHeight: 1.55, whiteSpace: "pre-wrap" }}>{task.description}</p>
)}
@@ -0,0 +1,22 @@
import type { TaskHold } from "../../../../shared/domain";
import { t } from "../../i18n/i18n";
function when(iso: string): string {
return new Date(iso).toLocaleString([], { month: "short", day: "numeric", hour: "2-digit", minute: "2-digit", hour12: false });
}
/** Why an open task is not moving, when it resumes on its own, and whether it waits on the operator. */
export function TaskHoldNotice({ hold }: { hold: TaskHold }) {
const next = hold.waitingOn === "provider"
? t("Resumes on its own at {time}.", { time: when(hold.resumesAt) })
: hold.resumesAt
? t("Waiting on you, or resumes on its own at {time}.", { time: when(hold.resumesAt) })
: t("Waiting on you.");
const color = hold.waitingOn === "operator" ? "var(--red)" : "var(--amber)";
return (
<div role="status" style={{ marginBottom: 12, fontSize: 13, color, lineHeight: 1.5 }}>
<div>{hold.reason}</div>
<div style={{ fontWeight: 600 }}>{next}</div>
</div>
);
}