diff --git a/package-lock.json b/package-lock.json index af98b475dd11746a824d1fa77f691e60a6f2bca1..1fe3af397badfcb4ff58f4434b75e8c413a1717e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,7 @@ "requires": true, "packages": { "": { - "version": "0.10.0", + "version": "0.10.1", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -31,6 +31,7 @@ "@uppy/xhr-upload": "^3.3.2", "@xterm/addon-fit": "^0.10.0", "@xterm/xterm": "^5.5.0", + "@xyflow/react": "^12.4.4", "chokidar": "^4.0.3", "command-exists": "^1.2.9", "dayjs": "^1.11.11", @@ -4879,12 +4880,30 @@ "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", "license": "MIT" }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, "node_modules/@types/d3-format": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.4.5.tgz", "integrity": "sha512-mLxrC1MSWupOSncXN/HOlWUAAIffAEBaI4+PKy2uMPsKe4FNZlk7qrbTjmzJXITQQqBHivaks4Td18azgqnotA==", "license": "MIT" }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, "node_modules/@types/d3-path": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", @@ -4906,6 +4925,12 @@ "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", "license": "MIT" }, + "node_modules/@types/d3-selection": { + "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==", + "license": "MIT" + }, "node_modules/@types/d3-shape": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", @@ -4927,6 +4952,25 @@ "integrity": "sha512-xdDXbpVO74EvadI3UDxjxTdR6QIxm1FKzEA/+F8tL4GWWUg/hgvBqf6chql64U5A9ZUGWo7pEu4eNlyLwbKdhg==", "license": "MIT" }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "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==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -6059,6 +6103,36 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/@xyflow/react": { + "version": "12.4.4", + "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.4.4.tgz", + "integrity": "sha512-9RZ9dgKZNJOlbrXXST5HPb5TcXPOIDGondjwcjDro44OQRPl1E0ZRPTeWPGaQtVjbg4WpR4BUYwOeshNI2TuVg==", + "license": "MIT", + "dependencies": { + "@xyflow/system": "0.0.52", + "classcat": "^5.0.3", + "zustand": "^4.4.0" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@xyflow/system": { + "version": "0.0.52", + "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.52.tgz", + "integrity": "sha512-pJBMaoh/GEebIABWEIxAai0yf57dm+kH7J/Br+LnLFPuJL87Fhcmm4KFWd/bCUy/kCWUg+2/yFAGY0AUHRPOnQ==", + "license": "MIT", + "dependencies": { + "@types/d3-drag": "^3.0.7", + "@types/d3-selection": "^3.0.10", + "@types/d3-transition": "^3.0.8", + "@types/d3-zoom": "^3.0.8", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0" + } + }, "node_modules/7zip-bin": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", @@ -7777,6 +7851,12 @@ "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", "dev": true }, + "node_modules/classcat": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==", + "license": "MIT" + }, "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", @@ -8794,6 +8874,37 @@ "node": ">=12" } }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, "node_modules/d3-format": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", @@ -8862,6 +8973,15 @@ "node": ">=12" } }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/d3-shape": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", @@ -8889,6 +9009,50 @@ "d3-time": "1 - 2" } }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -22871,6 +23035,34 @@ "node": ">= 10" } }, + "node_modules/zustand": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.6.tgz", + "integrity": "sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", @@ -22881,4 +23073,4 @@ } } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 66399fd8d15181b3426a6c0eeb4ed39437778153..41ca009b797c3fd5274da281e75adcf9ffcdeb54 100644 --- a/package.json +++ b/package.json @@ -111,6 +111,7 @@ "@uppy/xhr-upload": "^3.3.2", "@xterm/addon-fit": "^0.10.0", "@xterm/xterm": "^5.5.0", + "@xyflow/react": "^12.4.4", "chokidar": "^4.0.3", "command-exists": "^1.2.9", "dayjs": "^1.11.11", @@ -296,4 +297,4 @@ ], "logLevel": "quiet" } -} \ No newline at end of file +} diff --git a/src/renderer/components/Experiment/Workflows/index.tsx b/src/renderer/components/Experiment/Workflows/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..719ee3c034e67e941b491b582709e62a16d9ee4a --- /dev/null +++ b/src/renderer/components/Experiment/Workflows/index.tsx @@ -0,0 +1,95 @@ +import { Box, Button, ButtonGroup, Sheet, Table, Typography } from '@mui/joy'; +import { ReactFlow } from '@xyflow/react'; + +import '@xyflow/react/dist/style.css'; + +const initialNodes = [ + { + id: '1', + position: { x: 0, y: 0 }, + data: { label: '1. Generate Synthetic Training Data' }, + }, + { + id: '2', + position: { x: 0, y: 100 }, + data: { label: '2. Evaluate' }, + }, + { + id: '3', + position: { x: 0, y: 200 }, + data: { label: '3. Train on Documents' }, + }, + { + id: '4', + position: { x: 0, y: 300 }, + data: { label: '4. Evaluate' }, + }, +]; +const initialEdges = [ + { id: 'e1-2', source: '1', target: '2' }, + { id: 'e2-3', source: '2', target: '3' }, + { id: 'e3-4', source: '3', target: '4' }, +]; + +export default function Workflows({ experimentInfo }) { + return ( + <Sheet + sx={{ + display: 'flex', + flexDirection: 'column', + height: '100%', + overflow: 'hidden', + pb: 2, + }} + > + <Typography level="h1">Workflows</Typography> + <Typography level="body-lg" mb={3}> + This is where it will all go + </Typography> + <Sheet + sx={{ + display: 'flex', + flexDirection: 'row', + gap: 2, + width: '100%', + height: '100%', + }} + > + <Box flex={2}> + <Typography level="title-lg" mb={2}> + List + </Typography> + <Table> + <thead> + <tr> + <th>Workflow</th> + <th>Status</th> + <th> </th> + </tr> + </thead> + <tbody> + {[1, 2, 3].map((i) => ( + <tr key={i}> + <td>Workflow {i}</td> + <td>Running</td> + <td> + <ButtonGroup> + <Button>Edit</Button> + <Button>View</Button> + </ButtonGroup> + </td> + </tr> + ))} + </tbody> + </Table> + </Box> + <Box flex={2}> + <Typography level="title-lg" mb={2}> + Preview + </Typography> + <ReactFlow nodes={initialNodes} edges={initialEdges} /> + </Box> + </Sheet> + </Sheet> + ); +} diff --git a/src/renderer/components/MainAppPanel.tsx b/src/renderer/components/MainAppPanel.tsx index fb76d44d49591c10b5a2757661810c8490e17bdb..dfc01ca85a692de1655f0c1c6c9029bb1e4a7324 100644 --- a/src/renderer/components/MainAppPanel.tsx +++ b/src/renderer/components/MainAppPanel.tsx @@ -12,7 +12,7 @@ import PluginDetails from './Plugins/PluginDetails'; import Computer from './Computer'; import Eval from './Experiment/Eval/Eval'; -import Generate from './Experiment/Generate/Generate' +import Generate from './Experiment/Generate/Generate'; import Export from './Experiment/Export/Export'; import Api from './Experiment/Api'; import Settings from './Experiment/Settings'; @@ -29,7 +29,7 @@ import TransformerLabSettings from './TransformerLabSettings'; import Logs from './Logs'; import FoundationHome from './Experiment/Foundation'; import { useState } from 'react'; -import Generate from './Experiment/Generate/Generate'; +import Workflows from './Experiment/Workflows'; // This component renders the main content of the app that is shown // On the rightmost side, regardless of what menu items are selected @@ -178,6 +178,10 @@ export default function MainAppPanel({ /> } /> + <Route + path="/projects/workflows" + element={<Workflows experimentInfo={experimentInfo} />} + /> <Route path="/projects/prompt" element={ diff --git a/src/renderer/components/Nav/Sidebar.tsx b/src/renderer/components/Nav/Sidebar.tsx index 3171b6b5e6b69fb94999298caef684586e9c4d18..d996748ea952b341ac959212d468ebcf2959d155 100644 --- a/src/renderer/components/Nav/Sidebar.tsx +++ b/src/renderer/components/Nav/Sidebar.tsx @@ -26,6 +26,7 @@ import { SquareStackIcon, FileIcon, ChartColumnIncreasingIcon, + WorkflowIcon, } from 'lucide-react'; import { ButtonGroup, IconButton, Sheet, Tooltip } from '@mui/joy'; @@ -133,6 +134,14 @@ export default function Sidebar({ icon={<MessageCircleIcon />} disabled={!experimentInfo?.name || activeModelIsNotSameAsFoundation()} /> + {experimentInfo?.name == 'dev' && ( + <SubNavItem + title="Workflows" + path="/projects/workflows" + icon={<WorkflowIcon />} + disabled={!experimentInfo?.name} + /> + )} {/* <SubNavItem title="Query Docs" path="/projects/rag"