Skip to content

Commit 1b0ea78

Browse files
eureka0928Wendong-Fanclaude
authored
refactor: extract status and step enums from magic strings (eigent-ai#951)
Co-authored-by: Wendong-Fan <w3ndong.fan@gmail.com> Co-authored-by: Claude <noreply@anthropic.com>
1 parent 4fb48f6 commit 1b0ea78

18 files changed

Lines changed: 414 additions & 264 deletions

File tree

src/components/BrowserAgentWorkSpace/index.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3030
import { TaskState } from '../TaskState';
3131
import { Button } from '../ui/button';
32+
import { TaskStatus } from "@/types/constants";
3233

3334
export default function Home() {
3435
//Get Chatstore for the active project's task
@@ -223,26 +224,26 @@ export default function Home() {
223224
}
224225
done={
225226
activeAgent?.tasks?.filter(
226-
(task) => task.status === 'completed'
227+
(task) => task.status === TaskStatus.COMPLETED
227228
).length || 0
228229
}
229230
progress={
230231
activeAgent?.tasks?.filter(
231232
(task) =>
232-
task.status !== 'failed' &&
233-
task.status !== 'completed' &&
234-
task.status !== 'skipped' &&
235-
task.status !== 'waiting'
233+
task.status !== TaskStatus.FAILED &&
234+
task.status !== TaskStatus.COMPLETED &&
235+
task.status !== TaskStatus.SKIPPED &&
236+
task.status !== TaskStatus.WAITING
236237
).length || 0
237238
}
238239
failed={
239-
activeAgent?.tasks?.filter((task) => task.status === 'failed')
240+
activeAgent?.tasks?.filter((task) => task.status === TaskStatus.FAILED)
240241
.length || 0
241242
}
242243
skipped={
243244
activeAgent?.tasks?.filter(
244245
(task) =>
245-
task.status === 'skipped' || task.status === 'waiting'
246+
task.status === TaskStatus.SKIPPED || task.status === TaskStatus.WAITING
246247
).length || 0
247248
}
248249
/>

src/components/ChatBox/BottomBox/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { BoxAction } from './BoxAction';
1616
import { BoxHeaderConfirm, BoxHeaderSplitting } from './BoxHeader';
1717
import { FileAttachment, Inputbox, InputboxProps } from './InputBox';
1818
import { QueuedBox, QueuedMessage } from './QueuedBox';
19+
import { type ChatTaskStatusType } from "@/types/constants";
1920

2021
export type BottomBoxState =
2122
| 'input'
@@ -42,7 +43,7 @@ interface BottomBoxProps {
4243
// Task info
4344
tokens?: number;
4445
taskTime?: string;
45-
taskStatus?: 'running' | 'finished' | 'pending' | 'pause';
46+
taskStatus?: ChatTaskStatusType;
4647

4748
// Replay
4849
onReplay?: () => void;

src/components/ChatBox/FloatingAction.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@
1414

1515
import { Button } from '@/components/ui/button';
1616
import { cn } from '@/lib/utils';
17+
import { ChatTaskStatus, type ChatTaskStatusType } from '@/types/constants';
1718

1819
export interface FloatingActionProps {
1920
/** Current task status */
20-
status: 'running' | 'pause' | 'pending' | 'finished';
21+
status: ChatTaskStatusType;
2122
/** Callback when pause button is clicked */
2223
// onPause?: () => void; // Commented out - temporary not needed
2324
/** Callback when resume button is clicked */
@@ -39,7 +40,7 @@ export const FloatingAction = ({
3940
className,
4041
}: FloatingActionProps) => {
4142
// Only show when task is running (removed pause state)
42-
if (status !== 'running') {
43+
if (status !== ChatTaskStatus.RUNNING) {
4344
return null;
4445
}
4546

src/components/ChatBox/ProjectSection.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { motion } from 'framer-motion';
1717
import React from 'react';
1818
import { FloatingAction } from './FloatingAction';
1919
import { UserQueryGroup } from './UserQueryGroup';
20+
import { AgentStep } from '@/types/constants';
2021

2122
interface ProjectSectionProps {
2223
chatId: string;
@@ -161,7 +162,7 @@ function groupMessagesByQuery(messages: any[]) {
161162
userMessage: message,
162163
otherMessages: [],
163164
};
164-
} else if (message.step === 'to_sub_tasks') {
165+
} else if (message.step === AgentStep.TO_SUB_TASKS) {
165166
// Task planning message - each should get its own panel
166167

167168
// Skip if we've already processed this to_sub_tasks

src/components/ChatBox/TaskBox/TaskCard.tsx

Lines changed: 51 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import {
3737
import { useMemo, useState, useRef, useEffect } from "react";
3838
import { TaskState, TaskStateType } from "@/components/TaskState";
3939
import useChatStoreAdapter from "@/hooks/useChatStoreAdapter";
40+
import { TaskStatus, ChatTaskStatus } from "@/types/constants";
4041

4142
interface TaskCardProps {
4243
taskInfo: any[];
@@ -87,24 +88,24 @@ export function TaskCard({
8788
const newFiltered = tasks.filter((task) => {
8889
switch (selectedState) {
8990
case "done":
90-
return task.status === "completed" && !task.reAssignTo;
91+
return task.status === TaskStatus.COMPLETED && !task.reAssignTo;
9192
case "ongoing":
9293
return (
93-
task.status !== "failed" &&
94-
task.status !== "completed" &&
95-
task.status !== "skipped" &&
96-
task.status !== "waiting" &&
97-
task.status !== ""
94+
task.status !== TaskStatus.FAILED &&
95+
task.status !== TaskStatus.COMPLETED &&
96+
task.status !== TaskStatus.SKIPPED &&
97+
task.status !== TaskStatus.WAITING &&
98+
task.status !== TaskStatus.EMPTY
9899
);
99100
case "pending":
100101
return (
101-
(task.status === "skipped" ||
102-
task.status === "waiting" ||
103-
task.status === "") &&
102+
(task.status === TaskStatus.SKIPPED ||
103+
task.status === TaskStatus.WAITING ||
104+
task.status === TaskStatus.EMPTY) &&
104105
!task.reAssignTo
105106
);
106107
case "failed":
107-
return task.status === "failed";
108+
return task.status === TaskStatus.FAILED;
108109
default:
109110
return false;
110111
}
@@ -115,7 +116,7 @@ export function TaskCard({
115116

116117
const isAllTaskFinished = useMemo(() => {
117118
return (
118-
chatStore.tasks[chatStore.activeTaskId as string].status === "finished"
119+
chatStore.tasks[chatStore.activeTaskId as string].status === ChatTaskStatus.FINISHED
119120
);
120121
}, [chatStore.tasks[chatStore.activeTaskId as string].status]);
121122

@@ -207,32 +208,32 @@ export function TaskCard({
207208
done={
208209
taskInfo.filter(
209210
(task) =>
210-
task.content !== "" && task.status === "completed"
211+
task.content !== "" && task.status === TaskStatus.COMPLETED
211212
).length || 0
212213
}
213214
progress={
214215
taskInfo.filter(
215216
(task) =>
216217
task.content !== "" &&
217-
task.status !== "completed" &&
218-
task.status !== "failed" &&
219-
task.status !== "skipped" &&
220-
task.status !== "waiting" &&
221-
task.status !== ""
218+
task.status !== TaskStatus.COMPLETED &&
219+
task.status !== TaskStatus.FAILED &&
220+
task.status !== TaskStatus.SKIPPED &&
221+
task.status !== TaskStatus.WAITING &&
222+
task.status !== TaskStatus.EMPTY
222223
).length || 0
223224
}
224225
skipped={
225226
taskInfo.filter(
226227
(task) =>
227228
task.content !== "" &&
228-
(task.status === "skipped" ||
229-
task.status === "waiting" ||
230-
task.status === "")
229+
(task.status === TaskStatus.SKIPPED ||
230+
task.status === TaskStatus.WAITING ||
231+
task.status === TaskStatus.EMPTY)
231232
).length || 0
232233
}
233234
failed={
234235
taskInfo.filter(
235-
(task) => task.content !== "" && task.status === "failed"
236+
(task) => task.content !== "" && task.status === TaskStatus.FAILED
236237
).length || 0
237238
}
238239
forceVisible={true}
@@ -243,29 +244,29 @@ export function TaskCard({
243244
<TaskState
244245
all={taskRunning?.length || 0}
245246
done={
246-
taskRunning?.filter((task) => task.status === "completed")
247+
taskRunning?.filter((task) => task.status === TaskStatus.COMPLETED)
247248
.length || 0
248249
}
249250
progress={
250251
taskRunning?.filter(
251252
(task) =>
252-
task.status !== "completed" &&
253-
task.status !== "failed" &&
254-
task.status !== "skipped" &&
255-
task.status !== "waiting" &&
256-
task.status !== ""
253+
task.status !== TaskStatus.COMPLETED &&
254+
task.status !== TaskStatus.FAILED &&
255+
task.status !== TaskStatus.SKIPPED &&
256+
task.status !== TaskStatus.WAITING &&
257+
task.status !== TaskStatus.EMPTY
257258
).length || 0
258259
}
259260
skipped={
260261
taskRunning?.filter(
261262
(task) =>
262-
task.status === "skipped" ||
263-
task.status === "waiting" ||
264-
task.status === ""
263+
task.status === TaskStatus.SKIPPED ||
264+
task.status === TaskStatus.WAITING ||
265+
task.status === TaskStatus.EMPTY
265266
).length || 0
266267
}
267268
failed={
268-
taskRunning?.filter((task) => task.status === "failed")
269+
taskRunning?.filter((task) => task.status === TaskStatus.FAILED)
269270
.length || 0
270271
}
271272
forceVisible={true}
@@ -288,8 +289,8 @@ export function TaskCard({
288289
<div className="text-text-tertiary text-xs font-medium leading-17">
289290
{taskRunning?.filter(
290291
(task) =>
291-
task.status === "completed" ||
292-
task.status === "failed"
292+
task.status === TaskStatus.COMPLETED ||
293+
task.status === TaskStatus.FAILED
293294
).length || 0}
294295
/{taskRunning?.length || 0}
295296
</div>
@@ -371,70 +372,70 @@ export function TaskCard({
371372
}
372373
}}
373374
key={`taskList-${task.id}`}
374-
className={`rounded-lg flex gap-2 py-sm px-sm transition-all duration-300 ease-in-out animate-in fade-in-0 slide-in-from-left-2 ${task.status === "completed"
375+
className={`rounded-lg flex gap-2 py-sm px-sm transition-all duration-300 ease-in-out animate-in fade-in-0 slide-in-from-left-2 ${task.status === TaskStatus.COMPLETED
375376
? "bg-task-fill-success"
376-
: task.status === "failed"
377+
: task.status === TaskStatus.FAILED
377378
? "bg-task-fill-error"
378-
: task.status === "running"
379+
: task.status === TaskStatus.RUNNING
379380
? "bg-task-fill-running"
380-
: task.status === "blocked"
381+
: task.status === TaskStatus.BLOCKED
381382
? "bg-task-fill-warning"
382383
: "bg-task-fill-running"
383-
} border border-solid border-transparent cursor-pointer ${task.status === "completed"
384+
} border border-solid border-transparent cursor-pointer ${task.status === TaskStatus.COMPLETED
384385
? "hover:border-bg-fill-success-primary"
385-
: task.status === "failed"
386+
: task.status === TaskStatus.FAILED
386387
? "hover:border-task-border-focus-error"
387-
: task.status === "running"
388+
: task.status === TaskStatus.RUNNING
388389
? "hover:border-border-primary"
389-
: task.status === "blocked"
390+
: task.status === TaskStatus.BLOCKED
390391
? "hover:border-task-border-focus-warning"
391392
: "border-transparent"
392393
}
393394
`}
394395
>
395396
<div className="pt-0.5">
396-
{task.status === "running" && (
397+
{task.status === TaskStatus.RUNNING && (
397398
<LoaderCircle
398399
size={16}
399400
className={`text-icon-information ${chatStore.tasks[
400401
chatStore.activeTaskId as string
401-
].status === "running" && "animate-spin"
402+
].status === ChatTaskStatus.RUNNING && "animate-spin"
402403
} `}
403404
/>
404405
)}
405-
{task.status === "skipped" && (
406+
{task.status === TaskStatus.SKIPPED && (
406407
<LoaderCircle
407408
size={16}
408409
className={`text-icon-secondary `}
409410
/>
410411
)}
411-
{task.status === "completed" && (
412+
{task.status === TaskStatus.COMPLETED && (
412413
<CircleCheckBig
413414
size={16}
414415
className="text-icon-success"
415416
/>
416417
)}
417-
{task.status === "failed" && (
418+
{task.status === TaskStatus.FAILED && (
418419
<CircleSlash
419420
size={16}
420421
className="text-icon-cuation"
421422
/>
422423
)}
423-
{task.status === "blocked" && (
424+
{task.status === TaskStatus.BLOCKED && (
424425
<TriangleAlert
425426
size={16}
426427
className="text-icon-warning"
427428
/>
428429
)}
429-
{task.status === "" && (
430+
{task.status === TaskStatus.EMPTY && (
430431
<Circle size={16} className="text-icon-secondary" />
431432
)}
432433
</div>
433434
<div className="flex-1 flex flex-col items-start justify-center">
434435
<div
435-
className={` w-full break-words whitespace-pre-line ${task.status === "failed"
436+
className={` w-full break-words whitespace-pre-line ${task.status === TaskStatus.FAILED
436437
? "text-text-cuation-default"
437-
: task.status === "blocked"
438+
: task.status === TaskStatus.BLOCKED
438439
? "text-text-body"
439440
: "text-text-primary"
440441
} text-sm font-medium leading-13 `}

src/components/ChatBox/UserQueryGroup.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { UserMessageCard } from './MessageItem/UserMessageCard';
2727
import { StreamingTaskList } from './TaskBox/StreamingTaskList';
2828
import { TaskCard } from './TaskBox/TaskCard';
2929
import { TypeCardSkeleton } from './TaskBox/TypeCardSkeleton';
30+
import { AgentStep, ChatTaskStatus } from '@/types/constants';
3031

3132
interface QueryGroup {
3233
queryId: string;
@@ -86,7 +87,7 @@ export const UserQueryGroup: React.FC<UserQueryGroupProps> = ({
8687
if (userMessageIndex > 0) {
8788
// Check the previous message - if it's an agent message with step 'ask', this is a human-reply
8889
const prevMessage = messages[userMessageIndex - 1];
89-
return prevMessage?.role === 'agent' && prevMessage?.step === 'ask';
90+
return prevMessage?.role === 'agent' && prevMessage?.step === AgentStep.ASK;
9091
}
9192
return false;
9293
})());
@@ -102,7 +103,7 @@ export const UserQueryGroup: React.FC<UserQueryGroupProps> = ({
102103
.filter((m: any) => m.role === 'user')
103104
.pop()?.id &&
104105
// Only show during active phases (not finished)
105-
chatState.tasks[activeTaskId].status !== 'finished';
106+
chatState.tasks[activeTaskId].status !== ChatTaskStatus.FINISHED;
106107

107108
// Only show the fallback task box for the newest query while the agent is still splitting work.
108109
// Simple Q&A sessions set hasWaitComfirm to true, so we should not render an empty task box there.
@@ -185,11 +186,11 @@ export const UserQueryGroup: React.FC<UserQueryGroupProps> = ({
185186

186187
// Check if we're in skeleton phase
187188
const anyToSubTasksMessage = task?.messages.find(
188-
(m: any) => m.step === 'to_sub_tasks'
189+
(m: any) => m.step === AgentStep.TO_SUB_TASKS
189190
);
190191
const isSkeletonPhase =
191192
task &&
192-
((task.status !== 'finished' &&
193+
((task.status !== ChatTaskStatus.FINISHED &&
193194
!anyToSubTasksMessage &&
194195
!task.hasWaitComfirm &&
195196
task.messages.length > 0) ||
@@ -282,7 +283,7 @@ export const UserQueryGroup: React.FC<UserQueryGroupProps> = ({
282283
{/* Other Messages */}
283284
{queryGroup.otherMessages.map((message) => {
284285
if (message.content.length > 0) {
285-
if (message.step === 'end') {
286+
if (message.step === AgentStep.END) {
286287
return (
287288
<motion.div
288289
key={`end-${message.id}`}
@@ -375,7 +376,7 @@ export const UserQueryGroup: React.FC<UserQueryGroupProps> = ({
375376
</motion.div>
376377
);
377378
}
378-
} else if (message.step === 'end' && message.content === '') {
379+
} else if (message.step === AgentStep.END && message.content === '') {
379380
return (
380381
<motion.div
381382
key={`end-empty-${message.id}`}
@@ -423,7 +424,7 @@ export const UserQueryGroup: React.FC<UserQueryGroupProps> = ({
423424

424425
// Notice Card
425426
if (
426-
message.step === 'notice_card' &&
427+
message.step === AgentStep.NOTICE_CARD &&
427428
!task?.isTakeControl &&
428429
task?.cotList &&
429430
task.cotList.length > 0

0 commit comments

Comments
 (0)