Files
johndoe6345789 07aa7192fd Introduce AutoMetabuilder core components and workflow packages:
- Implement core components: CLI argument parsing, environment loading, GitHub service creation, and logging configuration.
- Add support for OpenAI client setup and model resolution.
- Develop SDLC context loader from GitHub and repository files.
- Implement workflow context and engine builders.
- Introduce major workflow packages: `game_tick_loop` and `contextual_iterative_loop`.
- Update localization files with new package descriptions and labels.
- Streamline web navigation by loading items from a dedicated JSON file.
2026-01-10 02:17:09 +00:00

79 lines
2.9 KiB
TypeScript

import { useEffect, useState } from "react";
import { Box, Chip, Divider, Paper, Stack, Typography } from "@mui/material";
import { fetchWorkflowGraph } from "../../lib/api";
import { WorkflowGraph } from "../../lib/types";
type WorkflowGraphPanelProps = {
t: (key: string, fallback?: string) => string;
};
export default function WorkflowGraphPanel({ t }: WorkflowGraphPanelProps) {
const [graph, setGraph] = useState<WorkflowGraph | null>(null);
const [error, setError] = useState("");
useEffect(() => {
let alive = true;
void fetchWorkflowGraph()
.then((payload) => {
if (alive) {
setGraph(payload);
}
})
.catch((err) => {
if (alive) {
setError(String(err));
}
});
return () => {
alive = false;
};
}, []);
return (
<Paper sx={{ p: 2, backgroundColor: "var(--color-panel-alt)" }}>
<Typography variant="subtitle1" gutterBottom>
{t("ui.workflow.graph.title", "Workflow Graph")}
</Typography>
<Typography variant="caption" color="text.secondary" gutterBottom>
{graph
? t("ui.workflow.graph.summary", "Nodes: {nodes}, Edges: {edges}")
.replace("{nodes}", String(graph.count.nodes))
.replace("{edges}", String(graph.count.edges))
: t("ui.workflow.graph.loading", "Loading graph…")}
</Typography>
{error ? (
<Typography color="error">{error}</Typography>
) : (
<>
<Stack spacing={1} divider={<Divider light sx={{ borderColor: "var(--color-divider)" }} />}>
{graph?.nodes.map((node) => (
<Box key={node.id} sx={{ display: "flex", flexDirection: "column" }}>
<Stack direction="row" alignItems="center" spacing={1}>
<Chip size="small" label={node.type} />
<Typography variant="body2" color="text.secondary">
{node.label_key ? t(node.label_key, node.type) : node.type}
</Typography>
</Stack>
<Typography variant="caption" color="text.secondary">
{node.parent ? `${t("ui.workflow.graph.child_of", "child of")} ${node.parent}` : t("ui.workflow.graph.top_level", "top level")}
</Typography>
</Box>
))}
</Stack>
<Divider sx={{ my: 2, borderColor: "var(--color-divider)" }} />
<Stack spacing={1}>
{graph?.edges.map((edge, index) => (
<Typography key={`${edge.from}-${edge.to}-${edge.var}-${index}`} variant="caption" color="text.secondary">
{t("ui.workflow.graph.edge", "{from} → {to} ({var})")
.replace("{from}", edge.from)
.replace("{to}", edge.to)
.replace("{var}", edge.var)}
</Typography>
))}
</Stack>
</>
)}
</Paper>
);
}