Skip to content

Commit 0e6140d

Browse files
committed
fix(): refine activity plan with serviceflow
1 parent ec2a2ba commit 0e6140d

File tree

16 files changed

+191
-64
lines changed

16 files changed

+191
-64
lines changed

bricks/ai-portal/src/chat-panel/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ function LegacyChatPanelComponent(
351351
const streamContextValue = useMemo(
352352
() => ({
353353
lastDetail: null,
354+
planMap: null,
354355
toggleAutoScroll,
355356
setUserClosedAside: () => {},
356357
}),

bricks/ai-portal/src/chat-stream/Aside/FlowApp/FlowApp.tsx

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -164,20 +164,15 @@ function LegacyActivityDetail(
164164
return tasks.find((t) => t.id === activity.taskId)!;
165165
}, [tasks, activity.taskId]);
166166

167-
const fixedTasks = useMemo(() => {
168-
return [
169-
{
170-
...activityTask,
171-
parent: undefined,
172-
},
173-
];
174-
}, [activityTask]);
175-
176167
const { messages } = useConversationStream(
177168
true,
178169
activityTask.state,
179-
fixedTasks,
180-
errors
170+
tasks,
171+
errors,
172+
{
173+
rootTaskId: activity.taskId,
174+
expandAskUser: true,
175+
}
181176
);
182177

183178
useImperativeHandle(ref, () => ({

bricks/ai-portal/src/chat-stream/ChatStream.tsx

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -114,18 +114,19 @@ export function ChatStreamComponent(
114114
!NON_WORKING_STATES.includes(conversationState!);
115115
const canChat = conversationDone || conversationState === "input-required";
116116
const { flowMap, activityMap } = useFlowAndActivityMap(serviceFlows);
117-
const { messages, jobMap, lastDetail, activeAskUser } = useConversationStream(
118-
conversationAvailable,
119-
conversation?.state,
120-
tasks,
121-
errors,
122-
{
123-
flowMap,
124-
activityMap,
125-
showHumanActions,
126-
skipActivitySubTasks: true,
127-
}
128-
);
117+
const { messages, jobMap, planMap, lastDetail, activeAskUser } =
118+
useConversationStream(
119+
conversationAvailable,
120+
conversation?.state,
121+
tasks,
122+
errors,
123+
{
124+
flowMap,
125+
activityMap,
126+
showHumanActions,
127+
skipActivitySubTasks: true,
128+
}
129+
);
129130

130131
useEffect(() => {
131132
onDetailChange({
@@ -402,10 +403,11 @@ export function ChatStreamComponent(
402403
const streamContextValue = useMemo(
403404
() => ({
404405
lastDetail,
406+
planMap,
405407
setUserClosedAside,
406408
toggleAutoScroll,
407409
}),
408-
[lastDetail, toggleAutoScroll]
410+
[lastDetail, planMap, toggleAutoScroll]
409411
);
410412

411413
return (
@@ -442,7 +444,13 @@ export function ChatStreamComponent(
442444
)}
443445
</div>
444446
))}
445-
{activeAskUser && <AskUser task={activeAskUser.task} />}
447+
{activeAskUser && (
448+
<AskUser
449+
task={activeAskUser.task}
450+
parentJob={activeAskUser.parentJob}
451+
parentTask={activeAskUser.parentTask}
452+
/>
453+
)}
446454
{earlyFinished && (
447455
<div className={styles.message}>
448456
<AssistantMessage earlyFinished />

bricks/ai-portal/src/chat-stream/StreamContext.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ import type { ActiveDetail } from "../shared/interfaces";
33

44
export interface StreamContextValue {
55
lastDetail: ActiveDetail | null;
6+
planMap: Map<string, any> | null;
67
setUserClosedAside: Dispatch<React.SetStateAction<boolean>>;
78
toggleAutoScroll: (enabled: boolean) => void;
89
}
910

1011
export const StreamContext = createContext<StreamContextValue>({
1112
lastDetail: null,
13+
planMap: null,
1214
setUserClosedAside: () => {},
1315
toggleAutoScroll: () => {},
1416
});

bricks/ai-portal/src/chat-stream/useConversationStream.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export interface UseConversationStreamOptions {
1818
showHumanActions?: boolean;
1919
skipActivitySubTasks?: boolean;
2020
rootTaskId?: string;
21+
expandAskUser?: boolean;
2122
}
2223

2324
export function useConversationStream(
@@ -33,24 +34,31 @@ export function useConversationStream(
3334
rootTaskId,
3435
flowMap,
3536
activityMap,
37+
expandAskUser,
3638
} = options || {};
3739

3840
return useMemo(() => {
3941
if (!conversationAvailable) {
4042
return {
4143
messages: [],
4244
lastDetail: null,
45+
planMap: null,
4346
activeAskUser: null,
4447
};
4548
}
4649

47-
const { chunks, jobMap, activeAskUser } = getFlatChunks(tasks, errors, {
48-
flowMap,
49-
activityMap,
50-
skipActivitySubTasks,
51-
enablePlan: true,
52-
rootTaskId,
53-
});
50+
const { chunks, jobMap, planMap, activeAskUser } = getFlatChunks(
51+
tasks,
52+
errors,
53+
{
54+
flowMap,
55+
activityMap,
56+
skipActivitySubTasks,
57+
enablePlan: true,
58+
rootTaskId,
59+
expandAskUser,
60+
}
61+
);
5462
const messages: ChatMessage[] = [];
5563

5664
let prevAssistantMessage: MessageFromAssistant = {
@@ -147,7 +155,7 @@ export function useConversationStream(
147155
messages.push(prevAssistantMessage);
148156
}
149157

150-
return { messages, jobMap, lastDetail, activeAskUser };
158+
return { messages, jobMap, planMap, lastDetail, activeAskUser };
151159
}, [
152160
conversationAvailable,
153161
state,
@@ -158,5 +166,6 @@ export function useConversationStream(
158166
showHumanActions,
159167
skipActivitySubTasks,
160168
rootTaskId,
169+
expandAskUser,
161170
]);
162171
}

bricks/ai-portal/src/cruise-canvas/reducers/tasks.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ function mergeJobs(
141141
"cmd",
142142
"mentionedAiEmployeeId",
143143
"hil",
144+
"summary",
144145
]);
145146
if (aiEmployeeId !== undefined) {
146147
restMessagesPatch.aiEmployeeId = aiEmployeeId;

bricks/ai-portal/src/cruise-canvas/useConversationGraph.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ export function useConversationGraph(
3939
const { chunks, jobMap } = getFlatChunks(tasks, errors, {
4040
flowMap,
4141
activityMap,
42-
skipActivitySubTasks: false,
43-
enablePlan: true,
4442
});
4543

4644
const nodes: GraphNode[] = [];

bricks/ai-portal/src/shared/ActivityPlan/ActivityPlan.module.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
border: 1px solid rgba(0, 0, 0, 0.1);
2323
backdrop-filter: blur(10px);
2424
cursor: pointer;
25+
26+
&:hover {
27+
background: rgba(255, 255, 255, 0.8);
28+
}
2529
}
2630
}
2731

@@ -180,4 +184,8 @@
180184
border-radius: 13px;
181185
color: rgba(0, 0, 0, 0.65);
182186
cursor: pointer;
187+
188+
&:hover {
189+
background: rgba(0, 0, 0, 0.06);
190+
}
183191
}

bricks/ai-portal/src/shared/ActivityPlan/ActivityPlan.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import React, {
33
Fragment,
44
useContext,
55
useMemo,
6+
useRef,
67
useState,
78
} from "react";
89
import { initializeI18n } from "@next-core/i18n";
@@ -40,6 +41,7 @@ export function ActivityPlan({ task }: ActivityPlanProps) {
4041
const { flowMap, setActiveDetail } = useContext(TaskContext);
4142
const { toggleAutoScroll } = useContext(StreamContext);
4243
const flow = flowMap?.get(task.id);
44+
const toggleRef = useRef<ReturnType<typeof setTimeout> | null>(null);
4345

4446
return (
4547
<ActivityPlanContext.Provider value={{ collapsed }}>
@@ -71,6 +73,12 @@ export function ActivityPlan({ task }: ActivityPlanProps) {
7173
onClick={() => {
7274
setCollapsed((prev) => !prev);
7375
toggleAutoScroll(false);
76+
if (toggleRef.current) {
77+
clearTimeout(toggleRef.current);
78+
}
79+
toggleRef.current = setTimeout(() => {
80+
toggleAutoScroll(true);
81+
}, 100);
7482
}}
7583
>
7684
{t(K.SHOW_PROCESS)}

bricks/ai-portal/src/shared/ActivityPlan/PlanStateIcon.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,7 @@ export function PlanStateIcon({ state, filled }: PlanStateIconProps) {
3333
}
3434
)}
3535
>
36-
<WrappedIcon
37-
lib="lucide"
38-
icon="check"
39-
strokeWidth={filled ? 5 : 3}
40-
/>
36+
<WrappedIcon lib="lucide" icon="check" strokeWidth={5} />
4137
</span>
4238
);
4339
}

0 commit comments

Comments
 (0)