From d7037339e4551c797f058cb4620faf9b329229f6 Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Tue, 2 Sep 2025 10:37:44 +0100 Subject: [PATCH 01/18] Fix graph updates with unfolded nodes part 1 --- tierkreis_visualization/frontend/src/App.tsx | 95 +++++++++++-------- .../frontend/src/graph/parseGraph.ts | 14 +-- .../frontend/src/nodes/default.tsx | 4 +- .../frontend/src/nodes/eval.tsx | 36 ++++--- .../frontend/src/nodes/types.ts | 4 +- 5 files changed, 82 insertions(+), 71 deletions(-) diff --git a/tierkreis_visualization/frontend/src/App.tsx b/tierkreis_visualization/frontend/src/App.tsx index ee9d24b4c..d2f4c8eff 100644 --- a/tierkreis_visualization/frontend/src/App.tsx +++ b/tierkreis_visualization/frontend/src/App.tsx @@ -8,6 +8,8 @@ import { ReactFlow, useReactFlow, OnNodeDrag, + ReactFlowProvider, + useNodes, } from "@xyflow/react"; import { useParams } from "react-router"; @@ -77,70 +79,89 @@ const Main = (props: { setInfo: (arg: InfoProps) => void; }) => { // Client node state (not definition) - const [nodes, setNodes] = useState(props.initialNodes); - const [edges, setEdges] = useState(props.initialEdges); + + const reactFlowInstance = useReactFlow(); + props.initialNodes.map((node) => { + node.data.setInfo = props.setInfo; + }); + React.useEffect(() => { saveGraph({ key: props.workflow_id, - nodes, - edges, + nodes: reactFlowInstance.getNodes(), + edges: reactFlowInstance.getEdges(), start_time: props.workflow_start, }); - }, [edges, nodes, props.workflow_id, props.workflow_start]); + }, [reactFlowInstance, props.workflow_id, props.workflow_start]); const onNodesChange: OnNodesChange = useCallback( (changes) => - setNodes((nodesSnapshot) => applyNodeChanges(changes, nodesSnapshot)), - [] + reactFlowInstance.setNodes((nodesSnapshot) => + applyNodeChanges(changes, nodesSnapshot) + ), + [reactFlowInstance] ); const onEdgesChange: OnEdgesChange = useCallback( (changes) => - setEdges((edgesSnapshot) => applyEdgeChanges(changes, edgesSnapshot)), - [] + reactFlowInstance.setEdges((edgesSnapshot) => + applyEdgeChanges(changes, edgesSnapshot) + ), + [reactFlowInstance] ); const onNodeDrag: OnNodeDrag = useCallback((_, node) => { node.data.pinned = true; }, []); - const reactFlowInstance = useReactFlow(); React.useEffect(() => { const url = `${URL}/${props.workflow_id}/nodes/-`; const ws = new WebSocket(url); - const edges = reactFlowInstance.getEdges(); - const nodes = reactFlowInstance.getNodes() as BackendNode[]; ws.onmessage = (event) => { - const graph = parseGraph( - JSON.parse(event.data), - props.workflow_id, - props.setInfo - ); - const nodesMap = new Map(nodes.map((node) => [node.id, node])); + console.log("Received WebSocket message:"); + const nodes = reactFlowInstance.getNodes(); + const edges = reactFlowInstance.getEdges(); + console.log({ edges, nodes }); + const graph = parseGraph(JSON.parse(event.data), props.workflow_id); + let nodesMap = new Map(); + if (nodes) { + nodesMap = new Map(nodes.map((node) => [node.id, node])); + } const newNodes = bottomUpLayout(graph.nodes, graph.edges); + const hiddenEdges = new Set(); newNodes.forEach((node) => { const existingNode = nodesMap.get(node.id); if (existingNode) { + if (existingNode.type === "group") { + hiddenEdges.add(existingNode.id); + return; + } existingNode.data = { ...existingNode.data, status: node.data.status, }; existingNode.position = { - ...(reactFlowInstance.getNode(node.id)?.position ?? node.position), + ...(nodes.find((n) => n.id === node.id)?.position ?? node.position), }; } else { + node.data.setInfo = props.setInfo; nodesMap.set(node.id, node); } }); - setNodes(Array.from(nodesMap.values())); + const edgeIds = new Set(edges.map((edge) => edge.id)); const newEdges = graph.edges.filter((edge) => !edgeIds.has(edge.id)); - if (newEdges.length > 0) { - setEdges([...edges, ...newEdges]); - } + console.log(hiddenEdges); + const oldEdges = [...edges, ...newEdges].filter( + (edge) => !hiddenEdges.has(edge.source) && !hiddenEdges.has(edge.target) + ); + console.log("new nodes", Array.from(nodesMap.values())); + console.log("old edges", oldEdges); + reactFlowInstance.setNodes(Array.from(nodesMap.values())); + reactFlowInstance.setEdges([...oldEdges]); }; return () => { if (ws.readyState == WebSocket.OPEN) { ws.close(); } }; - }, [props, reactFlowInstance, setNodes, setEdges]); + }, [props, reactFlowInstance, props.setInfo]); return ( - nodes={nodes} - edges={edges} - defaultNodes={nodes} - defaultEdges={edges} + defaultNodes={props.initialNodes} + defaultEdges={props.initialEdges} nodeTypes={nodeTypes} edgeTypes={edgeTypes} onEdgesChange={onEdgesChange} @@ -165,8 +184,13 @@ const Main = (props: { { - setEdges(edges); - setNodes(bottomUpLayout(nodes, reactFlowInstance.getEdges())); + reactFlowInstance.setEdges(reactFlowInstance.getEdges()); + reactFlowInstance.setNodes( + bottomUpLayout( + reactFlowInstance.getNodes(), + reactFlowInstance.getEdges() + ) + ); reactFlowInstance.fitView({ padding: 0.1 }); }} > @@ -180,7 +204,6 @@ const Main = (props: { export default function App() { const { workflowId: workflow_id_url } = useParams(); - const workflowsQuery = useSuspenseQuery({ queryKey: ["workflows", URL], queryFn: async () => { @@ -221,7 +244,6 @@ export default function App() { type: "Logs", content: logs.data, }); - const graphQuery = useSuspenseQuery({ queryKey: ["workflowGraph", workflow_id], queryFn: async () => { @@ -234,13 +256,13 @@ export default function App() { } return response.json(); }, - select: (data) => parseGraph(data, workflow_id, setInfo), + select: (data) => parseGraph(data, workflow_id), }); const remoteGraph = graphQuery.data; - const workflow_start = workflowsQuery.data.find( - (workflow) => workflow.id == workflow_id - )?.start_time || ""; + const workflow_start = + workflowsQuery.data.find((workflow) => workflow.id == workflow_id) + ?.start_time || ""; const localGraph = loadGraph({ key: workflow_id }); if (workflow_start && workflow_start != localGraph?.start_time) { deleteGraph({ key: workflow_id }); @@ -277,7 +299,6 @@ export default function App() { edges: mergedEdges, }; })(); - return (
void, parentId?: string ): AppNode[] { // child nodes prepend their parents id eg. [0,1,2] => [0:0,0:1,0:2] @@ -103,9 +102,11 @@ export function parseNodes( title: getTitle(node.function_name), id: (parentId ? `${parentId}:` : "") + node.id.toString(), label: node.function_name, - setInfo: setInfo, pinned: false, value: parseNodeValue(node.value), + setInfo: undefined, + setNodes: undefined, + setEdges: undefined, }, parentId: parentId ? `${parentId}` : undefined, })); @@ -162,16 +163,9 @@ export function parseEdges(edges: PyEdge[], parentId?: string): Edge[] { export function parseGraph( data: { nodes: PyNode[]; edges: PyEdge[] }, workflowId: string, - setInfo: (arg: InfoProps) => void, parentId?: string ) { - const nodes = parseNodes( - data.nodes, - data.edges, - workflowId, - setInfo, - parentId - ); + const nodes = parseNodes(data.nodes, data.edges, workflowId, parentId); const edges = parseEdges(data.edges, parentId); return { nodes, edges }; } diff --git a/tierkreis_visualization/frontend/src/nodes/default.tsx b/tierkreis_visualization/frontend/src/nodes/default.tsx index 904f50ce9..18b75d4b9 100644 --- a/tierkreis_visualization/frontend/src/nodes/default.tsx +++ b/tierkreis_visualization/frontend/src/nodes/default.tsx @@ -35,7 +35,7 @@ export function DefaultNode({ data }: NodeProps) { const target = event.target as HTMLElement; if (target.closest("button") === null) { if (data.title == "Function") { - data.setInfo({ type: "Logs", content: logs ? logs : "" }); + data.setInfo?.({ type: "Logs", content: logs ? logs : "" }); } } }} @@ -64,7 +64,7 @@ export function DefaultNode({ data }: NodeProps) { variant="destructive" style={{ zIndex: 5 }} onClick={() => - data.setInfo({ + data.setInfo?.({ type: "Errors", content: errors ? errors : "", }) diff --git a/tierkreis_visualization/frontend/src/nodes/eval.tsx b/tierkreis_visualization/frontend/src/nodes/eval.tsx index a91270d88..e97605a76 100644 --- a/tierkreis_visualization/frontend/src/nodes/eval.tsx +++ b/tierkreis_visualization/frontend/src/nodes/eval.tsx @@ -118,13 +118,7 @@ export function EvalNode({ data: node_data }: NodeProps) { fetch(url, { method: "GET", headers: { Accept: "application/json" } }) .then((response) => response.json()) .then((data) => { - const nodes = parseNodes( - data.nodes, - data.edges, - workflowId, - node_data.setInfo, - parentId - ); + const nodes = parseNodes(data.nodes, data.edges, workflowId, parentId); const edges = parseEdges(data.edges, parentId); const oldEdges = reactFlowInstance.getEdges(); const oldNodes = reactFlowInstance.getNodes(); @@ -160,19 +154,21 @@ export function EvalNode({ data: node_data }: NodeProps) { id={node_data.id} />
- + {node_data.status != "Not started" && ( + + )}
diff --git a/tierkreis_visualization/frontend/src/nodes/types.ts b/tierkreis_visualization/frontend/src/nodes/types.ts index 1efa65e89..7011e4d8b 100644 --- a/tierkreis_visualization/frontend/src/nodes/types.ts +++ b/tierkreis_visualization/frontend/src/nodes/types.ts @@ -1,5 +1,5 @@ import { InfoProps } from "@/components/types"; -import { type Node } from "@xyflow/react"; +import { Edge, type Node } from "@xyflow/react"; export type PyNode = { id: string | number; @@ -19,9 +19,9 @@ export type BackendNode = Node<{ node_location: string; id: string; title: string; - setInfo: (arg: InfoProps) => void; label?: string; pinned: boolean; value: string | null; + setInfo?: (info: InfoProps) => void; }>; export type AppNode = BackendNode; From 702222528eb778387ab55932293edfe2bad4224b Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Tue, 9 Sep 2025 15:19:53 +0100 Subject: [PATCH 02/18] Add improvements in visualization --- tierkreis_visualization/frontend/bun.lock | 32 +- .../frontend/src/graph/parseGraph.ts | 5 +- .../frontend/src/nodes/default.tsx | 112 +- tierkreis_visualization/frontend/yarn.lock | 2595 +++++++++++++++++ .../tierkreis_visualization/data/eval.py | 5 +- 5 files changed, 2684 insertions(+), 65 deletions(-) create mode 100644 tierkreis_visualization/frontend/yarn.lock diff --git a/tierkreis_visualization/frontend/bun.lock b/tierkreis_visualization/frontend/bun.lock index f86c772bb..1c2695fa8 100644 --- a/tierkreis_visualization/frontend/bun.lock +++ b/tierkreis_visualization/frontend/bun.lock @@ -29,12 +29,12 @@ "@types/react-dom": "^18.2.18", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", - "@vitejs/plugin-react": "^4.6.0", + "@vitejs/plugin-react": "^5.0.0", "eslint": "^8.56.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.5", "typescript": "^5.3.3", - "vite": "^7.0.4", + "vite": "^7.1.0", }, }, }, @@ -47,9 +47,9 @@ "@babel/compat-data": ["@babel/compat-data@7.28.0", "", {}, "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw=="], - "@babel/core": ["@babel/core@7.28.0", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.6", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.0", "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ=="], + "@babel/core": ["@babel/core@7.28.3", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.3", "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.3", "@babel/types": "^7.28.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ=="], - "@babel/generator": ["@babel/generator@7.28.0", "", { "dependencies": { "@babel/parser": "^7.28.0", "@babel/types": "^7.28.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg=="], + "@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="], "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], @@ -57,7 +57,7 @@ "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], - "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.27.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg=="], + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw=="], "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], @@ -67,9 +67,9 @@ "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - "@babel/helpers": ["@babel/helpers@7.28.2", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.2" } }, "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw=="], + "@babel/helpers": ["@babel/helpers@7.28.3", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.2" } }, "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw=="], - "@babel/parser": ["@babel/parser@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.0" }, "bin": "./bin/babel-parser.js" }, "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g=="], + "@babel/parser": ["@babel/parser@7.28.3", "", { "dependencies": { "@babel/types": "^7.28.2" }, "bin": "./bin/babel-parser.js" }, "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA=="], "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], @@ -77,7 +77,7 @@ "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], - "@babel/traverse": ["@babel/traverse@7.28.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/types": "^7.28.0", "debug": "^4.3.1" } }, "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg=="], + "@babel/traverse": ["@babel/traverse@7.28.3", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", "@babel/types": "^7.28.2", "debug": "^4.3.1" } }, "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ=="], "@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], @@ -229,7 +229,7 @@ "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.34", "", {}, "sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA=="], "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.46.2", "", { "os": "android", "cpu": "arm" }, "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA=="], @@ -363,7 +363,7 @@ "@ungap/structured-clone": ["@ungap/structured-clone@1.2.0", "", {}, "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="], - "@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="], + "@vitejs/plugin-react": ["@vitejs/plugin-react@5.0.2", "", { "dependencies": { "@babel/core": "^7.28.3", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.34", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-tmyFgixPZCx2+e6VO9TNITWcCQl8+Nl/E8YbAyPVv85QCc7/A3JrdfG2A8gIzvVhWuzMOVrFW1aReaNxrI6tbw=="], "@xyflow/react": ["@xyflow/react@12.7.0", "", { "dependencies": { "@xyflow/system": "0.0.62", "classcat": "^5.0.3", "zustand": "^4.4.0" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, "sha512-U6VMEbYjiCg1byHrR7S+b5ZdHTjgCFX4KpBc634G/WtEBUvBLoMQdlCD6uJHqodnOAxpt3+G2wiDeTmXAFJzgQ=="], @@ -755,6 +755,10 @@ "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@babel/helper-module-imports/@babel/traverse": ["@babel/traverse@7.28.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/types": "^7.28.0", "debug": "^4.3.1" } }, "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg=="], + + "@babel/template/@babel/parser": ["@babel/parser@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.0" }, "bin": "./bin/babel-parser.js" }, "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g=="], + "@eslint/eslintrc/globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], "@jridgewell/gen-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.4.15", "", {}, "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="], @@ -795,6 +799,10 @@ "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + "@babel/helper-module-imports/@babel/traverse/@babel/generator": ["@babel/generator@7.28.0", "", { "dependencies": { "@babel/parser": "^7.28.0", "@babel/types": "^7.28.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg=="], + + "@babel/helper-module-imports/@babel/traverse/@babel/parser": ["@babel/parser@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.0" }, "bin": "./bin/babel-parser.js" }, "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g=="], + "@types/babel__core/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.23.4", "", {}, "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ=="], "@types/babel__core/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.22.20", "", {}, "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A=="], @@ -812,5 +820,9 @@ "@types/babel__traverse/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.22.20", "", {}, "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A=="], "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@babel/helper-module-imports/@babel/traverse/@babel/generator/@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.12", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg=="], + + "@babel/helper-module-imports/@babel/traverse/@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="], } } diff --git a/tierkreis_visualization/frontend/src/graph/parseGraph.ts b/tierkreis_visualization/frontend/src/graph/parseGraph.ts index 1cead5451..71f62272c 100644 --- a/tierkreis_visualization/frontend/src/graph/parseGraph.ts +++ b/tierkreis_visualization/frontend/src/graph/parseGraph.ts @@ -4,7 +4,6 @@ import dagre from "@dagrejs/dagre"; import { Edge } from "@xyflow/react"; import { nodeHeight, nodeWidth } from "@/data/constants"; import { CSSProperties } from "react"; -import { InfoProps } from "@/components/types"; function nodeType(function_name: string) { if (function_name.match(/^L?\d+$/)) { @@ -71,8 +70,8 @@ function parseNodeValue(value: unknown): string | null { return null; } if (typeof value === "string") { - if (value.length > 5) { - return value.slice(0, 5) + "..."; + if (value.length > 10) { + return value.slice(0, 10) + "..."; } return value; } diff --git a/tierkreis_visualization/frontend/src/nodes/default.tsx b/tierkreis_visualization/frontend/src/nodes/default.tsx index 18b75d4b9..78f512b76 100644 --- a/tierkreis_visualization/frontend/src/nodes/default.tsx +++ b/tierkreis_visualization/frontend/src/nodes/default.tsx @@ -1,5 +1,4 @@ import { InputHandleArray, OutputHandleArray } from "@/components/handles"; -import { NodeStatusIndicator } from "@/components/StatusIndicator"; import { Button } from "@/components/ui/button"; import { Card, @@ -25,58 +24,69 @@ export function DefaultNode({ data }: NodeProps) { data.node_location, data.status ); + let name = data.title; + if (name == "Function") { + name = data.name; + } else if (data.value) { + name = data.value; + } + const bg_color = (status: string) => { + switch (status) { + case "Started": + return "bg-chart-4"; + case "Finished": + return "bg-emerald-600"; + case "Error": + return "bg-red-400"; + default: + return "bg-white"; + } + }; + return ( - - - -
{ - //workaround to render errors - const target = event.target as HTMLElement; - if (target.closest("button") === null) { - if (data.title == "Function") { - data.setInfo?.({ type: "Logs", content: logs ? logs : "" }); - } + + +
{ + //workaround to render errors + const target = event.target as HTMLElement; + if (target.closest("button") === null) { + if (data.title == "Function") { + data.setInfo?.({ type: "Logs", content: logs ? logs : "" }); } - }} - > - - + + + {name} + + + + + + + + {data.status == "Error" && ( + - )} - -
-
-
- + + + )} + +
+
+
); } diff --git a/tierkreis_visualization/frontend/yarn.lock b/tierkreis_visualization/frontend/yarn.lock new file mode 100644 index 000000000..a0cc20787 --- /dev/null +++ b/tierkreis_visualization/frontend/yarn.lock @@ -0,0 +1,2595 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 +# bun ./bun.lockb --hash: 0000000000000000-0000000000000000-0000000000000000-0000000000000000 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.27.2": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz" + integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.28.3": + version "7.28.3" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz" + integrity sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.3" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.28.3" + "@babel/helpers" "^7.28.3" + "@babel/parser" "^7.28.3" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.28.3" + "@babel/types" "^7.28.2" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz" + integrity sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg== + dependencies: + "@babel/parser" "^7.28.0" + "@babel/types" "^7.28.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/generator@^7.28.3": + version "7.28.3" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz" + integrity sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw== + dependencies: + "@babel/parser" "^7.28.3" + "@babel/types" "^7.28.2" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== + dependencies: + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== + +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.28.3": + version "7.28.3" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz" + integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.28.3" + +"@babel/helper-plugin-utils@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helpers@^7.28.3": + version "7.28.3" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz" + integrity sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw== + dependencies: + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.2" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz" + integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== + +"@babel/parser@^7.27.2", "@babel/parser@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz" + integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== + dependencies: + "@babel/types" "^7.28.0" + +"@babel/parser@^7.28.3": + version "7.28.3" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz" + integrity sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA== + dependencies: + "@babel/types" "^7.28.2" + +"@babel/plugin-transform-react-jsx-self@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz" + integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-react-jsx-source@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz" + integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/template@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.27.1": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz" + integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.0" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.0" + debug "^4.3.1" + +"@babel/traverse@^7.28.3": + version "7.28.3" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz" + integrity sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.3" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.3" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.2" + debug "^4.3.1" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz" + integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@babel/types@^7.27.1", "@babel/types@^7.28.0", "@babel/types@^7.28.2": + version "7.28.2" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz" + integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + +"@dagrejs/dagre@^1.1.4": + version "1.1.4" + resolved "https://registry.npmjs.org/@dagrejs/dagre/-/dagre-1.1.4.tgz" + integrity sha512-QUTc54Cg/wvmlEUxB+uvoPVKFazM1H18kVHBQNmK2NbrDR5ihOCR6CXLnDSZzMcSQKJtabPUWridBOlJM3WkDg== + dependencies: + "@dagrejs/graphlib" "2.2.4" + +"@dagrejs/graphlib@2.2.4": + version "2.2.4" + resolved "https://registry.npmjs.org/@dagrejs/graphlib/-/graphlib-2.2.4.tgz" + integrity sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw== + +"@emnapi/core@^1.4.3": + version "1.4.3" + resolved "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz" + integrity sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g== + dependencies: + "@emnapi/wasi-threads" "1.0.2" + tslib "^2.4.0" + +"@emnapi/runtime@^1.4.3": + version "1.4.3" + resolved "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz" + integrity sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.0.2", "@emnapi/wasi-threads@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz" + integrity sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA== + dependencies: + tslib "^2.4.0" + +"@esbuild/aix-ppc64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz" + integrity sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA== + +"@esbuild/android-arm@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz" + integrity sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw== + +"@esbuild/android-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz" + integrity sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w== + +"@esbuild/android-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz" + integrity sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA== + +"@esbuild/darwin-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz" + integrity sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw== + +"@esbuild/darwin-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz" + integrity sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg== + +"@esbuild/freebsd-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz" + integrity sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA== + +"@esbuild/freebsd-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz" + integrity sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw== + +"@esbuild/linux-arm@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz" + integrity sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg== + +"@esbuild/linux-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz" + integrity sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w== + +"@esbuild/linux-ia32@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz" + integrity sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg== + +"@esbuild/linux-loong64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz" + integrity sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ== + +"@esbuild/linux-mips64el@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz" + integrity sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw== + +"@esbuild/linux-ppc64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz" + integrity sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ== + +"@esbuild/linux-riscv64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz" + integrity sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg== + +"@esbuild/linux-s390x@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz" + integrity sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg== + +"@esbuild/linux-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz" + integrity sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ== + +"@esbuild/netbsd-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz" + integrity sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw== + +"@esbuild/netbsd-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz" + integrity sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg== + +"@esbuild/openbsd-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz" + integrity sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ== + +"@esbuild/openbsd-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz" + integrity sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ== + +"@esbuild/openharmony-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz" + integrity sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg== + +"@esbuild/sunos-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz" + integrity sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w== + +"@esbuild/win32-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz" + integrity sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ== + +"@esbuild/win32-ia32@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz" + integrity sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg== + +"@esbuild/win32-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz" + integrity sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.56.0": + version "8.56.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz" + integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== + +"@floating-ui/core@^1.7.0": + version "1.7.0" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz" + integrity sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA== + dependencies: + "@floating-ui/utils" "^0.2.9" + +"@floating-ui/dom@^1.0.0": + version "1.7.0" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz" + integrity sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg== + dependencies: + "@floating-ui/core" "^1.7.0" + "@floating-ui/utils" "^0.2.9" + +"@floating-ui/react-dom@^2.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz" + integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A== + dependencies: + "@floating-ui/dom" "^1.0.0" + +"@floating-ui/utils@^0.2.9": + version "0.2.9" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz" + integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg== + +"@humanwhocodes/config-array@^0.11.13": + version "0.11.13" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz" + integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== + dependencies: + "@humanwhocodes/object-schema" "^2.0.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz" + integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== + +"@isaacs/fs-minipass@^4.0.0": + version "4.0.1" + resolved "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz" + integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== + dependencies: + minipass "^7.0.4" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/gen-mapping@^0.3.12": + version "0.3.12" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz" + integrity sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.29" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz" + integrity sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@napi-rs/wasm-runtime@^0.2.9": + version "0.2.10" + resolved "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.10.tgz" + integrity sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ== + dependencies: + "@emnapi/core" "^1.4.3" + "@emnapi/runtime" "^1.4.3" + "@tybys/wasm-util" "^0.9.0" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@radix-ui/primitive@1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz" + integrity sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA== + +"@radix-ui/react-arrow@1.1.7": + version "1.1.7" + resolved "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz" + integrity sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w== + dependencies: + "@radix-ui/react-primitive" "2.1.3" + +"@radix-ui/react-compose-refs@1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz" + integrity sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg== + +"@radix-ui/react-context@1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz" + integrity sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA== + +"@radix-ui/react-dialog@^1.1.14": + version "1.1.14" + resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz" + integrity sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw== + dependencies: + "@radix-ui/primitive" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-dismissable-layer" "1.1.10" + "@radix-ui/react-focus-guards" "1.1.2" + "@radix-ui/react-focus-scope" "1.1.7" + "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-portal" "1.1.9" + "@radix-ui/react-presence" "1.1.4" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-slot" "1.2.3" + "@radix-ui/react-use-controllable-state" "1.2.2" + aria-hidden "^1.2.4" + react-remove-scroll "^2.6.3" + +"@radix-ui/react-dismissable-layer@1.1.10": + version "1.1.10" + resolved "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz" + integrity sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ== + dependencies: + "@radix-ui/primitive" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-callback-ref" "1.1.1" + "@radix-ui/react-use-escape-keydown" "1.1.1" + +"@radix-ui/react-focus-guards@1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz" + integrity sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA== + +"@radix-ui/react-focus-scope@1.1.7": + version "1.1.7" + resolved "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz" + integrity sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-callback-ref" "1.1.1" + +"@radix-ui/react-hover-card@^1.1.14": + version "1.1.14" + resolved "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.14.tgz" + integrity sha512-CPYZ24Mhirm+g6D8jArmLzjYu4Eyg3TTUHswR26QgzXBHBe64BO/RHOJKzmF/Dxb4y4f9PKyJdwm/O/AhNkb+Q== + dependencies: + "@radix-ui/primitive" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-dismissable-layer" "1.1.10" + "@radix-ui/react-popper" "1.2.7" + "@radix-ui/react-portal" "1.1.9" + "@radix-ui/react-presence" "1.1.4" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-controllable-state" "1.2.2" + +"@radix-ui/react-id@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz" + integrity sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-popper@1.2.7": + version "1.2.7" + resolved "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz" + integrity sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ== + dependencies: + "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/react-arrow" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-callback-ref" "1.1.1" + "@radix-ui/react-use-layout-effect" "1.1.1" + "@radix-ui/react-use-rect" "1.1.1" + "@radix-ui/react-use-size" "1.1.1" + "@radix-ui/rect" "1.1.1" + +"@radix-ui/react-portal@1.1.9": + version "1.1.9" + resolved "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz" + integrity sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ== + dependencies: + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-presence@1.1.4": + version "1.1.4" + resolved "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz" + integrity sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-primitive@2.1.3": + version "2.1.3" + resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz" + integrity sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ== + dependencies: + "@radix-ui/react-slot" "1.2.3" + +"@radix-ui/react-separator@^1.1.7": + version "1.1.7" + resolved "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz" + integrity sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA== + dependencies: + "@radix-ui/react-primitive" "2.1.3" + +"@radix-ui/react-slot@1.2.3", "@radix-ui/react-slot@^1.2.3": + version "1.2.3" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz" + integrity sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + +"@radix-ui/react-tooltip@^1.2.7": + version "1.2.7" + resolved "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz" + integrity sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw== + dependencies: + "@radix-ui/primitive" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-dismissable-layer" "1.1.10" + "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-popper" "1.2.7" + "@radix-ui/react-portal" "1.1.9" + "@radix-ui/react-presence" "1.1.4" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-slot" "1.2.3" + "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-visually-hidden" "1.2.3" + +"@radix-ui/react-use-callback-ref@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz" + integrity sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg== + +"@radix-ui/react-use-controllable-state@1.2.2": + version "1.2.2" + resolved "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz" + integrity sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg== + dependencies: + "@radix-ui/react-use-effect-event" "0.0.2" + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-use-effect-event@0.0.2": + version "0.0.2" + resolved "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz" + integrity sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-use-escape-keydown@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz" + integrity sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g== + dependencies: + "@radix-ui/react-use-callback-ref" "1.1.1" + +"@radix-ui/react-use-layout-effect@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz" + integrity sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ== + +"@radix-ui/react-use-rect@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz" + integrity sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w== + dependencies: + "@radix-ui/rect" "1.1.1" + +"@radix-ui/react-use-size@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz" + integrity sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-visually-hidden@1.2.3": + version "1.2.3" + resolved "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz" + integrity sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug== + dependencies: + "@radix-ui/react-primitive" "2.1.3" + +"@radix-ui/rect@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz" + integrity sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw== + +"@rolldown/pluginutils@1.0.0-beta.34": + version "1.0.0-beta.34" + resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.34.tgz" + integrity sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA== + +"@rollup/rollup-android-arm-eabi@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz" + integrity sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA== + +"@rollup/rollup-android-arm64@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz" + integrity sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ== + +"@rollup/rollup-darwin-arm64@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz" + integrity sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ== + +"@rollup/rollup-darwin-x64@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz" + integrity sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA== + +"@rollup/rollup-freebsd-arm64@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz" + integrity sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg== + +"@rollup/rollup-freebsd-x64@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz" + integrity sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw== + +"@rollup/rollup-linux-arm-gnueabihf@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz" + integrity sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA== + +"@rollup/rollup-linux-arm-musleabihf@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz" + integrity sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ== + +"@rollup/rollup-linux-arm64-gnu@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz" + integrity sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng== + +"@rollup/rollup-linux-arm64-musl@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz" + integrity sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg== + +"@rollup/rollup-linux-loongarch64-gnu@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz" + integrity sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA== + +"@rollup/rollup-linux-ppc64-gnu@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz" + integrity sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw== + +"@rollup/rollup-linux-riscv64-gnu@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz" + integrity sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ== + +"@rollup/rollup-linux-riscv64-musl@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz" + integrity sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw== + +"@rollup/rollup-linux-s390x-gnu@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz" + integrity sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA== + +"@rollup/rollup-linux-x64-gnu@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz" + integrity sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA== + +"@rollup/rollup-linux-x64-musl@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz" + integrity sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA== + +"@rollup/rollup-win32-arm64-msvc@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz" + integrity sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g== + +"@rollup/rollup-win32-ia32-msvc@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz" + integrity sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ== + +"@rollup/rollup-win32-x64-msvc@4.46.2": + version "4.46.2" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz" + integrity sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg== + +"@tailwindcss/node@4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.7.tgz" + integrity sha512-9rsOpdY9idRI2NH6CL4wORFY0+Q6fnx9XP9Ju+iq/0wJwGD5IByIgFmwVbyy4ymuyprj8Qh4ErxMKTUL4uNh3g== + dependencies: + "@ampproject/remapping" "^2.3.0" + enhanced-resolve "^5.18.1" + jiti "^2.4.2" + lightningcss "1.30.1" + magic-string "^0.30.17" + source-map-js "^1.2.1" + tailwindcss "4.1.7" + +"@tailwindcss/oxide@4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.7.tgz" + integrity sha512-5SF95Ctm9DFiUyjUPnDGkoKItPX/k+xifcQhcqX5RA85m50jw1pT/KzjdvlqxRja45Y52nR4MR9fD1JYd7f8NQ== + optionalDependencies: + "@tailwindcss/oxide-android-arm64" "4.1.7" + "@tailwindcss/oxide-darwin-arm64" "4.1.7" + "@tailwindcss/oxide-darwin-x64" "4.1.7" + "@tailwindcss/oxide-freebsd-x64" "4.1.7" + "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.7" + "@tailwindcss/oxide-linux-arm64-gnu" "4.1.7" + "@tailwindcss/oxide-linux-arm64-musl" "4.1.7" + "@tailwindcss/oxide-linux-x64-gnu" "4.1.7" + "@tailwindcss/oxide-linux-x64-musl" "4.1.7" + "@tailwindcss/oxide-wasm32-wasi" "4.1.7" + "@tailwindcss/oxide-win32-arm64-msvc" "4.1.7" + "@tailwindcss/oxide-win32-x64-msvc" "4.1.7" + dependencies: + detect-libc "^2.0.4" + tar "^7.4.3" + +"@tailwindcss/oxide-android-arm64@4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.7.tgz" + integrity sha512-IWA410JZ8fF7kACus6BrUwY2Z1t1hm0+ZWNEzykKmMNM09wQooOcN/VXr0p/WJdtHZ90PvJf2AIBS/Ceqx1emg== + +"@tailwindcss/oxide-darwin-arm64@4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.7.tgz" + integrity sha512-81jUw9To7fimGGkuJ2W5h3/oGonTOZKZ8C2ghm/TTxbwvfSiFSDPd6/A/KE2N7Jp4mv3Ps9OFqg2fEKgZFfsvg== + +"@tailwindcss/oxide-darwin-x64@4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.7.tgz" + integrity sha512-q77rWjEyGHV4PdDBtrzO0tgBBPlQWKY7wZK0cUok/HaGgbNKecegNxCGikuPJn5wFAlIywC3v+WMBt0PEBtwGw== + +"@tailwindcss/oxide-freebsd-x64@4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.7.tgz" + integrity sha512-RfmdbbK6G6ptgF4qqbzoxmH+PKfP4KSVs7SRlTwcbRgBwezJkAO3Qta/7gDy10Q2DcUVkKxFLXUQO6J3CRvBGw== + +"@tailwindcss/oxide-linux-arm-gnueabihf@4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.7.tgz" + integrity sha512-OZqsGvpwOa13lVd1z6JVwQXadEobmesxQ4AxhrwRiPuE04quvZHWn/LnihMg7/XkN+dTioXp/VMu/p6A5eZP3g== + +"@tailwindcss/oxide-linux-arm64-gnu@4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.7.tgz" + integrity sha512-voMvBTnJSfKecJxGkoeAyW/2XRToLZ227LxswLAwKY7YslG/Xkw9/tJNH+3IVh5bdYzYE7DfiaPbRkSHFxY1xA== + +"@tailwindcss/oxide-linux-arm64-musl@4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.7.tgz" + integrity sha512-PjGuNNmJeKHnP58M7XyjJyla8LPo+RmwHQpBI+W/OxqrwojyuCQ+GUtygu7jUqTEexejZHr/z3nBc/gTiXBj4A== + +"@tailwindcss/oxide-linux-x64-gnu@4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.7.tgz" + integrity sha512-HMs+Va+ZR3gC3mLZE00gXxtBo3JoSQxtu9lobbZd+DmfkIxR54NO7Z+UQNPsa0P/ITn1TevtFxXTpsRU7qEvWg== + +"@tailwindcss/oxide-linux-x64-musl@4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.7.tgz" + integrity sha512-MHZ6jyNlutdHH8rd+YTdr3QbXrHXqwIhHw9e7yXEBcQdluGwhpQY2Eku8UZK6ReLaWtQ4gijIv5QoM5eE+qlsA== + +"@tailwindcss/oxide-wasm32-wasi@4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.7.tgz" + integrity sha512-ANaSKt74ZRzE2TvJmUcbFQ8zS201cIPxUDm5qez5rLEwWkie2SkGtA4P+GPTj+u8N6JbPrC8MtY8RmJA35Oo+A== + dependencies: + "@emnapi/core" "^1.4.3" + "@emnapi/runtime" "^1.4.3" + "@emnapi/wasi-threads" "^1.0.2" + "@napi-rs/wasm-runtime" "^0.2.9" + "@tybys/wasm-util" "^0.9.0" + tslib "^2.8.0" + +"@tailwindcss/oxide-win32-arm64-msvc@4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.7.tgz" + integrity sha512-HUiSiXQ9gLJBAPCMVRk2RT1ZrBjto7WvqsPBwUrNK2BcdSxMnk19h4pjZjI7zgPhDxlAbJSumTC4ljeA9y0tEw== + +"@tailwindcss/oxide-win32-x64-msvc@4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.7.tgz" + integrity sha512-rYHGmvoHiLJ8hWucSfSOEmdCBIGZIq7SpkPRSqLsH2Ab2YUNgKeAPT1Fi2cx3+hnYOrAb0jp9cRyode3bBW4mQ== + +"@tailwindcss/vite@^4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.7.tgz" + integrity sha512-tYa2fO3zDe41I7WqijyVbRd8oWT0aEID1Eokz5hMT6wShLIHj3yvwj9XbfuloHP9glZ6H+aG2AN/+ZrxJ1Y5RQ== + dependencies: + "@tailwindcss/node" "4.1.7" + "@tailwindcss/oxide" "4.1.7" + tailwindcss "4.1.7" + +"@tanstack/query-core@5.81.5": + version "5.81.5" + resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.81.5.tgz" + integrity sha512-ZJOgCy/z2qpZXWaj/oxvodDx07XcQa9BF92c0oINjHkoqUPsmm3uG08HpTaviviZ/N9eP1f9CM7mKSEkIo7O1Q== + +"@tanstack/query-devtools@5.81.2": + version "5.81.2" + resolved "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.81.2.tgz" + integrity sha512-jCeJcDCwKfoyyBXjXe9+Lo8aTkavygHHsUHAlxQKKaDeyT0qyQNLKl7+UyqYH2dDF6UN/14873IPBHchcsU+Zg== + +"@tanstack/react-query@^5.81.5", "@tanstack/react-query@^5.82.0": + version "5.81.5" + resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.81.5.tgz" + integrity sha512-lOf2KqRRiYWpQT86eeeftAGnjuTR35myTP8MXyvHa81VlomoAWNEd8x5vkcAfQefu0qtYCvyqLropFZqgI2EQw== + dependencies: + "@tanstack/query-core" "5.81.5" + +"@tanstack/react-query-devtools@^5.82.0": + version "5.82.0" + resolved "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.82.0.tgz" + integrity sha512-MC05Zq3zr/59jhgF7dL6JSGPg1krbasDSizmRxjNcvxgh/sUTwRFD9CGN10YYX7LB6jq0ZpFtCjSVGdLiFrKAA== + dependencies: + "@tanstack/query-devtools" "5.81.2" + +"@tybys/wasm-util@^0.9.0": + version "0.9.0" + resolved "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz" + integrity sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw== + dependencies: + tslib "^2.4.0" + +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.20.5" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + dependencies: + "@babel/types" "^7.20.7" + +"@types/d3-color@*": + version "3.1.3" + resolved "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz" + integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== + +"@types/d3-drag@^3.0.7": + version "3.0.7" + resolved "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz" + integrity sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-interpolate@*", "@types/d3-interpolate@^3.0.4": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz" + integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== + dependencies: + "@types/d3-color" "*" + +"@types/d3-selection@*", "@types/d3-selection@^3.0.10": + version "3.0.11" + resolved "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz" + integrity sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w== + +"@types/d3-transition@^3.0.8": + version "3.0.9" + resolved "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz" + integrity sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-zoom@^3.0.8": + version "3.0.8" + resolved "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz" + integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw== + dependencies: + "@types/d3-interpolate" "*" + "@types/d3-selection" "*" + +"@types/estree@1.0.8": + version "1.0.8" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + +"@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/node@^20.19.0 || >=22.12.0", "@types/node@^22.15.23": + version "22.15.23" + resolved "https://registry.npmjs.org/@types/node/-/node-22.15.23.tgz" + integrity sha512-7Ec1zaFPF4RJ0eXu1YT/xgiebqwqoJz8rYPDi/O2BcZ++Wpt0Kq9cl0eg6NN6bYbPnR67ZLo7St5Q3UK0SnARw== + dependencies: + undici-types "~6.21.0" + +"@types/prop-types@*": + version "15.7.9" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz" + integrity sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g== + +"@types/react@*", "@types/react@>=16.8", "@types/react@^18.2.53": + version "18.2.53" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.53.tgz" + integrity sha512-52IHsMDT8qATp9B9zoOyobW8W3/0QhaJQTw1HwRj0UY2yBpCAQ7+S/CqHYQ8niAm3p4ji+rWUQ9UCib0GxQ60w== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/react-dom@*", "@types/react-dom@^18.2.18": + version "18.2.18" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz" + integrity sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw== + dependencies: + "@types/react" "*" + +"@types/scheduler@*": + version "0.16.5" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz" + integrity sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw== + +"@types/semver@^7.5.0": + version "7.5.6" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz" + integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== + +"@typescript-eslint/eslint-plugin@^6.20.0": + version "6.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.20.0.tgz" + integrity sha512-fTwGQUnjhoYHeSF6m5pWNkzmDDdsKELYrOBxhjMrofPqCkoC2k3B2wvGHFxa1CTIqkEn88nlW1HVMztjo2K8Hg== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.20.0" + "@typescript-eslint/type-utils" "6.20.0" + "@typescript-eslint/utils" "6.20.0" + "@typescript-eslint/visitor-keys" "6.20.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha", "@typescript-eslint/parser@^6.20.0": + version "6.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.20.0.tgz" + integrity sha512-bYerPDF/H5v6V76MdMYhjwmwgMA+jlPVqjSDq2cRqMi8bP5sR3Z+RLOiOMad3nsnmDVmn2gAFCyNgh/dIrfP/w== + dependencies: + "@typescript-eslint/scope-manager" "6.20.0" + "@typescript-eslint/types" "6.20.0" + "@typescript-eslint/typescript-estree" "6.20.0" + "@typescript-eslint/visitor-keys" "6.20.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.20.0": + version "6.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz" + integrity sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA== + dependencies: + "@typescript-eslint/types" "6.20.0" + "@typescript-eslint/visitor-keys" "6.20.0" + +"@typescript-eslint/type-utils@6.20.0": + version "6.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.20.0.tgz" + integrity sha512-qnSobiJQb1F5JjN0YDRPHruQTrX7ICsmltXhkV536mp4idGAYrIyr47zF/JmkJtEcAVnIz4gUYJ7gOZa6SmN4g== + dependencies: + "@typescript-eslint/typescript-estree" "6.20.0" + "@typescript-eslint/utils" "6.20.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@6.20.0": + version "6.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.20.0.tgz" + integrity sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ== + +"@typescript-eslint/typescript-estree@6.20.0": + version "6.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.20.0.tgz" + integrity sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g== + dependencies: + "@typescript-eslint/types" "6.20.0" + "@typescript-eslint/visitor-keys" "6.20.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.20.0": + version "6.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.20.0.tgz" + integrity sha512-/EKuw+kRu2vAqCoDwDCBtDRU6CTKbUmwwI7SH7AashZ+W+7o8eiyy6V2cdOqN49KsTcASWsC5QeghYuRDTyOOg== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.20.0" + "@typescript-eslint/types" "6.20.0" + "@typescript-eslint/typescript-estree" "6.20.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.20.0": + version "6.20.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz" + integrity sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw== + dependencies: + "@typescript-eslint/types" "6.20.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@vitejs/plugin-react@^5.0.0": + version "5.0.2" + resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.2.tgz" + integrity sha512-tmyFgixPZCx2+e6VO9TNITWcCQl8+Nl/E8YbAyPVv85QCc7/A3JrdfG2A8gIzvVhWuzMOVrFW1aReaNxrI6tbw== + dependencies: + "@babel/core" "^7.28.3" + "@babel/plugin-transform-react-jsx-self" "^7.27.1" + "@babel/plugin-transform-react-jsx-source" "^7.27.1" + "@rolldown/pluginutils" "1.0.0-beta.34" + "@types/babel__core" "^7.20.5" + react-refresh "^0.17.0" + +"@xyflow/react@^12.7.0": + version "12.7.0" + resolved "https://registry.npmjs.org/@xyflow/react/-/react-12.7.0.tgz" + integrity sha512-U6VMEbYjiCg1byHrR7S+b5ZdHTjgCFX4KpBc634G/WtEBUvBLoMQdlCD6uJHqodnOAxpt3+G2wiDeTmXAFJzgQ== + dependencies: + "@xyflow/system" "0.0.62" + classcat "^5.0.3" + zustand "^4.4.0" + +"@xyflow/system@0.0.62": + version "0.0.62" + resolved "https://registry.npmjs.org/@xyflow/system/-/system-0.0.62.tgz" + integrity sha512-Z2ufbnvuYxIOCGyzE/8eX8TAEM8Lpzc/JafjD1Tzy6ZJs/E7KGVU17Q1F5WDHVW+dbztJAdyXMG0ejR9bwSUAA== + dependencies: + "@types/d3-drag" "^3.0.7" + "@types/d3-interpolate" "^3.0.4" + "@types/d3-selection" "^3.0.10" + "@types/d3-transition" "^3.0.8" + "@types/d3-zoom" "^3.0.8" + d3-drag "^3.0.0" + d3-interpolate "^3.0.1" + d3-selection "^3.0.0" + d3-zoom "^3.0.0" + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-hidden@^1.2.4: + version "1.2.6" + resolved "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz" + integrity sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA== + dependencies: + tslib "^2.0.0" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +"browserslist@>= 4.21.0", browserslist@^4.24.0: + version "4.25.1" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz" + integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw== + dependencies: + caniuse-lite "^1.0.30001726" + electron-to-chromium "^1.5.173" + node-releases "^2.0.19" + update-browserslist-db "^1.1.3" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001726: + version "1.0.30001731" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz" + integrity sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chownr@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz" + integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== + +class-variance-authority@^0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz" + integrity sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg== + dependencies: + clsx "^2.1.1" + +classcat@^5.0.3: + version "5.0.5" + resolved "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz" + integrity sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w== + +clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz" + integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== + +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +"d3-color@1 - 3": + version "3.1.0" + resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +"d3-dispatch@1 - 3": + version "3.0.1" + resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +"d3-drag@2 - 3", d3-drag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +"d3-ease@1 - 3": + version "3.0.1" + resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +"d3-interpolate@1 - 3", d3-interpolate@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +"d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + +"d3-timer@1 - 3": + version "3.0.1" + resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +"d3-transition@2 - 3": + version "3.0.1" + resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz" + integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== + dependencies: + d3-color "1 - 3" + d3-dispatch "1 - 3" + d3-ease "1 - 3" + d3-interpolate "1 - 3" + d3-timer "1 - 3" + +d3-zoom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz" + integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "2 - 3" + d3-transition "2 - 3" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +detect-libc@^2.0.3, detect-libc@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz" + integrity sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA== + +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +electron-to-chromium@^1.5.173: + version "1.5.198" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.198.tgz" + integrity sha512-G5COfnp3w+ydVu80yprgWSfmfQaYRh9DOxfhAxstLyetKaLyl55QrNjx8C38Pc/C+RaDmb1M0Lk8wPEMQ+bGgQ== + +enhanced-resolve@^5.18.1: + version "5.18.1" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz" + integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +esbuild@^0.25.0: + version "0.25.8" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz" + integrity sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.8" + "@esbuild/android-arm" "0.25.8" + "@esbuild/android-arm64" "0.25.8" + "@esbuild/android-x64" "0.25.8" + "@esbuild/darwin-arm64" "0.25.8" + "@esbuild/darwin-x64" "0.25.8" + "@esbuild/freebsd-arm64" "0.25.8" + "@esbuild/freebsd-x64" "0.25.8" + "@esbuild/linux-arm" "0.25.8" + "@esbuild/linux-arm64" "0.25.8" + "@esbuild/linux-ia32" "0.25.8" + "@esbuild/linux-loong64" "0.25.8" + "@esbuild/linux-mips64el" "0.25.8" + "@esbuild/linux-ppc64" "0.25.8" + "@esbuild/linux-riscv64" "0.25.8" + "@esbuild/linux-s390x" "0.25.8" + "@esbuild/linux-x64" "0.25.8" + "@esbuild/netbsd-arm64" "0.25.8" + "@esbuild/netbsd-x64" "0.25.8" + "@esbuild/openbsd-arm64" "0.25.8" + "@esbuild/openbsd-x64" "0.25.8" + "@esbuild/openharmony-arm64" "0.25.8" + "@esbuild/sunos-x64" "0.25.8" + "@esbuild/win32-arm64" "0.25.8" + "@esbuild/win32-ia32" "0.25.8" + "@esbuild/win32-x64" "0.25.8" + +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint@>=7, "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.56.0: + version "8.56.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz" + integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.56.0" + "@humanwhocodes/config-array" "^0.11.13" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +eslint-plugin-react-hooks@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react-refresh@^0.4.5: + version "0.4.5" + resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz" + integrity sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w== + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fdir@^6.4.4, fdir@^6.4.6: + version "6.4.6" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz" + integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.1.1" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz" + integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +"gensync@^1.0.0-beta.2": + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +globals@^13.19.0: + version "13.23.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== + dependencies: + type-fest "^0.20.2" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +ignore@^5.2.0, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jiti@>=1.21.0, jiti@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz" + integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lightningcss@1.30.1, lightningcss@^1.21.0: + version "1.30.1" + resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz" + integrity sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg== + optionalDependencies: + lightningcss-darwin-arm64 "1.30.1" + lightningcss-darwin-x64 "1.30.1" + lightningcss-freebsd-x64 "1.30.1" + lightningcss-linux-arm-gnueabihf "1.30.1" + lightningcss-linux-arm64-gnu "1.30.1" + lightningcss-linux-arm64-musl "1.30.1" + lightningcss-linux-x64-gnu "1.30.1" + lightningcss-linux-x64-musl "1.30.1" + lightningcss-win32-arm64-msvc "1.30.1" + lightningcss-win32-x64-msvc "1.30.1" + dependencies: + detect-libc "^2.0.3" + +lightningcss-darwin-arm64@1.30.1: + version "1.30.1" + resolved "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz" + integrity sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ== + +lightningcss-darwin-x64@1.30.1: + version "1.30.1" + resolved "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz" + integrity sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA== + +lightningcss-freebsd-x64@1.30.1: + version "1.30.1" + resolved "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz" + integrity sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig== + +lightningcss-linux-arm-gnueabihf@1.30.1: + version "1.30.1" + resolved "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz" + integrity sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q== + +lightningcss-linux-arm64-gnu@1.30.1: + version "1.30.1" + resolved "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz" + integrity sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw== + +lightningcss-linux-arm64-musl@1.30.1: + version "1.30.1" + resolved "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz" + integrity sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ== + +lightningcss-linux-x64-gnu@1.30.1: + version "1.30.1" + resolved "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz" + integrity sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw== + +lightningcss-linux-x64-musl@1.30.1: + version "1.30.1" + resolved "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz" + integrity sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ== + +lightningcss-win32-arm64-msvc@1.30.1: + version "1.30.1" + resolved "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz" + integrity sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA== + +lightningcss-win32-x64-msvc@1.30.1: + version "1.30.1" + resolved "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz" + integrity sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lucide-react@^0.511.0: + version "0.511.0" + resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.511.0.tgz" + integrity sha512-VK5a2ydJ7xm8GvBeKLS9mu1pVK6ucef9780JVUjw6bAjJL/QXnd4Y0p7SPeOUMC27YhzNCZvm5d/QX0Tp3rc0w== + +magic-string@^0.30.17: + version "0.30.17" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minipass@^7.0.4, minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +minizlib@^3.0.1: + version "3.0.2" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz" + integrity sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA== + dependencies: + minipass "^7.1.2" + +mkdirp@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +"picomatch@^3 || ^4", picomatch@^4.0.2, picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + +postcss@^8.5.6: + version "8.5.6" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react@>=16.8, react@>=17, react@>=18, "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^18 || ^19", react@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +react-dom@>=16.8.0, react-dom@>=17, react-dom@>=18, "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-refresh@^0.17.0: + version "0.17.0" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz" + integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== + +react-remove-scroll@^2.6.3: + version "2.7.0" + resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.0.tgz" + integrity sha512-sGsQtcjMqdQyijAHytfGEELB8FufGbfXIsvUTe+NLx1GDRJCXtCFLBLUI1eyZCKXXvbEU2C6gai0PZKoIE9Vbg== + dependencies: + react-remove-scroll-bar "^2.3.7" + react-style-singleton "^2.2.3" + tslib "^2.1.0" + use-callback-ref "^1.3.3" + use-sidecar "^1.1.3" + +react-remove-scroll-bar@^2.3.7: + version "2.3.8" + resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz" + integrity sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q== + dependencies: + react-style-singleton "^2.2.2" + tslib "^2.0.0" + +react-router@^7.6.2: + version "7.6.2" + resolved "https://registry.npmjs.org/react-router/-/react-router-7.6.2.tgz" + integrity sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w== + dependencies: + cookie "^1.0.1" + set-cookie-parser "^2.6.0" + +react-style-singleton@^2.2.2, react-style-singleton@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz" + integrity sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ== + dependencies: + get-nonce "^1.0.0" + tslib "^2.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup@^4.43.0: + version "4.46.2" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz" + integrity sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg== + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.46.2" + "@rollup/rollup-android-arm64" "4.46.2" + "@rollup/rollup-darwin-arm64" "4.46.2" + "@rollup/rollup-darwin-x64" "4.46.2" + "@rollup/rollup-freebsd-arm64" "4.46.2" + "@rollup/rollup-freebsd-x64" "4.46.2" + "@rollup/rollup-linux-arm-gnueabihf" "4.46.2" + "@rollup/rollup-linux-arm-musleabihf" "4.46.2" + "@rollup/rollup-linux-arm64-gnu" "4.46.2" + "@rollup/rollup-linux-arm64-musl" "4.46.2" + "@rollup/rollup-linux-loongarch64-gnu" "4.46.2" + "@rollup/rollup-linux-ppc64-gnu" "4.46.2" + "@rollup/rollup-linux-riscv64-gnu" "4.46.2" + "@rollup/rollup-linux-riscv64-musl" "4.46.2" + "@rollup/rollup-linux-s390x-gnu" "4.46.2" + "@rollup/rollup-linux-x64-gnu" "4.46.2" + "@rollup/rollup-linux-x64-musl" "4.46.2" + "@rollup/rollup-win32-arm64-msvc" "4.46.2" + "@rollup/rollup-win32-ia32-msvc" "4.46.2" + "@rollup/rollup-win32-x64-msvc" "4.46.2" + fsevents "~2.3.2" + dependencies: + "@types/estree" "1.0.8" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.5.4: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +set-cookie-parser@^2.6.0: + version "2.7.1" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz" + integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +tailwind-merge@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.0.tgz" + integrity sha512-fyW/pEfcQSiigd5SNn0nApUOxx0zB/dm6UDU/rEwc2c3sX2smWUNbapHv+QRqLGVp9GWX3THIa7MUGPo+YkDzQ== + +tailwindcss@4.1.7: + version "4.1.7" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.7.tgz" + integrity sha512-kr1o/ErIdNhTz8uzAYL7TpaUuzKIE6QPQ4qmSdxnoX/lo+5wmUHQA6h3L5yIqEImSRnAAURDirLu/BgiXGPAhg== + +tapable@^2.2.0: + version "2.2.2" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz" + integrity sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg== + +tar@^7.4.3: + version "7.4.3" + resolved "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz" + integrity sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw== + dependencies: + "@isaacs/fs-minipass" "^4.0.0" + chownr "^3.0.0" + minipass "^7.1.2" + minizlib "^3.0.1" + mkdirp "^3.0.1" + yallist "^5.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +tinyglobby@^0.2.14: + version "0.2.14" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz" + integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== + dependencies: + fdir "^6.4.4" + picomatch "^4.0.2" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.8.0: + version "2.8.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tw-animate-css@^1.3.5: + version "1.3.5" + resolved "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.3.5.tgz" + integrity sha512-t3u+0YNoloIhj1mMXs779P6MO9q3p3mvGn4k1n3nJPqJw/glZcuijG2qTSN4z4mgNRfW5ZC3aXJFLwDtiipZXA== + +type-check@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typescript@>=4.2.0, typescript@^5.3.3: + version "5.3.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== + +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + +update-browserslist-db@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +use-callback-ref@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz" + integrity sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg== + dependencies: + tslib "^2.0.0" + +use-sidecar@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz" + integrity sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + +use-sync-external-store@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +"vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "vite@^5.2.0 || ^6", vite@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/vite/-/vite-7.1.0.tgz" + integrity sha512-3jdAy3NhBJYsa/lCFcnRfbK4kNkO/bhijFCnv5ByUQk/eekYagoV2yQSISUrhpV+5JiY5hmwOh7jNnQ68dFMuQ== + optionalDependencies: + fsevents "~2.3.3" + dependencies: + esbuild "^0.25.0" + fdir "^6.4.6" + picomatch "^4.0.3" + postcss "^8.5.6" + rollup "^4.43.0" + tinyglobby "^0.2.14" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yallist@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz" + integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zustand@^4.4.0: + version "4.5.2" + resolved "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz" + integrity sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g== + dependencies: + use-sync-external-store "1.2.0" diff --git a/tierkreis_visualization/tierkreis_visualization/data/eval.py b/tierkreis_visualization/tierkreis_visualization/data/eval.py index e6e80afd0..20fc5e05b 100644 --- a/tierkreis_visualization/tierkreis_visualization/data/eval.py +++ b/tierkreis_visualization/tierkreis_visualization/data/eval.py @@ -92,7 +92,7 @@ def get_eval_node( case "ifelse": name = node.type add_conditional_edges(storage, node_location, i, node, py_edges) - case "map" | "eval" | "input" | "loop" | "eifelse": + case "map" | "eval" | "loop" | "eifelse": name = node.type case "const": name = node.type @@ -105,6 +105,9 @@ def get_eval_node( value = json.loads(storage.read_output(node_location.N(idx), p)) except (FileNotFoundError, TierkreisError): value = None + case "input": + name = node.type + value = node.name case _: assert_never(node) From 4fbe34cde3189d45e0114c65246eacc3dc579ae2 Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Tue, 9 Sep 2025 16:48:25 +0100 Subject: [PATCH 03/18] Make eval collapsible --- .../frontend/src/graph/parseGraph.ts | 5 +- .../frontend/src/nodes/eval.tsx | 109 ++++++++++++++++-- .../frontend/src/nodes/types.ts | 6 + 3 files changed, 107 insertions(+), 13 deletions(-) diff --git a/tierkreis_visualization/frontend/src/graph/parseGraph.ts b/tierkreis_visualization/frontend/src/graph/parseGraph.ts index 71f62272c..f7be31c67 100644 --- a/tierkreis_visualization/frontend/src/graph/parseGraph.ts +++ b/tierkreis_visualization/frontend/src/graph/parseGraph.ts @@ -96,6 +96,8 @@ export function parseNodes( name: node.function_name, status: node.status, handles: getHandlesFromEdges(Number(node.id), edges), + hidden_handles: undefined, + hidden_edges: undefined, workflowId: workflowId, node_location: node.node_location, title: getTitle(node.function_name), @@ -104,8 +106,7 @@ export function parseNodes( pinned: false, value: parseNodeValue(node.value), setInfo: undefined, - setNodes: undefined, - setEdges: undefined, + is_expanded: false, }, parentId: parentId ? `${parentId}` : undefined, })); diff --git a/tierkreis_visualization/frontend/src/nodes/eval.tsx b/tierkreis_visualization/frontend/src/nodes/eval.tsx index e97605a76..cd5b69f86 100644 --- a/tierkreis_visualization/frontend/src/nodes/eval.tsx +++ b/tierkreis_visualization/frontend/src/nodes/eval.tsx @@ -8,7 +8,7 @@ import { URL } from "@/data/constants"; import { parseEdges, parseNodes } from "@/graph/parseGraph"; import { bottomUpLayout } from "@/graph/layoutGraph"; import { type BackendNode } from "./types"; -import { Plus } from "lucide-react"; +import { Minus, Plus } from "lucide-react"; function replaceEval( nodeId: string, @@ -20,7 +20,7 @@ function replaceEval( // replaces an eval node with its nested subgraph const oldEdgesCopy: Edge[] = JSON.parse(JSON.stringify(oldEdges)); // we only care about the last part of the id as number - const nodesToRemove = [nodeId]; + const nodesToRemove: string[] = []; newNodes.sort( (a, b) => Number(a.id.substring(a.id.lastIndexOf(":"), a.id.length)) - @@ -90,25 +90,111 @@ function replaceEval( } } }); - const groupNode = { - id: nodeId, - type: "group", - position: { x: 0, y: 0 }, - data: {}, - parentId: oldNodes.find((node) => node.id === nodeId)?.parentId, - } as BackendNode; - oldNodes = oldNodes.filter((node) => !nodesToRemove.includes(node.id)); + oldNodes = oldNodes + .map((node) => { + if (nodesToRemove.includes(node.id)) { + return undefined; + } + if (node.id === nodeId) { + const handles = node.data.handles.inputs.filter( + (handle) => !handle.includes("body") + ); + node.position = { x: 0, y: 0 }; + node.data.hidden_handles = { + inputs: handles, + outputs: node.data.handles.outputs, + }; + node.data.hidden_edges = oldEdges.filter( + (edge) => + (edge.target === nodeId || edge.source === nodeId) && + edge.label !== "Graph Body" + ); + node.data.handles = { inputs: [], outputs: [] }; + node.data.is_expanded = true; + } + return node; + }) + .filter((node): node is BackendNode => node !== undefined); const tmpEdges = oldEdgesCopy.filter( (edge) => edge.target !== nodeId && edge.source !== nodeId ); return { - nodes: [groupNode, ...oldNodes, ...newNodes], + nodes: [...oldNodes, ...newNodes], edges: [...tmpEdges, ...newEdges], }; } +function hideChildren( + nodeId: string, + oldNodes: BackendNode[], + oldEdges: Edge[] +) { + let hidden_edges: Edge[] = []; + oldNodes = oldNodes + .map((node) => { + if (node.parentId?.startsWith(nodeId)) { + return undefined; + } + if (node.id === nodeId) { + hidden_edges = node.data.hidden_edges ?? []; + node.position = { x: 0, y: 0 }; + node.data.handles = node.data.hidden_handles ?? { + inputs: [], + outputs: [], + }; + node.data.is_expanded = false; + node.style = { + width: 180, + height: 130, + }; + } + return node; + }) + .filter((node): node is BackendNode => node !== undefined); + + oldEdges.filter( + (edge) => + edge.target.startsWith(nodeId + ":") && + edge.source.startsWith(nodeId + ":") + ); + return { + nodes: [...oldNodes], + edges: [...oldEdges, ...hidden_edges], + }; +} + export function EvalNode({ data: node_data }: NodeProps) { const reactFlowInstance = useReactFlow(); + if (node_data.is_expanded) { + const collapseSelf = (nodeId: string) => { + const oldEdges = reactFlowInstance.getEdges(); + const oldNodes = reactFlowInstance.getNodes(); + const { nodes: newNodes, edges: newEdges } = hideChildren( + nodeId, + oldNodes, + oldEdges + ); + const positionedNodes = bottomUpLayout(newNodes, newEdges); + reactFlowInstance.setNodes(positionedNodes); + reactFlowInstance.setEdges(newEdges); + }; + return ( + +
+ +
+
+ ); + } const loadChildren = async ( workflowId: string, node_location: string, @@ -137,6 +223,7 @@ export function EvalNode({ data: node_data }: NodeProps) { reactFlowInstance.setEdges(newEdges); }); }; + return ( diff --git a/tierkreis_visualization/frontend/src/nodes/types.ts b/tierkreis_visualization/frontend/src/nodes/types.ts index 7011e4d8b..8cfbd0219 100644 --- a/tierkreis_visualization/frontend/src/nodes/types.ts +++ b/tierkreis_visualization/frontend/src/nodes/types.ts @@ -15,6 +15,11 @@ export type BackendNode = Node<{ inputs: string[]; outputs: string[]; }; + hidden_handles?: { + inputs: string[]; + outputs: string[]; + }; + hidden_edges?: Edge[]; workflowId: string; node_location: string; id: string; @@ -23,5 +28,6 @@ export type BackendNode = Node<{ pinned: boolean; value: string | null; setInfo?: (info: InfoProps) => void; + is_expanded: boolean; }>; export type AppNode = BackendNode; From ad5b11e7365d475b84ccc0c0dcbbbda740f5149f Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Tue, 9 Sep 2025 17:10:57 +0100 Subject: [PATCH 04/18] Add collapse to map nodes too --- .../frontend/src/nodes/eval.tsx | 42 +---------- .../frontend/src/nodes/hide_children.ts | 41 +++++++++++ .../frontend/src/nodes/map.tsx | 73 ++++++++++++++----- 3 files changed, 99 insertions(+), 57 deletions(-) create mode 100644 tierkreis_visualization/frontend/src/nodes/hide_children.ts diff --git a/tierkreis_visualization/frontend/src/nodes/eval.tsx b/tierkreis_visualization/frontend/src/nodes/eval.tsx index cd5b69f86..09f0581bb 100644 --- a/tierkreis_visualization/frontend/src/nodes/eval.tsx +++ b/tierkreis_visualization/frontend/src/nodes/eval.tsx @@ -8,6 +8,7 @@ import { URL } from "@/data/constants"; import { parseEdges, parseNodes } from "@/graph/parseGraph"; import { bottomUpLayout } from "@/graph/layoutGraph"; import { type BackendNode } from "./types"; +import { hideChildren } from "./hide_children"; import { Minus, Plus } from "lucide-react"; function replaceEval( @@ -90,6 +91,8 @@ function replaceEval( } } }); + // remove the body nodes (might not want to do that in the future) + // update the internal state of the eval node oldNodes = oldNodes .map((node) => { if (nodesToRemove.includes(node.id)) { @@ -124,45 +127,6 @@ function replaceEval( }; } -function hideChildren( - nodeId: string, - oldNodes: BackendNode[], - oldEdges: Edge[] -) { - let hidden_edges: Edge[] = []; - oldNodes = oldNodes - .map((node) => { - if (node.parentId?.startsWith(nodeId)) { - return undefined; - } - if (node.id === nodeId) { - hidden_edges = node.data.hidden_edges ?? []; - node.position = { x: 0, y: 0 }; - node.data.handles = node.data.hidden_handles ?? { - inputs: [], - outputs: [], - }; - node.data.is_expanded = false; - node.style = { - width: 180, - height: 130, - }; - } - return node; - }) - .filter((node): node is BackendNode => node !== undefined); - - oldEdges.filter( - (edge) => - edge.target.startsWith(nodeId + ":") && - edge.source.startsWith(nodeId + ":") - ); - return { - nodes: [...oldNodes], - edges: [...oldEdges, ...hidden_edges], - }; -} - export function EvalNode({ data: node_data }: NodeProps) { const reactFlowInstance = useReactFlow(); if (node_data.is_expanded) { diff --git a/tierkreis_visualization/frontend/src/nodes/hide_children.ts b/tierkreis_visualization/frontend/src/nodes/hide_children.ts new file mode 100644 index 000000000..3d8467ca2 --- /dev/null +++ b/tierkreis_visualization/frontend/src/nodes/hide_children.ts @@ -0,0 +1,41 @@ +import { BackendNode } from "./types"; +import { Edge } from "@xyflow/react"; + +export function hideChildren( + nodeId: string, + oldNodes: BackendNode[], + oldEdges: Edge[] +) { + let hidden_edges: Edge[] = []; + oldNodes = oldNodes + .map((node) => { + if (node.parentId?.startsWith(nodeId)) { + return undefined; + } + if (node.id === nodeId) { + hidden_edges = node.data.hidden_edges ?? []; + node.position = { x: 0, y: 0 }; + node.data.handles = node.data.hidden_handles ?? { + inputs: [], + outputs: [], + }; + node.data.is_expanded = false; + node.style = { + width: 180, + height: 130, + }; + } + return node; + }) + .filter((node): node is BackendNode => node !== undefined); + + oldEdges.filter( + (edge) => + edge.target.startsWith(nodeId + ":") && + edge.source.startsWith(nodeId + ":") + ); + return { + nodes: [...oldNodes], + edges: [...oldEdges, ...hidden_edges], + }; +} diff --git a/tierkreis_visualization/frontend/src/nodes/map.tsx b/tierkreis_visualization/frontend/src/nodes/map.tsx index ab8fcdb07..6cf9577db 100644 --- a/tierkreis_visualization/frontend/src/nodes/map.tsx +++ b/tierkreis_visualization/frontend/src/nodes/map.tsx @@ -7,8 +7,9 @@ import { Button } from "@/components/ui/button"; import { URL } from "@/data/constants"; import { parseNodes } from "@/graph/parseGraph"; import { type BackendNode } from "@/nodes/types"; -import { Plus } from "lucide-react"; +import { Plus, Minus } from "lucide-react"; import { bottomUpLayout } from "@/graph/layoutGraph"; +import { hideChildren } from "./hide_children"; function replaceMap( nodeId: string, @@ -18,7 +19,7 @@ function replaceMap( ) { // copy over all the inputs and outputs from the map node to its children let edges: Edge[] = JSON.parse(JSON.stringify(oldEdges)); - const nodesToRemove = [nodeId]; + const nodesToRemove: string[] = []; const edgesToRemove: string[] = []; const newEdges: Edge[] = []; edges.forEach((edge) => { @@ -59,24 +60,65 @@ function replaceMap( }); } }); - const groupNode = { - id: nodeId, - type: "group", - position: { x: 0, y: 0 }, - data: {}, - parentId: oldNodes.find((node) => node.id === nodeId)?.parentId, - } as BackendNode; - oldNodes = oldNodes.filter((node) => !nodesToRemove.includes(node.id)); + // remove the body nodes (might not want to do that in the future) + // update the internal state of the map node + oldNodes = oldNodes + .map((node) => { + if (nodesToRemove.includes(node.id)) { + return undefined; + } + if (node.id === nodeId) { + node.position = { x: 0, y: 0 }; + node.data.hidden_handles = node.data.handles; + node.data.hidden_edges = edges.filter( + (edge) => edge.target === nodeId || edge.source === nodeId + ); + node.data.handles = { inputs: [], outputs: [] }; + node.data.is_expanded = true; + } + return node; + }) + .filter((node): node is BackendNode => node !== undefined); edges = edges.filter((edge) => !edgesToRemove.includes(edge.id)); // there are no edges between the newNodes return { - nodes: [groupNode, ...oldNodes, ...newNodes], + nodes: [...oldNodes, ...newNodes], edges: [...edges, ...newEdges], }; } export function MapNode({ data: node_data }: NodeProps) { const reactFlowInstance = useReactFlow(); + if (node_data.is_expanded) { + const collapseSelf = (nodeId: string) => { + const oldEdges = reactFlowInstance.getEdges(); + const oldNodes = reactFlowInstance.getNodes(); + const { nodes: newNodes, edges: newEdges } = hideChildren( + nodeId, + oldNodes, + oldEdges + ); + const positionedNodes = bottomUpLayout(newNodes, newEdges); + reactFlowInstance.setNodes(positionedNodes); + reactFlowInstance.setEdges(newEdges); + }; + return ( + +
+ +
+
+ ); + } const loadChildren = async ( workflowId: string, node_location: string, @@ -86,13 +128,7 @@ export function MapNode({ data: node_data }: NodeProps) { fetch(url, { method: "GET", headers: { Accept: "application/json" } }) .then((response) => response.json()) .then((data) => { - const nodes = parseNodes( - data.nodes, - data.edges, - workflowId, - node_data.setInfo, - parentId - ); + const nodes = parseNodes(data.nodes, data.edges, workflowId, parentId); const oldEdges = reactFlowInstance.getEdges(); const oldNodes = reactFlowInstance.getNodes(); const { nodes: newNodes, edges: newEdges } = replaceMap( @@ -111,6 +147,7 @@ export function MapNode({ data: node_data }: NodeProps) { }; return ( + {} {node_data.title} From 8adac7566954418f7a78b628bb62aa17059d0d09 Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Tue, 9 Sep 2025 17:22:07 +0100 Subject: [PATCH 05/18] Add clear local storage button --- tierkreis_visualization/frontend/src/App.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tierkreis_visualization/frontend/src/App.tsx b/tierkreis_visualization/frontend/src/App.tsx index d2f4c8eff..ab483c9e7 100644 --- a/tierkreis_visualization/frontend/src/App.tsx +++ b/tierkreis_visualization/frontend/src/App.tsx @@ -8,8 +8,6 @@ import { ReactFlow, useReactFlow, OnNodeDrag, - ReactFlowProvider, - useNodes, } from "@xyflow/react"; import { useParams } from "react-router"; @@ -19,7 +17,7 @@ import { URL } from "@/data/constants"; import { parseGraph } from "@/graph/parseGraph"; import { Background, ControlButton, Controls } from "@xyflow/react"; import "@xyflow/react/dist/style.css"; -import { Network } from "lucide-react"; +import { FolderSync, Network } from "lucide-react"; import React, { useCallback, useState } from "react"; import { SidebarTrigger } from "@/components/ui/sidebar"; @@ -196,6 +194,13 @@ const Main = (props: { > + { + localStorage.clear(); + }} + > + + From 1dea7d145da36b8fe615720ae410c6b8dbb3394c Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Tue, 9 Sep 2025 17:38:36 +0100 Subject: [PATCH 06/18] Add error page --- .../Quantinuum Logo__horizontal black.svg | 41 +++++++++++++ .../frontend/public/favicon.ico | Bin 114104 -> 0 bytes .../frontend/public/favicon.svg | 15 +++++ .../frontend/src/error.tsx | 57 ++++++++++++++++++ tierkreis_visualization/frontend/src/main.tsx | 5 ++ 5 files changed, 118 insertions(+) create mode 100644 tierkreis_visualization/frontend/public/Quantinuum Logo__horizontal black.svg delete mode 100644 tierkreis_visualization/frontend/public/favicon.ico create mode 100644 tierkreis_visualization/frontend/public/favicon.svg create mode 100644 tierkreis_visualization/frontend/src/error.tsx diff --git a/tierkreis_visualization/frontend/public/Quantinuum Logo__horizontal black.svg b/tierkreis_visualization/frontend/public/Quantinuum Logo__horizontal black.svg new file mode 100644 index 000000000..e84cd38ab --- /dev/null +++ b/tierkreis_visualization/frontend/public/Quantinuum Logo__horizontal black.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/tierkreis_visualization/frontend/public/favicon.ico b/tierkreis_visualization/frontend/public/favicon.ico deleted file mode 100644 index 9ef0fbfd6596f80415822b585a80df66888ec689..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114104 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 + + + + + + + + + + + + + + diff --git a/tierkreis_visualization/frontend/src/error.tsx b/tierkreis_visualization/frontend/src/error.tsx new file mode 100644 index 000000000..b44e8d868 --- /dev/null +++ b/tierkreis_visualization/frontend/src/error.tsx @@ -0,0 +1,57 @@ +import { Link, useRouteError, isRouteErrorResponse } from "react-router"; +import MyLogo from "../public/Quantinuum Logo__horizontal black.svg"; // + +export default function ErrorPage() { + const error = useRouteError(); + let errorMessage: string; + if (isRouteErrorResponse(error)) { + errorMessage = error.statusText; + } else if (error instanceof Error) { + errorMessage = error.message; + } else if (typeof error === "string") { + errorMessage = error; + } else { + errorMessage = "An unknown error occurred"; + } + + return ( +
+
+

Oops! 😱

+

Sorry, an unexpected error has occurred.

+

+ {errorMessage} +

+ Go back to the homepage +
+
+ Company Logo +
+
+ ); +} + +// Basic inline styles for layout +// In a real app, you'd likely use CSS classes +const containerStyle: React.CSSProperties = { + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "center", + minHeight: "100vh", + textAlign: "center", + padding: "20px", + boxSizing: "border-box", +}; + +const contentStyle: React.CSSProperties = { + flexGrow: 1, + display: "flex", + flexDirection: "column", + justifyContent: "center", +}; + +const footerStyle: React.CSSProperties = { + marginTop: "auto", + padding: "20px 0", +}; diff --git a/tierkreis_visualization/frontend/src/main.tsx b/tierkreis_visualization/frontend/src/main.tsx index da4e2a450..c3c77db12 100644 --- a/tierkreis_visualization/frontend/src/main.tsx +++ b/tierkreis_visualization/frontend/src/main.tsx @@ -13,6 +13,7 @@ import App from "./App"; import { ReactFlowProvider } from "@xyflow/react"; import "@xyflow/react/dist/style.css"; import "./index.css"; +import ErrorPage from "./error"; const queryClient = new QueryClient(); @@ -33,20 +34,24 @@ const router = createBrowserRouter([ { path: "/", element: element, + errorElement: , }, { path: "/:workflowId", element: element, loader: workflowId, + errorElement: , }, { path: "*/:workflowId", element: element, loader: workflowId, + errorElement: , }, { path: "*", element: element, + errorElement: , }, ]); From 3fef841939efdf22f4a61f09773a087443d88f79 Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Wed, 10 Sep 2025 12:32:39 +0100 Subject: [PATCH 07/18] Move error logo --- tierkreis_visualization/frontend/src/error.tsx | 2 +- .../quantinuum_logo.svg} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename tierkreis_visualization/frontend/{public/Quantinuum Logo__horizontal black.svg => src/quantinuum_logo.svg} (100%) diff --git a/tierkreis_visualization/frontend/src/error.tsx b/tierkreis_visualization/frontend/src/error.tsx index b44e8d868..8cabff294 100644 --- a/tierkreis_visualization/frontend/src/error.tsx +++ b/tierkreis_visualization/frontend/src/error.tsx @@ -1,5 +1,5 @@ import { Link, useRouteError, isRouteErrorResponse } from "react-router"; -import MyLogo from "../public/Quantinuum Logo__horizontal black.svg"; // +import MyLogo from "./quantinuum_logo.svg"; // export default function ErrorPage() { const error = useRouteError(); diff --git a/tierkreis_visualization/frontend/public/Quantinuum Logo__horizontal black.svg b/tierkreis_visualization/frontend/src/quantinuum_logo.svg similarity index 100% rename from tierkreis_visualization/frontend/public/Quantinuum Logo__horizontal black.svg rename to tierkreis_visualization/frontend/src/quantinuum_logo.svg From 8e960734e3967367d82f3939ee7777e1b8171bc2 Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Wed, 10 Sep 2025 13:46:08 +0100 Subject: [PATCH 08/18] Add fallback to read errors --- tierkreis/tierkreis/controller/storage/filestorage.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tierkreis/tierkreis/controller/storage/filestorage.py b/tierkreis/tierkreis/controller/storage/filestorage.py index 8a46bad8c..88be4222a 100644 --- a/tierkreis/tierkreis/controller/storage/filestorage.py +++ b/tierkreis/tierkreis/controller/storage/filestorage.py @@ -169,9 +169,18 @@ def read_output(self, node_location: Loc, output_name: PortID) -> bytes: def read_errors(self, node_location: Loc) -> str: if not self._error_logs_path(node_location).exists(): + if self._error_path(node_location).exists(): + print(self._error_path(node_location)) + with open(self._error_path(node_location), "r") as fh: + return fh.read() return "" with open(self._error_logs_path(node_location), "r") as fh: - return fh.read() + errors = fh.read() + if errors == "": + if self._error_path(node_location).exists(): + with open(self._error_path(node_location), "r") as fh: + return fh.read() + return errors def write_node_errors(self, node_location: Loc, error_logs: str) -> None: with open(self._error_logs_path(node_location), "w+") as fh: From e2550ba37cbee776485a183a8c118737017f359c Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Wed, 10 Sep 2025 13:46:20 +0100 Subject: [PATCH 09/18] Update favicon --- tierkreis_visualization/frontend/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tierkreis_visualization/frontend/index.html b/tierkreis_visualization/frontend/index.html index 233b2cceb..2fdda2d9b 100644 --- a/tierkreis_visualization/frontend/index.html +++ b/tierkreis_visualization/frontend/index.html @@ -2,7 +2,7 @@ - + Tierkreis Frontend From ad50f3b8039983492d598845187e725a328f64f7 Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Fri, 12 Sep 2025 10:46:05 +0100 Subject: [PATCH 10/18] Add error when no workflows found --- tierkreis_visualization/frontend/src/App.tsx | 3 ++- .../tierkreis_visualization/routers/workflows.py | 14 +++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/tierkreis_visualization/frontend/src/App.tsx b/tierkreis_visualization/frontend/src/App.tsx index ab483c9e7..181ae929e 100644 --- a/tierkreis_visualization/frontend/src/App.tsx +++ b/tierkreis_visualization/frontend/src/App.tsx @@ -214,7 +214,8 @@ export default function App() { queryFn: async () => { const response = await fetch(`${URL}/all`); if (!response.ok) { - throw new Error("Network response was not ok"); + const text = await response.json(); + throw new Error(`${text}`); } return response.json(); }, diff --git a/tierkreis_visualization/tierkreis_visualization/routers/workflows.py b/tierkreis_visualization/tierkreis_visualization/routers/workflows.py index 08e3f3b9f..e9674fe96 100644 --- a/tierkreis_visualization/tierkreis_visualization/routers/workflows.py +++ b/tierkreis_visualization/tierkreis_visualization/routers/workflows.py @@ -3,7 +3,7 @@ from typing import Any, assert_never from uuid import UUID -from fastapi import APIRouter, Request +from fastapi import APIRouter, Request, status from fastapi.responses import StreamingResponse from pydantic import BaseModel from starlette.responses import JSONResponse, PlainTextResponse @@ -70,8 +70,16 @@ def list_workflows(request: Request): @router.get("/all") def list_all_workflows(request: Request): storage_type = request.app.state.storage_type - workflows = get_workflows(storage_type) - return JSONResponse([workflow.model_dump(mode="json") for workflow in workflows]) + try: + workflows = get_workflows(storage_type) + return JSONResponse( + [workflow.model_dump(mode="json") for workflow in workflows] + ) + except FileNotFoundError: + return JSONResponse( + "Workflow not found, make sure the workflow exists in the workflow directory.", + status_code=status.HTTP_404_NOT_FOUND, + ) class NodeResponse(BaseModel): From c24d636c90531ae4466f51277aa37d16aacce473 Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Fri, 12 Sep 2025 11:19:32 +0100 Subject: [PATCH 11/18] Add show tooltip button --- tierkreis_visualization/frontend/src/App.tsx | 22 ++++++++++++++++--- .../frontend/src/components/handles.tsx | 18 +++++++++++---- .../frontend/src/components/types.ts | 2 ++ .../frontend/src/graph/parseGraph.ts | 2 ++ .../frontend/src/nodes/default.tsx | 14 ++++++++++-- .../frontend/src/nodes/eval.tsx | 4 ++++ .../frontend/src/nodes/map.tsx | 4 ++++ .../frontend/src/nodes/types.ts | 2 ++ 8 files changed, 59 insertions(+), 9 deletions(-) diff --git a/tierkreis_visualization/frontend/src/App.tsx b/tierkreis_visualization/frontend/src/App.tsx index 181ae929e..23319b9d4 100644 --- a/tierkreis_visualization/frontend/src/App.tsx +++ b/tierkreis_visualization/frontend/src/App.tsx @@ -17,7 +17,7 @@ import { URL } from "@/data/constants"; import { parseGraph } from "@/graph/parseGraph"; import { Background, ControlButton, Controls } from "@xyflow/react"; import "@xyflow/react/dist/style.css"; -import { FolderSync, Network } from "lucide-react"; +import { Eye, EyeClosed, FolderSync, Network } from "lucide-react"; import React, { useCallback, useState } from "react"; import { SidebarTrigger } from "@/components/ui/sidebar"; @@ -79,10 +79,20 @@ const Main = (props: { // Client node state (not definition) const reactFlowInstance = useReactFlow(); + const [tooltipsOpen, setAreTooltipsOpen] = useState(false); props.initialNodes.map((node) => { node.data.setInfo = props.setInfo; + node.data.onTooltipOpenChange = setAreTooltipsOpen; + node.data.isTooltipOpen = tooltipsOpen; }); - + const handleToggleTooltips = () => { + setAreTooltipsOpen((prev) => !prev); + reactFlowInstance.getNodes().forEach((node) => { + reactFlowInstance.updateNodeData(node.id, { + isTooltipOpen: tooltipsOpen, + }); + }); + }; React.useEffect(() => { saveGraph({ key: props.workflow_id, @@ -160,7 +170,6 @@ const Main = (props: { } }; }, [props, reactFlowInstance, props.setInfo]); - return ( + + {tooltipsOpen ? ( + + ) : ( + + )} + diff --git a/tierkreis_visualization/frontend/src/components/handles.tsx b/tierkreis_visualization/frontend/src/components/handles.tsx index 06ff8d072..037cc2a7a 100644 --- a/tierkreis_visualization/frontend/src/components/handles.tsx +++ b/tierkreis_visualization/frontend/src/components/handles.tsx @@ -7,7 +7,12 @@ import { import { Handle, Position } from "@xyflow/react"; // I have no idea about the style, but it seems to be working now -export const InputHandleArray = ({ handles, id }: HandleProps) => { +export const InputHandleArray = ({ + handles, + id, + isOpen, + onOpenChange, +}: HandleProps) => { return (
{ }} > <> - + { ); }; -export const OutputHandleArray = ({ handles, id }: HandleProps) => { +export const OutputHandleArray = ({ + handles, + id, + isOpen, + onOpenChange, +}: HandleProps) => { return (
{ }} > <> - + void; } diff --git a/tierkreis_visualization/frontend/src/graph/parseGraph.ts b/tierkreis_visualization/frontend/src/graph/parseGraph.ts index f7be31c67..5f5d353ce 100644 --- a/tierkreis_visualization/frontend/src/graph/parseGraph.ts +++ b/tierkreis_visualization/frontend/src/graph/parseGraph.ts @@ -107,6 +107,8 @@ export function parseNodes( value: parseNodeValue(node.value), setInfo: undefined, is_expanded: false, + isTooltipOpen: false, + onTooltipOpenChange: () => {}, }, parentId: parentId ? `${parentId}` : undefined, })); diff --git a/tierkreis_visualization/frontend/src/nodes/default.tsx b/tierkreis_visualization/frontend/src/nodes/default.tsx index 78f512b76..e9fc66853 100644 --- a/tierkreis_visualization/frontend/src/nodes/default.tsx +++ b/tierkreis_visualization/frontend/src/nodes/default.tsx @@ -65,8 +65,18 @@ export function DefaultNode({ data }: NodeProps) { - - + + {data.status == "Error" && ( diff --git a/tierkreis_visualization/frontend/src/nodes/eval.tsx b/tierkreis_visualization/frontend/src/nodes/eval.tsx index 09f0581bb..d5e2a512c 100644 --- a/tierkreis_visualization/frontend/src/nodes/eval.tsx +++ b/tierkreis_visualization/frontend/src/nodes/eval.tsx @@ -199,10 +199,14 @@ export function EvalNode({ data: node_data }: NodeProps) {
{node_data.status != "Not started" && ( diff --git a/tierkreis_visualization/frontend/src/nodes/map.tsx b/tierkreis_visualization/frontend/src/nodes/map.tsx index 6cf9577db..06dbed067 100644 --- a/tierkreis_visualization/frontend/src/nodes/map.tsx +++ b/tierkreis_visualization/frontend/src/nodes/map.tsx @@ -172,10 +172,14 @@ export function MapNode({ data: node_data }: NodeProps) { diff --git a/tierkreis_visualization/frontend/src/nodes/types.ts b/tierkreis_visualization/frontend/src/nodes/types.ts index 8cfbd0219..d597b5daa 100644 --- a/tierkreis_visualization/frontend/src/nodes/types.ts +++ b/tierkreis_visualization/frontend/src/nodes/types.ts @@ -29,5 +29,7 @@ export type BackendNode = Node<{ value: string | null; setInfo?: (info: InfoProps) => void; is_expanded: boolean; + isTooltipOpen: boolean; + onTooltipOpenChange: (open: boolean) => void; }>; export type AppNode = BackendNode; From 90ddbe41cd7f66cd0a7c093211b7236ac501f0a6 Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Fri, 12 Sep 2025 15:57:05 +0100 Subject: [PATCH 12/18] Improve visualization docs --- .../source/_static/visualization/Debugging.png | Bin 0 -> 33775 bytes docs/source/_static/visualization/Expanded.png | Bin 0 -> 59794 bytes .../_static/visualization/node_states.png | Bin 0 -> 11307 bytes docs/source/_static/visualization/overview.png | Bin 0 -> 125674 bytes docs/source/visualization.md | 17 ++++++++++++++--- 5 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 docs/source/_static/visualization/Debugging.png create mode 100644 docs/source/_static/visualization/Expanded.png create mode 100644 docs/source/_static/visualization/node_states.png create mode 100644 docs/source/_static/visualization/overview.png diff --git a/docs/source/_static/visualization/Debugging.png b/docs/source/_static/visualization/Debugging.png new file mode 100644 index 0000000000000000000000000000000000000000..a097253532eb8c7106ab2bb990c1101e7d31ae95 GIT binary patch literal 33775 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 IqHGiKA0@e=;Q#;t literal 0 HcmV?d00001 diff --git a/docs/source/_static/visualization/node_states.png b/docs/source/_static/visualization/node_states.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0787bd101694338fb8039fd29691bc143ae752 GIT binary patch literal 11307 zcmbVyWmp^Cw{L(_3KZyzltPgf39dm31Snp-xO?&7EtZh=7^^000mvzLC`g0C3td=ZTLV zV*Vu|GziRq@A}5T0{|c-`}@NJWamD^Ok#OxDo6urCusID7Y}TuRHXobhD5>}3tRwz zqfb#*O4}C;v5KFYJLtE2dcW**`FlkaFSPBS49+-`IF%<+X%EPFqoNTDromm1dXHx+ z^#&{!4M};g@bL{;`l~|+hJjdkcw+q@7f4_9{p9C+G!T!4znUH3?|+Td?iS~gm!2{{ zwp&BqLESn7{N+pb^)9+})OETqM6G2o4+H?rgogY(mXk64eIYdLkL^!)wS(WZ^(ZSjL8_bqz~PA^Hvr%@;YL$q+O6w2U+ZBu?`YsS2QEe*2m3Br z8w^@%ROznnDZ0xVTxdKES=y{WB?ka5oQ_L_L=``+k2b2qGWUTUvy0Y7#MXZaq%j;Z zNBMJ3y}#lF%n&6T{~ceiz8J=c>Ay7*{}Dr1`pKAk)Gb%M=V7Viv8W)*5s>-l@2z+( zN;DNiU-v<|DF{XuqHdSKV>#HRgENddQ;{m&F*)-|Zw6G|6}_=kBDHK5C;$MJj|ic- zxH!8P1$q-qw5R=2%%=W|p*73otmFuig^E{LDL+y2<1Z9>%Qg8cRx}jYysj)MR123O zQ)}s^@1;LK8RibbfBE;}@wD^0$9LVA(x^3G(#+-Vn!Wug8O+fATZvg}F>fU~#9UNf z4`)GicCPRXUPjgN5lC=lrBLWx*HJkZ?L=we^25|^1#gkvgIUKGZ$t+^ z7owUj94k%m{tmAsue12gdn)5G2_rnQC5p~Nyciq)w9sevy{8T-8#-0a#n9TxM!Nzw z$4YCz>|biIe`;nM=c@hQT&~~Ov&@J1`kj?jU$c(#eApc>s?|z2TZA{dZyOjkSpI1% zsJgywR(v7-r|Sz!NUElWsqKWM^PNPR?vOgY&d4Md*=KX!^254&cN3FVWi;5Y*(6>s zz3jOj_w<}vqsRyWn&ln)TkP{ z^{j$HkQ7+G27DlDJ=<}>-{0j&8{i#IPMoswC77Yqw5LTUI-kyZXH3U^4*=BT`82PL?K~9jWtL;a4jdxxdO$NMIXhf zP<`foRJ}q*dBSL<;DgX+)2}Fs@509E%YWmJ1qeAr9Bz!HJzz*VckX_%A!uac5iz1{ z$$XNl|qeGGp;tz&I&{Bk0uRsc%&FV$MKqVddQc8(D7 zq+i&85NN&01Do#vK+DiH`qxBi_i?~CLCTXaYhE!XR3yYdsX(E=4@34pL%*qH)}R(! z6>C?o7@j<8gGX3O4H`>XfGUq(VWCwU1aP%%k83DhcUhE5!jwLTFeH6=?&+Ce`)$D& zHU!RNV>2U2ynFt^^;`48fz?-`U#aATl+m_;%unLWyUFtM@~NZSE9bk*IX|$ptd`Bu zj~<4{3~k}HKv7P~j*`BjdFlLqxT6W)@9-`*U>UzH?{%#qmYStzaTRP?F=Tw<%pR7C zc@md)c}sq66)FZ4VVVMq#jdQfy9-vczI41V^Ee{Nc_2CvyB6%P>N%gQK2H)kzgo*A z(DKR6jQK3b-ke*JKY-R2Xkn)su3)CpVI>FVW0^~Ox59C7Mt09*1}%|afjuZJ6$P)8 z;lm*!Z|F8PiPRCa#obIJrNM&hZ2T z{Rd9+@hdeaRd|SVM4!%8YDpII(0U|jMpQ3}imiOIV)8iq_RZt+?dzIQRfqdQ5zS-W z;jzq45_8}}Wri>bNI%W&h61s7Qz>1Nx-;&S7Vq=(PaovyX{?-2yXEB@`KVi@j;5A$ z2oDjl{Z$x=<6d&?tcB(B#N&Uq@L&q)l~n|g+R4d@sr6O)QQt@ct=Nk7*!eEpXZ>8% z8|ntEXH*i}gY-p!Sg0RyaNut1s_5!gAMw?K%dq*oDx}qA9oe(%g+9vJiRf za8f^Pq`zNRvUJ4II=j^`qy%b3)=MO{B!q5e)Bo{}6s@-j6j0tc*P!I;yOBQX|0| ze#9Pc(&=r#`6U7geBB3WY-;oVILMvT+65`F6(9EEdBdHd{iftX#UWPWe8We@YThu* zq^RPnllUEx3A2$vD zQa@P!{KqA~Xj5AAYiW)BfNw1_^`I4wY;LxbaY>xG>c4C`sulBG|0cZs<1{h~0&Shg z67qj;8Xqhc?wG-%P^5tsWKL$%+0j=E_}v(P)_f?kDBpYy+JAZeS;^X@8TEAfr4VB~ zvAE?JP>aWk%Mg7H_Z-cU)M2%CvC;vX=hY6$dsd!;1ya*jU(_OINp#W^NGCF#fVKoj zH#}U=+BCZN>thC`zYaFhvYB=J*UZ(L>?W2(@A$Aj2=BNKMSGo@_&BV>Y7Bcl%7n7i z62gq90mloDV|q0mNhkvtl+HaPYKe*RgwTk^sc?CIe)n6I9-^si6+SFfIBO=L$$H3R z+HNKm>8+E_#TOoHU~B8S?1j+saV-Bh`2pc;e?Q84(C|;51DM2yA$$H@5agfsvOgj? zvy>Tj%0ZBUmr6a+<|3#GUj8q?)-EZb$64wk*()Vn6Kput?6dcNLIk<|PiIW54(R0L z>cYY!r^TM8`7&jC zh5oKb2?Ynm60Y-J2#bGuz7|kXD}tnnSWZTFyBN1f=(+ftkd%_b!)4e?6bKIdYo~Lg zF_u4gSaFfDZgyg#&cVXA{PR!0LgFRl$Z1>8pI<5duwK3Uz)d;P-2k7x(0G>v6ou_! z6H6YaH9z*Z*-xDu>J?BS{8|%I2jLv-8@qS!229jk>L@P@p{PKh&yf|_yFzZj^Zoph zuT)9g@Ct1@Yrnb*BdO|M-MX)_(B`;J6Z&@epeFLbso1yi6r7w`&J1U-tA)bTtL)pcNTc{3zrh~ut#*9^*11a`?7(4| zZ-pr{feUL&U6&jfPP{CRpQcK0&LrLe&cebq2Wl_db{a2ozKSq^Ja}+JpW2laTFhvF-q6MNd{mRD$>}eNE8{D|^8PiSg zPxC5Ik7~8(7UeP8dLCr3J$Xxyu}K$42ozO0*R)fCZ3%~{5Qrz6N!X}DW?WY=C$z#Nn{*aunxg zjEeUCDf`KRs$jm!dr)AlXsj}Z+$W$J{yP2yqtpIEY0+mVlEN-Ud4L1F;hNwFG#Az! zt&f$KP132Z9)?72&u)0U0RSTpRYI>fftpMmJs)}YvdPrvJfPj8P$ZabNRR{&vVSU- zeE8ua{zRKJtGJUAixknZ_LA+f(cA);&Xo3@CO7D z0r~{$0hsI%0C+3>H|)V2Ug3Wur2l6kz6^5>9CiLkLEL%yCvTGLiV*jl)t!+5koo@G z8+YZ>i)gvxy}cpYVdZx0^M%($>=`O%JQk)4Q3!qFoU%B-MBj&~Dr4?W5?jw*%P88o zvWa}3FE7)^`Nn$gN~fNiYBkiEZA%CJz8hV;VGfl|VThtDEKNz!s4p7t?oM7V*er0? zgmm*fjU{*(K7*#xWlvkN0;66nUv_mcKjx*%pA!vWXh>^c%ADvpsN*e@^RH4kty`_R z(nF@6kL74;$%g1bpgftA-exlaiC5hDT+_~?CQ}}Dinf75h1LZh_IkW_x}Rd@R}A^W z@+M}h<{c1AUY@_pzUoH%YX3o+BCb2dX3+(gtWAG(C?Y#`Mu;m@sZRFz$^(yeOXehN zY43lNP~V(d*%*F#JcEa`(gsb2gmpU1#y7)3V|R2yS*!IH;S;a69&;JNR4&&7c<{Nw zf?24=>FnK3`I$T7QjJIJ*CEpL!Rp(3t?a$_Wx02oBdWVti8EG=2SaLZFFB#7ks;}K z@XR@J`kCwbu%%{YV_z)wS;sQp?UANt%fYjbYh%1LaY#dX<8xuh`OAAbxsz6+0n!)`y1c%7Gc6Ueaf7uUGdb68TM@<=t>9{MT z+5Otg^M}YnDdC8z@%tCI+r1Ax#~9cwuS4Oz7WoK+IM>LigBGngdjeb?rIHyBI23r= z%#t7ObJj5I={zq_v~pj*q?`Y;L_r@0mI~l0sKM)TEQrr>=`j#q^-M_+*?A_%@Q?WY z%{daZQ8J7%*zjKo&@s_v)H_0g0+=l0{jobm3g7wDZVO-doKGiH*_!BJQ0(qzTv1{H zVlNGkKYQNv$s(7HwD>m=_z7`U@Oa9OoN3zPTzJLN#2#_)O*6sj>Q0@lpdsVA2^vy7 zZ4W)NqMzod>nij+-@(tsPq8mJ3`ko4@gZinTX|4+tZU+XLnj$_x#G6OzA`-z$BdNBpoP-%rlTwm^5$jp_tTEGKYWaGsUCvY3LA zkrCU*2x>;;Y!q%e%+zMjw}mq!bV(W@=C{lNc-0mrwe53}Nl7)nBWj@_wJqerrzocw zVzyw=;t*zZOP%Qina2hITwh=*lx$Xvsp0BO)yM4gLcP#3$nGD&9`z4aL9kRsJ!j?z zfCZkvsceW_>dGpZ1tdeEEhVGG2`w+dGMDlSi@>=X;*k&y3aR$h^9-E(#rjMOZL-rn9Ko4RYB@ETFG43BT8iCi*8NHnXI zFz&RQ;goAIPR(ZQcy7zd<@FRBFP@MCYzzzxaCf~bZp(!F1wn0kH$1}qX^IxgHr_s) z;UsK+cg#q~fc53638$r?0XG6VpX#04+k0V99}{jlRL>0BQrmT=#AViF+y}AG-5$y6 zQrgY0HfCZavR$o12=W0O)Q5lL@Z6XC{llgtlU9dw#0xM_PgCW8E@@GL_Mbn#sa14E zAcqGhkL4%=*8|8!PhX`4y|blKaxTnSzDsXxh3ajR+{c6%>anMJ{@KnrKJ^NDNZs_w zE!jBdN9nkyy8qZbz#)0rlo)v-2)L5sK9s<PUB@rtk*pc@noizvx3({h_8 z*6A>l+E!^?_P>*h3A|1j3EcGtdSLZ2{sjeRL^?g^knRoz2pkYI6HCf0>T3q8>mCE` z+0;33aJ)U*`E||GAF+b@@7G?yZl_wNHu}2{hR5wjS-n^39rwQy$Ix71tr(X;PB0Vj zsoyvI*VKnXjae&3C2$dD0E;CQ{a+`5bR0`<+}9t}rrVo?$tiHue`o68>9yPO2;WKK z8(Is5#toM;3BJuZtfVc1$`}1L&-=)cSxo$&-6vC2J|v&&D_>MOuf|7Q zs#Iuna6E~UNzgq56_i8X=+GcC<-W342kTbg>7{H;@ETnn*4#}?6ltiILQw+4%-?^M zW8!Y+{K@hIzI;BYTHjps@K{*JO35fSmF|7(y-lKO353m?&E(B^wrAMk1Ml_HNAc0; zWYn|omTZxKgA3OegUMmzimG=uFw|3Nsp-WS`VBOht&1YLgER9mZirj`-@VlrN*)_C zmS+XjAj^hW9?%Z0mWcTOvUC=F0NDB$V|}LZf?DHdpai2&rKV(?rC*|z3(*RSezlvp zAvpg6na|X@%YNA(^A9`6W@(J?Z2&tG6y2tkxFuzh-e;+D!{;FUfSHE{OzkTZfV*!~ zyr0&7AkC9UtZ}iiT5hl9G+8%+c_6by$e|W*u%6Osikg<{bZ2gWvi=&QAg!(@!T~{vf+wI)#naSOLr}ZMcSO^2@*O zOfIcdto{CEFVaPik6SvfJu5d(TRLwMW%=FnvVWky{_|2PS97eklLe@yPn6X=WOe z&ry7!%uaY$XN$7q!+_#PirhEf+{Cz)mq~OcnA$a1q{ACB8cvTMFtD?vf2Z=(3^Ai1 zEz9Q146A6h_(`SpwBBpTw9JuovQbsOd(3^PR_IfLWem!$VBDiZ+g%SA5QIU1yyutq zVelr=`JXliYOj0w;c;Q<3&ivi+T3i^E_3+fgex_YdryuF;%x&chdj@)Ykl5JF8Wg? zMKZE*(0u;~eiEm3D``{)_Iq@q;$;JQ_f9sXpk&%U;_KSu*Kq&j95zbN{=yUlC3YZ- zWMM1`G{dsLUiu}y@fW0(P(EX5T%-}Vbp`)Tg`Iq~*o5X{G=~Zp$L@(UnkKpp|G|dd zpTIQ}C-W3zo-so`&r5Ajrt-m4wLG7z&JxakyaF}~uki+3`+>*bv{Q_2g4ZyK3Li*W zh*VTFVgiIP;Q_4g=bV=jh%ge6!U5EMNR-G^j}+rh8uF8(o*s$TIujF3v+2<^1P?ut zf`Ine0bK1`Fd#IR7Z*A8*5k;sbUHmwNj0gJ{__iEg|Yz}xQY@bUAHkyi|1nO&}z~T z00%K@^qa>knzU#;FL-aeyZ2|LYP>jwP?kcDUvr#<;Wlz+=w%+mbREZ-n97*K(Kf9WSz^h;EAj9APzF`ctT8y|3 zXE_$g>r|Ue%XtxySt#Wb^5VC2qGA48#Se2`f`5Swan&(zqX@TuA=_*cR6pKZvH>|k%1a*OI zGP$cUw;od1R%XxfPZqs=L}cO_mzBk-O=?0DBH}&RB@%>t3)yZF?eNRrr-@pL?C1Xc z$*L6ivqjkRbg*D95>o>LKNa?3 zhxF)aN)+hy{qFAd9M`!%n6IS(4guS;ROD-FYA`5qehWMwb^;?^AdIYv-}kL7Qbv7U zU@GJ(m|HKne%|qJm?w+amkW!Xf23pMjkwHabk8nS zTDv6lTIuLH6Q>EWzriGuIb|)oK^n@2Ps`0otT}~{Q}{;f2rur7W^HTHQ<_8;ayB1F zk9iX9J<)j@Jw6*R0P-`R-#{#n^6~Y}@KPH`b%ckKgKBzeT*hoNYgJK8IV?T7CuoQP zdRArPEFI^zpbQ_gue)483zAAq=3;xq2-$&`uZ;hLYYCqw1T7{!;bjaptiRW98D6c_ z5uTDbb}raLLKf$0j8@}=T+L@6TnC8+?62e3vX@1`7e6&&Q3@9ghX46z^)z4oAg2ua zB{z#-)4PqIBU*g%FeBEQ>jni%LlZ6!coz%}Kd@CWo@9Zs!*;kp3~)K<@w>#5eWEh7 zr^+rvx9gghXo+>wRB04=l4=E$c$GbeE0V#Jra}}w?`8HG>#A-5Xp^H9@h%Y%N5Gob z5C;ucXEfrja_WnS+^X9>&8oMa*0!NZSIYSK(H9EP+ZIGyh9J3LLALaMWP&Z)K(`jG z%%RI!aJB1xjAKN)VFY7O1U<9*uY@sH41p5K^0akpg)Dwa7~QHL8lMO$@L5x!z#m$* zYVGyd3&V{%ND#X-XkA4mehFQa%63|YwQ~?=XJ^|KLs6dXXKQk*0wIhrPs_rXYkv{lcN5YB@+G( zn!5#M39sudxMfZ%p)d@l2XxS@_VV^_4D^$9?!BeI_ydP(obPZw6K-cGkBP~QF4Hr+ zMl`Nda=AMD?_HNKi)v_c!xZ|tBhYkXmnV3 zZ?B7pSj%aN3}HAoS3;KJap4%NHn*Rrkag!~a61^+Y0O}uc7=N9a=0x^J?4M(IDiV? zKlZ6{TVyG4?>2^OrFvk)B&Im1@D0jKBuiKYs%=#lBk=O3TVaQ7Qak_ct0>j5&Th$K z+j%knxjAy0ijeUS2CYQ0TALR&X}r1TQT_ITknpBI}EH>j@BpP2?` zN=J-v2Qpc2E!(0Y$wWDOOF^x97LGG%oam{ksp@&tfUh(~(TGp>i6*S%lU9impSLn- zDtdab1lf&(E9VpS4wGrY705#HG@_}_o1u~}9|PeU=f( z?)P8l-ZzMSM~E~0C_kb`6(xuoCrVs{m{YdyK}%a{!i;&xqSh5+VV14?&hKD!@w6gK zXu&Q_!TIqiSbU(VwK6XuGkUzIC{a^+9{X}hA!6|}y@bVboTq#RD4k<(B3I`Ccq-x6 z3@4L8gTi8;l91Nw$-s%D-o|hVFH*>T}@mr zdNN>x^jr(WOk&B_g|=G%!qaCvye5ff2Nr6Tk;-Y}9|?o3?W~nK1`mC`JDRI;IhZ)U zE#mGx`VvW>wZ()~9{`<#DF)8RTzSYwcGIY-HAlua=uj-dwSA?knp$MTi|-bxPRw5~ z<4rFKCTq-eNi+*qwB=R?&+C79Ju5(L$bG%O6o&0ZQm)UOcZaiQF^ze5E~)$sm@M?W{??f=o7g?I;LBl)XeK_^F5Z+BnU4+O~C6d4%;^OjgC{#3HIRF zV`u&(*W(6*)tApQ6`SELQB19BaYQ|31%7HnJR)Ftl=N}S<>?|?}YwvW|mxXWBd-nM3QM0@NI>7)dz_# zPWsjzbt|@jW9vdDz+dP-FMR>MDLRlmeK0u9=)jL(o7Zoh#ZN4>w7b-Q3pf~9_@qQq zHftrnNFwsCU#thO@BV}B)!+hEqpVg6HgNNMCX>(k5RcZ)QPT|SgfT|Edu{d69wK00 z$hYx1{$Z(}5W59w{b|Dc+n_4NIl6_(A}%AJ{f}=$`mrx*cH45i(h|fCD@eHYjvGq| zGQTF%471vh8h2VD7SIrEJVJyA;>B={jQ1ZkQE^T{OQP>LNEN0Ih2D*H7m47f+BP(7 zzDbN}N-w))oY5;=-$&-~!HQO;Owm8j9)PnJ0MMtgOCUC)(t=;hn*2N$(6f`Q2P zgXd~h7FjYo7HHimrUib_KWbOs&M@S<|(caFy_1 zR+OQW%j?=?M8bb~73;d4eU6GI1?9eGOSWpcbTtg;xzVU^qZp?&2zOXFA5aH<>}$Ai z^yD3+du{};ta?-l5261dfqt&&Op9rC&@x*OSzi2vfi$0=K9;PQ_!O@yR2f~3SQ^f8Y%*$;;=ym=-0E-Xz60f-vavC3h@yU|rKwtVFAwvNH-ykt=@&m_64mzM$0l>xf+YKQX!p8-*Q@~$F$DzQ_YVH-&dg5WP^???o3+@=R6l5 z%%{ttjdQFgCA8+WN6!R?p`DvXyB3TGy^ZYgdtaxyN6*fF8F7u~KY7X{p<)DsU|Kgu zkL3(nB7F0~KeHNdMuO5wpmq_u)%r-q-RZ-|3Glh6`iSV|3dn0h#MbxB#n$$&wiBtG zA|bp$-|7~CXfgZY6?_%7)aaEG8L8Q6JB47(7<_w@5p z{U&q2WahtZogr+EIWJee=EXa%ex3t84|&JH|CTWT<}uQrKc@2p*I`=h^iS~qGl?mc mX8n)5LjM^)ZYn(JG0%{|vQ=j64ysXi~a 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 literal 0 HcmV?d00001 diff --git a/docs/source/visualization.md b/docs/source/visualization.md index a98560791..2367e6ea1 100644 --- a/docs/source/visualization.md +++ b/docs/source/visualization.md @@ -45,6 +45,7 @@ This is very helpful during development, but currently does not provide a hot re ## Usage The visualizer provides plenty information about the graphs in the system. +![visualizer overview](./_static/visualization/overview.png) ### General Functionality @@ -54,6 +55,8 @@ At the bottom left of the main view there are three control buttons from top to - Centering the view - Hiding the navigation bar - Recalculation the graph layout +- Reset Local storage, sometimes graph changes are not update correctly, clearing the storage and reloading resets the view +- Showing/Hiding all node ports ### Available Graphs @@ -62,22 +65,25 @@ Available graphs are listed in the sidebar by their name. ### Node Types The visualizer will show the different node types with their heading. -Tasks will be displayed by their function names and constant values have their values attached. +Tasks will be displayed by their function names and constant values, inputs and outputs have their values attached. ### Node Status The node status is indicated by the border color of the nodes: -- White/No border: Node has not been started yet +![node state example](./_static/visualization/node_states.png) + - Yellow: Node is currently running - Green: Node is finished - Red: An error has occurred in the node (or one of its nested nodes) +- White/No border: Node has not been started yet ### Ports & Values -Inputs and outputs of nodes are indicated by black circles (ports) on the nodes border. +Inputs and outputs of nodes are indicated by black circles (handles) on the nodes border. Inputs are at the top, outputs at the bottom. Hovering a port will show the port name. +By using the control button, all ports can be shown simultaneously. The values in a graph are only visible once the graph has run, indicated on the edges connecting a port. Small values will be displayed, larger values are truncated with a `{}` symbol. Hovering the symbol shows the entire value in json format. @@ -87,12 +93,17 @@ The graph symbol indicates a value is a constant subgraph supplied as a nested g The higher order nodes `eval`, `map`, and `loop` can be expanded by pressing the `+` button. This will show their nested structure. + +![node state example](./_static/visualization/Expanded.png) For `eval` nodes this will immediately be the nested graph; For `map`/`loop` nodes this will show the individual elements/iterations which each contain their own subgraph. For unevaluated graphs, this will only show a placeholder evaluation. +To hide the graph again use the `-` button at the top right. ### Logs & Errors Logs can be accessed by double-clicking a node. If an error has occurred on a node, it will have a `!` button. Pressing it will show the error information. + +![error logs](./_static/visualization/Debugging.png) From d79a467e77d90323fff74e858faa80b99b5c24a7 Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Fri, 12 Sep 2025 17:03:09 +0100 Subject: [PATCH 13/18] Add start/finish times to storage --- .../controller/storage/filestorage.py | 14 +++++++++++++ .../tierkreis/controller/storage/graphdata.py | 6 ++++++ .../tierkreis/controller/storage/in_memory.py | 14 +++++++++++++ .../tierkreis/controller/storage/protocol.py | 20 +++++++++++++++++++ 4 files changed, 54 insertions(+) diff --git a/tierkreis/tierkreis/controller/storage/filestorage.py b/tierkreis/tierkreis/controller/storage/filestorage.py index 88be4222a..9e07ce934 100644 --- a/tierkreis/tierkreis/controller/storage/filestorage.py +++ b/tierkreis/tierkreis/controller/storage/filestorage.py @@ -217,3 +217,17 @@ def write_metadata(self, node_location: Loc) -> None: def read_metadata(self, node_location: Loc) -> dict[str, Any]: with open(self._metadata_path(node_location)) as fh: return json.load(fh) + + def read_started_time(self, node_location: Loc) -> str | None: + node_def = Path(self._nodedef_path(node_location)) + if not node_def.exists(): + return None + since_epoch = node_def.stat().st_mtime + return datetime.fromtimestamp(since_epoch).strftime("%Y-%m-%d %H:%M:%S") + + def read_finished_time(self, node_location: Loc) -> str | None: + done = Path(self._done_path(node_location)) + if not done.exists(): + return None + since_epoch = done.stat().st_mtime + return datetime.fromtimestamp(since_epoch).strftime("%Y-%m-%d %H:%M:%S") diff --git a/tierkreis/tierkreis/controller/storage/graphdata.py b/tierkreis/tierkreis/controller/storage/graphdata.py index a58ba6400..51bef9169 100644 --- a/tierkreis/tierkreis/controller/storage/graphdata.py +++ b/tierkreis/tierkreis/controller/storage/graphdata.py @@ -114,6 +114,12 @@ def read_metadata(self, node_location: Loc) -> dict[str, Any]: def write_metadata(self, node_location: Loc) -> None: raise NotImplementedError("GraphDataStorage is read only storage.") + def read_started_time(self, node_location: Loc) -> str | None: + return None + + def read_finished_time(self, node_location: Loc) -> str | None: + return None + def _build_node_outputs(node: NodeDef) -> dict[PortID, None | bytes]: outputs: dict[PortID, None | bytes] = {val: None for val in node.outputs} diff --git a/tierkreis/tierkreis/controller/storage/in_memory.py b/tierkreis/tierkreis/controller/storage/in_memory.py index 21a3a1ac4..af97d55cc 100644 --- a/tierkreis/tierkreis/controller/storage/in_memory.py +++ b/tierkreis/tierkreis/controller/storage/in_memory.py @@ -29,6 +29,8 @@ class NodeData(BaseModel): metadata: dict[str, Any] = Field(default_factory=dict) error_logs: str = "" outputs: dict[PortID, bytes | None] = Field(default_factory=dict) + started: str | None = None + finished: str | None = None class ControllerInMemoryStorage: @@ -72,6 +74,9 @@ def path_to_loc(self, path: Path) -> tuple[Loc, PortID | None]: def write_node_def(self, node_location: Loc, node: NodeDef) -> None: self.nodes[self.loc_to_path(node_location)].definition = node + self.nodes[self.loc_to_path(node_location)].started = datetime.now().strftime( + "%Y-%m-%d %H:%M:%S" + ) def read_node_def(self, node_location: Loc) -> NodeDef: if result := self.nodes[self.loc_to_path(node_location)].definition: @@ -126,6 +131,9 @@ def write_node_errors(self, node_location: Loc, error_logs: str) -> None: def mark_node_finished(self, node_location: Loc) -> None: self.nodes[self.loc_to_path(node_location)].is_done = True + self.nodes[self.loc_to_path(node_location)].finished = datetime.now().strftime( + "%Y-%m-%d %H:%M:%S" + ) def is_node_finished(self, node_location: Loc) -> bool: return self.nodes[self.loc_to_path(node_location)].is_done @@ -176,6 +184,12 @@ def write_metadata(self, node_location: Loc) -> None: "start_time": datetime.now().isoformat(), } + def read_started_time(self, node_location: Loc) -> str | None: + return self.nodes[self.loc_to_path(node_location)].started + + def read_finished_time(self, node_location: Loc) -> str | None: + return self.nodes[self.loc_to_path(node_location)].finished + def clean_graph_files(self) -> None: uid = os.getuid() tmp_dir = Path(f"/tmp/{uid}/tierkreis/archive/{time_ns()}") diff --git a/tierkreis/tierkreis/controller/storage/protocol.py b/tierkreis/tierkreis/controller/storage/protocol.py index 0867a0f2f..68f637d83 100644 --- a/tierkreis/tierkreis/controller/storage/protocol.py +++ b/tierkreis/tierkreis/controller/storage/protocol.py @@ -239,3 +239,23 @@ def write_metadata(self, node_location: Loc) -> None: :type node_location: Loc """ ... + + def read_started_time(self, node_location: Loc) -> str | None: + """Reads the start time of a node + + :param node_location: The location of the node + :type node_location: Loc + :return: A time string when node has started, else None. + :rtype: str | None + """ + ... + + def read_finished_time(self, node_location: Loc) -> str | None: + """Reads the finish time of a node + + :param node_location: The location of the node + :type node_location: Loc + :return: A time string when node is completed, else None. + :rtype: str | None + """ + ... From 7312c0a9abcc00f25b37120542493317bc99d288 Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Fri, 12 Sep 2025 17:03:47 +0100 Subject: [PATCH 14/18] Display time information in nodes --- .../frontend/src/graph/parseGraph.ts | 2 + .../frontend/src/nodes/default.tsx | 45 ++++++++++------ .../frontend/src/nodes/eval.tsx | 53 +++++++++++++------ .../frontend/src/nodes/map.tsx | 23 +++++++- .../frontend/src/nodes/types.ts | 4 ++ .../tierkreis_visualization/data/eval.py | 4 ++ .../tierkreis_visualization/data/models.py | 2 + 7 files changed, 99 insertions(+), 34 deletions(-) diff --git a/tierkreis_visualization/frontend/src/graph/parseGraph.ts b/tierkreis_visualization/frontend/src/graph/parseGraph.ts index 5f5d353ce..eb958ef51 100644 --- a/tierkreis_visualization/frontend/src/graph/parseGraph.ts +++ b/tierkreis_visualization/frontend/src/graph/parseGraph.ts @@ -109,6 +109,8 @@ export function parseNodes( is_expanded: false, isTooltipOpen: false, onTooltipOpenChange: () => {}, + started_time: node.started_time, + finished_time: node.finished_time, }, parentId: parentId ? `${parentId}` : undefined, })); diff --git a/tierkreis_visualization/frontend/src/nodes/default.tsx b/tierkreis_visualization/frontend/src/nodes/default.tsx index e9fc66853..55987c694 100644 --- a/tierkreis_visualization/frontend/src/nodes/default.tsx +++ b/tierkreis_visualization/frontend/src/nodes/default.tsx @@ -71,6 +71,23 @@ export function DefaultNode({ data }: NodeProps) { isOpen={data.isTooltipOpen} onOpenChange={data.onTooltipOpenChange} /> +

+ {data.status == "Error" && ( + + )} +
) { onOpenChange={data.onTooltipOpenChange} /> - - {data.status == "Error" && ( - - )} + + + Started: {data.started_time}

+ {data.finished_time != "" && ( + + Finished: {data.finished_time} + + )} +
diff --git a/tierkreis_visualization/frontend/src/nodes/eval.tsx b/tierkreis_visualization/frontend/src/nodes/eval.tsx index d5e2a512c..7b24bc970 100644 --- a/tierkreis_visualization/frontend/src/nodes/eval.tsx +++ b/tierkreis_visualization/frontend/src/nodes/eval.tsx @@ -1,4 +1,10 @@ -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { + Card, + CardContent, + CardFooter, + CardHeader, + CardTitle, +} from "@/components/ui/card"; import { Edge, getOutgoers, type NodeProps, useReactFlow } from "@xyflow/react"; import { InputHandleArray, OutputHandleArray } from "@/components/handles"; @@ -190,27 +196,17 @@ export function EvalNode({ data: node_data }: NodeProps) { return ( - + - {node_data.title} + + {node_data.title} + - - -
{node_data.status != "Not started" && ( )}
+ +
+ + + Started: {node_data.started_time}

+ {node_data.finished_time != "" && ( + + Finished: {node_data.finished_time} + + )} +
+
); diff --git a/tierkreis_visualization/frontend/src/nodes/map.tsx b/tierkreis_visualization/frontend/src/nodes/map.tsx index 06dbed067..2e7b7a054 100644 --- a/tierkreis_visualization/frontend/src/nodes/map.tsx +++ b/tierkreis_visualization/frontend/src/nodes/map.tsx @@ -1,4 +1,10 @@ -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { + Card, + CardContent, + CardFooter, + CardHeader, + CardTitle, +} from "@/components/ui/card"; import { Edge, useReactFlow, type NodeProps } from "@xyflow/react"; import { InputHandleArray, OutputHandleArray } from "@/components/handles"; @@ -148,7 +154,7 @@ export function MapNode({ data: node_data }: NodeProps) { return ( {} - + {node_data.title} @@ -182,6 +188,19 @@ export function MapNode({ data: node_data }: NodeProps) { onOpenChange={node_data.onTooltipOpenChange} /> + + + Started: {node_data.started_time}

+ {node_data.finished_time != "" && ( + + Finished: {node_data.finished_time} + + )} +
+
); diff --git a/tierkreis_visualization/frontend/src/nodes/types.ts b/tierkreis_visualization/frontend/src/nodes/types.ts index d597b5daa..641750395 100644 --- a/tierkreis_visualization/frontend/src/nodes/types.ts +++ b/tierkreis_visualization/frontend/src/nodes/types.ts @@ -7,6 +7,8 @@ export type PyNode = { function_name: string; node_location: string; value?: unknown; + started_time: string; + finished_time: string; }; export type BackendNode = Node<{ name: string; @@ -31,5 +33,7 @@ export type BackendNode = Node<{ is_expanded: boolean; isTooltipOpen: boolean; onTooltipOpenChange: (open: boolean) => void; + started_time: string; + finished_time: string; }>; export type AppNode = BackendNode; diff --git a/tierkreis_visualization/tierkreis_visualization/data/eval.py b/tierkreis_visualization/tierkreis_visualization/data/eval.py index 20fc5e05b..71f312503 100644 --- a/tierkreis_visualization/tierkreis_visualization/data/eval.py +++ b/tierkreis_visualization/tierkreis_visualization/data/eval.py @@ -85,6 +85,8 @@ def get_eval_node( definition = None status = node_status(is_finished, definition, has_error) + started_time = storage.read_started_time(new_location) or "" + finished_time = storage.read_finished_time(new_location) or "" value: str | None = None match node.type: case "function": @@ -117,6 +119,8 @@ def get_eval_node( function_name=name, node_location=new_location, value=value, + started_time=started_time, + finished_time=finished_time, ) pynodes.append(pynode) diff --git a/tierkreis_visualization/tierkreis_visualization/data/models.py b/tierkreis_visualization/tierkreis_visualization/data/models.py index 0e7d0be28..36750d8d2 100644 --- a/tierkreis_visualization/tierkreis_visualization/data/models.py +++ b/tierkreis_visualization/tierkreis_visualization/data/models.py @@ -10,6 +10,8 @@ class PyNode(BaseModel): function_name: str node_location: str = "" value: Any | None = None + started_time: str + finished_time: str class PyEdge(BaseModel): From 82ac3b2e37385fd4a407777bd8d330d2ff5993a4 Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Fri, 12 Sep 2025 17:08:56 +0100 Subject: [PATCH 15/18] Add time information to loop and map --- .../tierkreis_visualization/data/loop.py | 9 ++++++++- .../tierkreis_visualization/data/map.py | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/tierkreis_visualization/tierkreis_visualization/data/loop.py b/tierkreis_visualization/tierkreis_visualization/data/loop.py index 06bcd4775..6007d00c2 100644 --- a/tierkreis_visualization/tierkreis_visualization/data/loop.py +++ b/tierkreis_visualization/tierkreis_visualization/data/loop.py @@ -27,6 +27,8 @@ def get_loop_node( status="Finished", function_name=f"L{n}", node_location=node_location.L(n), + started_time=storage.read_started_time(node_location.L(n)) or "", + finished_time=storage.read_finished_time(node_location.L(n)) or "", ) for n in range(i) ] @@ -39,7 +41,12 @@ def get_loop_node( last_status = "Started" nodes.append( PyNode( - id=i, status=last_status, function_name=f"L{i}", node_location=new_location + id=i, + status=last_status, + function_name=f"L{i}", + node_location=new_location, + started_time=storage.read_started_time(new_location) or "", + finished_time=storage.read_finished_time(new_location) or "", ) ) edges = [] diff --git a/tierkreis_visualization/tierkreis_visualization/data/map.py b/tierkreis_visualization/tierkreis_visualization/data/map.py index b77a1eb66..94cb2bb75 100644 --- a/tierkreis_visualization/tierkreis_visualization/data/map.py +++ b/tierkreis_visualization/tierkreis_visualization/data/map.py @@ -24,7 +24,14 @@ def get_map_node( map_eles = outputs_iter(storage, parent.N(first_ref[0])) nodes: list[PyNode] = [] for i, ele in map_eles: - node = PyNode(id=i, status="Started", function_name=ele, node_location=loc.M(i)) + node = PyNode( + id=i, + status="Started", + function_name=ele, + node_location=loc.M(i), + started_time=storage.read_started_time(loc.M(i)) or "", + finished_time=storage.read_finished_time(loc.M(i)) or "", + ) if check_error(loc.M(i), errored_nodes): node.status = "Error" elif storage.is_node_finished(loc.M(i)): From 8544b126b44412949d4f416346a0f29002bf683f Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Wed, 17 Sep 2025 09:43:49 +0900 Subject: [PATCH 16/18] Add suggestions --- tierkreis/tierkreis/controller/storage/filestorage.py | 5 ++--- tierkreis/tierkreis/controller/storage/in_memory.py | 10 ++++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/tierkreis/tierkreis/controller/storage/filestorage.py b/tierkreis/tierkreis/controller/storage/filestorage.py index 9e07ce934..0cdec1a36 100644 --- a/tierkreis/tierkreis/controller/storage/filestorage.py +++ b/tierkreis/tierkreis/controller/storage/filestorage.py @@ -170,7 +170,6 @@ def read_output(self, node_location: Loc, output_name: PortID) -> bytes: def read_errors(self, node_location: Loc) -> str: if not self._error_logs_path(node_location).exists(): if self._error_path(node_location).exists(): - print(self._error_path(node_location)) with open(self._error_path(node_location), "r") as fh: return fh.read() return "" @@ -223,11 +222,11 @@ def read_started_time(self, node_location: Loc) -> str | None: if not node_def.exists(): return None since_epoch = node_def.stat().st_mtime - return datetime.fromtimestamp(since_epoch).strftime("%Y-%m-%d %H:%M:%S") + return datetime.fromtimestamp(since_epoch).isoformat() def read_finished_time(self, node_location: Loc) -> str | None: done = Path(self._done_path(node_location)) if not done.exists(): return None since_epoch = done.stat().st_mtime - return datetime.fromtimestamp(since_epoch).strftime("%Y-%m-%d %H:%M:%S") + return datetime.fromtimestamp(since_epoch).isoformat() diff --git a/tierkreis/tierkreis/controller/storage/in_memory.py b/tierkreis/tierkreis/controller/storage/in_memory.py index af97d55cc..89339e952 100644 --- a/tierkreis/tierkreis/controller/storage/in_memory.py +++ b/tierkreis/tierkreis/controller/storage/in_memory.py @@ -74,9 +74,7 @@ def path_to_loc(self, path: Path) -> tuple[Loc, PortID | None]: def write_node_def(self, node_location: Loc, node: NodeDef) -> None: self.nodes[self.loc_to_path(node_location)].definition = node - self.nodes[self.loc_to_path(node_location)].started = datetime.now().strftime( - "%Y-%m-%d %H:%M:%S" - ) + self.nodes[self.loc_to_path(node_location)].started = datetime.now().isoformat() def read_node_def(self, node_location: Loc) -> NodeDef: if result := self.nodes[self.loc_to_path(node_location)].definition: @@ -131,9 +129,9 @@ def write_node_errors(self, node_location: Loc, error_logs: str) -> None: def mark_node_finished(self, node_location: Loc) -> None: self.nodes[self.loc_to_path(node_location)].is_done = True - self.nodes[self.loc_to_path(node_location)].finished = datetime.now().strftime( - "%Y-%m-%d %H:%M:%S" - ) + self.nodes[ + self.loc_to_path(node_location) + ].finished = datetime.now().isoformat() def is_node_finished(self, node_location: Loc) -> bool: return self.nodes[self.loc_to_path(node_location)].is_done From b2341098548231463d962a0f24aee4da0136c9f9 Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Wed, 17 Sep 2025 09:45:04 +0900 Subject: [PATCH 17/18] Remove timestamps for now --- .../frontend/src/nodes/default.tsx | 11 +---------- tierkreis_visualization/frontend/src/nodes/eval.tsx | 11 +---------- tierkreis_visualization/frontend/src/nodes/map.tsx | 11 +---------- 3 files changed, 3 insertions(+), 30 deletions(-) diff --git a/tierkreis_visualization/frontend/src/nodes/default.tsx b/tierkreis_visualization/frontend/src/nodes/default.tsx index 55987c694..cf2935715 100644 --- a/tierkreis_visualization/frontend/src/nodes/default.tsx +++ b/tierkreis_visualization/frontend/src/nodes/default.tsx @@ -98,16 +98,7 @@ export function DefaultNode({ data }: NodeProps) { - - Started: {data.started_time}

- {data.finished_time != "" && ( - - Finished: {data.finished_time} - - )} -
-
+ >
diff --git a/tierkreis_visualization/frontend/src/nodes/eval.tsx b/tierkreis_visualization/frontend/src/nodes/eval.tsx index 7b24bc970..5df2ba52a 100644 --- a/tierkreis_visualization/frontend/src/nodes/eval.tsx +++ b/tierkreis_visualization/frontend/src/nodes/eval.tsx @@ -237,16 +237,7 @@ export function EvalNode({ data: node_data }: NodeProps) { - - Started: {node_data.started_time}

- {node_data.finished_time != "" && ( - - Finished: {node_data.finished_time} - - )} -
-
+ > ); diff --git a/tierkreis_visualization/frontend/src/nodes/map.tsx b/tierkreis_visualization/frontend/src/nodes/map.tsx index 2e7b7a054..4127f1b9f 100644 --- a/tierkreis_visualization/frontend/src/nodes/map.tsx +++ b/tierkreis_visualization/frontend/src/nodes/map.tsx @@ -191,16 +191,7 @@ export function MapNode({ data: node_data }: NodeProps) { - - Started: {node_data.started_time}

- {node_data.finished_time != "" && ( - - Finished: {node_data.finished_time} - - )} -
-
+ > ); From ff8cd520cafdbb02b522542d36585d78d000b861 Mon Sep 17 00:00:00 2001 From: Philipp Seitz Date: Wed, 17 Sep 2025 09:49:44 +0900 Subject: [PATCH 18/18] Fix docs --- docs/source/visualization.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/source/visualization.md b/docs/source/visualization.md index 2367e6ea1..a1f0cf41b 100644 --- a/docs/source/visualization.md +++ b/docs/source/visualization.md @@ -23,20 +23,20 @@ The visualizer is browser based and can be accessed at: Programmatically the server can be run from python -```python -import tierkreis-visualization +```py +from tierkreis_visualization.main import start -tierkreis_visualziation.main.start() +start() ``` Alternatively in you can use `visualize_graph` ```py from tierkreis.builder import GraphBuilder -import tierkreis-visualization +from tierkreis_visualization.main import visualize_graph graph = GraphBuilder() -tierkreis_visualziation.main.visualize_graph(graph.get_data()) +visualize_graph(graph.get_data()) ``` which can also visualize partial graphs.