Skip to content

Commit 53d3bbc

Browse files
committed
feat: Add StepsSummaryPanel and related components for ali-fullstack tags parsing
1 parent 77861e0 commit 53d3bbc

15 files changed

Lines changed: 1230 additions & 21 deletions

src/atoms/stepsAtoms.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { atom } from "jotai";
2+
3+
export interface StepError {
4+
summary: string;
5+
details?: string;
6+
timestamp: Date;
7+
}
8+
9+
export interface StepItem {
10+
id: string;
11+
title: string;
12+
description?: string;
13+
status: "pending" | "in_progress" | "completed" | "failed";
14+
error?: StepError;
15+
chatId: number;
16+
createdAt: Date;
17+
updatedAt: Date;
18+
completedAt?: Date;
19+
}
20+
21+
export const stepsListAtom = atom<StepItem[]>([]);
22+
export const isStepsSummaryOpenAtom = atom<boolean>(false);
23+
24+
// Derive step counts
25+
export const stepsSummaryAtom = atom((get) => {
26+
const steps = get(stepsListAtom);
27+
return {
28+
total: steps.length,
29+
completed: steps.filter((s) => s.status === "completed").length,
30+
failed: steps.filter((s) => s.status === "failed").length,
31+
inProgress: steps.filter((s) => s.status === "in_progress").length,
32+
pending: steps.filter((s) => s.status === "pending").length,
33+
};
34+
});

src/components/ChatPanel.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { useState, useRef, useEffect, useCallback } from "react";
22
import { useAtom, useAtomValue } from "jotai";
33
import { chatMessagesAtom, chatStreamCountAtom } from "../atoms/chatAtoms";
44
import { isTodoPanelOpenAtom } from "../atoms/todoAtoms";
5+
import { isStepsSummaryOpenAtom } from "../atoms/stepsAtoms";
6+
import { StepsSummaryPanel } from "./StepsSummaryPanel";
57
import { IpcClient } from "@/ipc/ipc_client";
68
import { useSettings } from "@/hooks/useSettings";
79
import { AppOutput } from "@/ipc/ipc_types";
@@ -34,6 +36,7 @@ export function ChatPanel({
3436

3537
const [messages, setMessages] = useAtom(chatMessagesAtom);
3638
const [isTodoPanelOpen, setIsTodoPanelOpen] = useAtom(isTodoPanelOpenAtom);
39+
const [isStepsPanelOpen, setIsStepsPanelOpen] = useAtom(isStepsSummaryOpenAtom);
3740
const [isVersionPaneOpen, setIsVersionPaneOpen] = useState(false);
3841
const [error, setError] = useState<string | null>(null);
3942
const streamCount = useAtomValue(chatStreamCountAtom);
@@ -47,6 +50,7 @@ export function ChatPanel({
4750
isFullstackMode,
4851
isFrontendMode,
4952
isTodoPanelOpen,
53+
isStepsPanelOpen,
5054
showTodoToggle: isFullstackMode || isFrontendMode,
5155
});
5256
// Reference to store the processed prompt so we don't submit it twice
@@ -206,6 +210,9 @@ export function ChatPanel({
206210
showTodoToggle={isFullstackMode || isFrontendMode}
207211
isTodoPanelOpen={isTodoPanelOpen}
208212
onToggleTodo={() => setIsTodoPanelOpen(!isTodoPanelOpen)}
213+
showStepsToggle={true}
214+
isStepsPanelOpen={isStepsPanelOpen}
215+
onToggleSteps={() => setIsStepsPanelOpen(!isStepsPanelOpen)}
209216
/>
210217
<div className="flex flex-1 overflow-hidden">
211218
{!isVersionPaneOpen && (
@@ -227,6 +234,12 @@ export function ChatPanel({
227234
/>
228235
</div>
229236
</div>
237+
{isStepsPanelOpen && (
238+
<StepsSummaryPanel
239+
isOpen={isStepsPanelOpen}
240+
onClose={() => setIsStepsPanelOpen(false)}
241+
/>
242+
)}
230243
{(isFullstackMode || isFrontendMode) && isTodoPanelOpen && (
231244
<TodoListPanel
232245
isOpen={isTodoPanelOpen}

0 commit comments

Comments
 (0)