Mark unread turn summaries in the switcher and Project rows
This commit is contained in:
+46
-2
@@ -19,7 +19,9 @@ export type Topic =
|
||||
| "lead.transcript"
|
||||
| "lead.stream"
|
||||
| "ready"
|
||||
| "lead.ready";
|
||||
| "lead.ready"
|
||||
| "summaries"
|
||||
| "jump";
|
||||
|
||||
export const tabs: TaskTab[] = ["transcript", "changes", "files", "terminal", "inbox", "reviews", "workflow", "project"];
|
||||
|
||||
@@ -37,6 +39,8 @@ export const state = {
|
||||
focus: { tabs: ["transcript"], tab: "transcript" } as Focus,
|
||||
leadSessions: [] as AgentSession[],
|
||||
leadTranscript: [] as ByreEvent[],
|
||||
jump: undefined as { taskId: string; seq: number } | undefined,
|
||||
summaryReads: {} as Record<string, number>,
|
||||
};
|
||||
|
||||
const listeners = new Map<Topic, Set<(detail?: unknown) => void>>();
|
||||
@@ -355,6 +359,37 @@ function markVisited(taskId: string | undefined): void {
|
||||
localStorage.setItem(visitsKey, JSON.stringify({ ...lastVisits(), [taskId]: Date.now() }));
|
||||
}
|
||||
|
||||
export async function loadSummaryReads(): Promise<void> {
|
||||
state.summaryReads = await get("/api/me/summary-reads");
|
||||
notify("summaries");
|
||||
}
|
||||
|
||||
export function unreadSummary(task: Task): boolean {
|
||||
return task.summary_seq > (state.summaryReads[task.id] ?? 0);
|
||||
}
|
||||
|
||||
function noteSummaryRead(taskId: string, seq: number): boolean {
|
||||
if ((state.summaryReads[taskId] ?? 0) >= seq) {
|
||||
return false;
|
||||
}
|
||||
state.summaryReads[taskId] = seq;
|
||||
notify("summaries");
|
||||
return true;
|
||||
}
|
||||
|
||||
export function markSummaryRead(taskId: string, seq: number): void {
|
||||
if (!noteSummaryRead(taskId, seq)) {
|
||||
return;
|
||||
}
|
||||
put("/api/tasks/{taskId}/summary-read", { path: { taskId }, body: { seq } }).catch((err: unknown) => console.error("mark summary read", err));
|
||||
}
|
||||
|
||||
export function openSummary(task: Task): void {
|
||||
state.jump = { taskId: task.id, seq: task.summary_seq };
|
||||
focusTask(task.id, "transcript");
|
||||
notify("jump");
|
||||
}
|
||||
|
||||
export function selectTask(taskId: string | undefined): void {
|
||||
markVisited(state.selectedTaskId);
|
||||
markVisited(taskId);
|
||||
@@ -419,8 +454,17 @@ export function handleEvent(ev: ByreEvent): void {
|
||||
case "inbox.updated":
|
||||
void loadInbox();
|
||||
break;
|
||||
case "turn.ended":
|
||||
case "turn.ended": {
|
||||
notifyTurn(ev);
|
||||
const task = ev.payload["summary"] === true && ev.task_id ? findTask(ev.task_id) : undefined;
|
||||
if (task && ev.seq > task.summary_seq) {
|
||||
task.summary_seq = ev.seq;
|
||||
notify("summaries");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "summary.read":
|
||||
noteSummaryRead(String(ev.payload["task_id"]), Number(ev.payload["seq"]));
|
||||
break;
|
||||
case "review.started":
|
||||
case "review.finished":
|
||||
|
||||
Reference in New Issue
Block a user