diff --git a/packages/workflow-dashboard/src/components/record-card.tsx b/packages/workflow-dashboard/src/components/record-card.tsx
index da51773..ecbb28d 100644
--- a/packages/workflow-dashboard/src/components/record-card.tsx
+++ b/packages/workflow-dashboard/src/components/record-card.tsx
@@ -56,11 +56,11 @@ function StartCard({ record }: { record: ThreadStartRecord }) {
);
}
-function RoleMessage({ record }: { record: RoleRecord }) {
+function RoleMessage({ record, highlighted }: { record: RoleRecord; highlighted: boolean }) {
const color = roleColor(record.role);
return (
@@ -114,12 +114,17 @@ function ResultCard({ record }: { record: WorkflowResultRecord }) {
);
}
-export function RecordCard({ record }: { record: ThreadRecord }) {
+type RecordCardProps = {
+ record: ThreadRecord;
+ highlighted: boolean;
+};
+
+export function RecordCard({ record, highlighted }: RecordCardProps) {
switch (record.type) {
case "thread-start":
return ;
case "role":
- return ;
+ return ;
case "workflow-result":
return ;
}
diff --git a/packages/workflow-dashboard/src/components/thread-detail.tsx b/packages/workflow-dashboard/src/components/thread-detail.tsx
index 3e4b822..819f2f1 100644
--- a/packages/workflow-dashboard/src/components/thread-detail.tsx
+++ b/packages/workflow-dashboard/src/components/thread-detail.tsx
@@ -1,4 +1,4 @@
-import { useEffect, useMemo, useRef, useState } from "react";
+import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import {
getThread,
getWorkflowDescriptor,
@@ -30,9 +30,10 @@ type GraphPanelProps = {
descriptor: WorkflowDescriptor;
workflowName: string | null;
nodeStates: Map;
+ onNodeClick: ((roleName: string) => void) | null;
};
-function GraphPanel({ descriptor, workflowName, nodeStates }: GraphPanelProps) {
+function GraphPanel({ descriptor, workflowName, nodeStates, onNodeClick }: GraphPanelProps) {
const [open, setOpen] = useState(true);
const edgeCount = descriptor.graph.edges.length;
return (
@@ -64,6 +65,7 @@ function GraphPanel({ descriptor, workflowName, nodeStates }: GraphPanelProps) {
graph={descriptor.graph}
roles={descriptor.roles}
nodeStates={nodeStates}
+ onNodeClick={onNodeClick}
/>
)}
@@ -102,6 +104,9 @@ export function ThreadDetail({ agent, threadId, onBack }: Props) {
const { status, data, error } = useFetch(() => getThread(agent, threadId), [agent, threadId]);
const [actionStatus, setActionStatus] = useState
(null);
const recordsEndRef = useRef(null);
+ const firstCardByRoleRef = useRef