From 2c08ac2e5d7a9093c6e78642fce56f8dedc6a1e4 Mon Sep 17 00:00:00 2001 From: Van Buren Date: Wed, 19 Nov 2025 22:41:02 -0500 Subject: [PATCH 01/13] feat: should be template feat: theme feat: structure feat: mcp feat: at least make a call fix: back-end fix: filepath fix: clean up fix: remove refrences to old reactors feat: room feat: room feat: top structure feat: allegedly fix: storage response feat: logic for calling search feat: autocompletes feat: allow selection feat: almost fix: colors feat: cards feat: more style fix: mvp feat: search feat: modal feat: tooltip feat: optional feat: call new action fix: modal close --- client/.DS_Store | Bin 6148 -> 6148 bytes client/.env | 2 +- client/package.json | 5 +- client/pnpm-lock.yaml | 26 +-- client/src/App.tsx | 4 +- client/src/components/base/MainNavigation.tsx | 4 +- client/src/components/index.ts | 1 + client/src/components/vault/FileCard.tsx | 100 +++++++++ .../src/components/vault/SearchComponent.tsx | 192 ++++++++++++++++++ .../src/components/vault/SubmitComponent.tsx | 86 ++++++++ client/src/components/vault/TextModal.tsx | 83 ++++++++ client/src/components/vault/index.ts | 3 + client/src/contexts/AppContext.tsx | 59 +++++- client/src/declarations.d.ts | 2 +- client/src/index.html | 2 +- client/src/pages/HomePage.tsx | 128 +++++++++++- client/src/pages/LoginPage.tsx | 4 +- client/src/pages/layouts/AuthorizedLayout.tsx | 2 +- .../src/pages/layouts/InitializedLayout.tsx | 9 +- client/src/theme.ts | 9 + client/src/types.ts | 10 + client/tsconfig.json | 2 +- client/vite.config.ts | 4 +- java/src/reactors/AbstractProjectReactor.java | 16 +- .../AskStorageDocumentsReactor.java | 163 +++++++++++++++ .../digitalvault/AskStorageReactor.java | 34 ++++ .../GetRelevantStorageDocumentsReactor.java | 182 +++++++++++++++++ .../reactors/examples/CallPythonReactor.java | 109 ---------- .../reactors/examples/HelloUserReactor.java | 64 ------ mcp/pixel_mcp.json | 23 +++ py/nthFibonacci.py | 14 -- 31 files changed, 1097 insertions(+), 245 deletions(-) create mode 100644 client/src/components/vault/FileCard.tsx create mode 100644 client/src/components/vault/SearchComponent.tsx create mode 100644 client/src/components/vault/SubmitComponent.tsx create mode 100644 client/src/components/vault/TextModal.tsx create mode 100644 client/src/components/vault/index.ts create mode 100644 client/src/types.ts create mode 100644 java/src/reactors/digitalvault/AskStorageDocumentsReactor.java create mode 100644 java/src/reactors/digitalvault/AskStorageReactor.java create mode 100644 java/src/reactors/digitalvault/GetRelevantStorageDocumentsReactor.java delete mode 100644 java/src/reactors/examples/CallPythonReactor.java delete mode 100644 java/src/reactors/examples/HelloUserReactor.java create mode 100644 mcp/pixel_mcp.json delete mode 100644 py/nthFibonacci.py diff --git a/client/.DS_Store b/client/.DS_Store index 8eae11ed43cca466584d6ef685ad0293fd1add54..d58a3eab9dcf338529628fc1eac1658ce22d52d9 100644 GIT binary patch delta 32 ocmZoMXfc@J&&akhU^gQp+h!gnL&nW*%#AD)8$36&bNuB80HG-f?*IS* delta 83 zcmZoMXfc@J&&a+pU^gQp`(_>{Lq<~}hH{2fh9rgphD3&BhHM5sAeqmQ$B@R5$&e1@ k { fontWeight="bold" whiteSpace="nowrap" > - SEMOSS Template + Document Vault diff --git a/client/src/components/index.ts b/client/src/components/index.ts index cfe63f6..5027915 100644 --- a/client/src/components/index.ts +++ b/client/src/components/index.ts @@ -1,3 +1,4 @@ export * from "./base"; export * from "./examples"; export * from "./library"; +export * from "./vault"; diff --git a/client/src/components/vault/FileCard.tsx b/client/src/components/vault/FileCard.tsx new file mode 100644 index 0000000..d5812ff --- /dev/null +++ b/client/src/components/vault/FileCard.tsx @@ -0,0 +1,100 @@ +import { FileCopyRounded } from "@mui/icons-material"; +import { + type ButtonProps, + CardActionArea, + Checkbox, + Stack, + styled, + Typography, + useTheme, +} from "@mui/material"; +import type { SemossFile } from "@/types"; + +export interface FileCardProps { + file: SemossFile; + onClick: () => void; + selected: boolean; + disabled: boolean; +} + +const StyledCard = styled("div", { + shouldForwardProp: (prop) => prop !== "selected", +})(({ selected, theme }) => ({ + borderRadius: theme.shape.borderRadius, + borderWidth: "2px", + borderStyle: "solid", + borderColor: selected + ? theme.palette.primary.main + : theme.palette.grey[500], +})); + +export const FileCard = ({ + file, + onClick, + selected, + disabled, +}: FileCardProps) => { + const { palette } = useTheme(); + + return ( + + + + + + + + + + {file.Name} + + + + + + ); +}; diff --git a/client/src/components/vault/SearchComponent.tsx b/client/src/components/vault/SearchComponent.tsx new file mode 100644 index 0000000..070f53f --- /dev/null +++ b/client/src/components/vault/SearchComponent.tsx @@ -0,0 +1,192 @@ +import { + Autocomplete, + Grid, + Stack, + styled, + TextField, + Typography, +} from "@mui/material"; +import { useDebouncedValue, useInsight } from "@semoss/sdk/react"; +import { useMemo, useState } from "react"; +import { useAppContext } from "@/contexts"; +import { useLoadingPixel } from "@/hooks"; +import type { Engine, SemossFile } from "@/types"; +import { FileCard } from "./FileCard"; + +export interface SearchComponentProps { + selectedFileMap: Record; + onFileClick: (file: SemossFile) => void; + disabled: boolean; + clearSelectedFiles: () => void; + model: Engine; + storageEngine: Engine; + setModel: (model: Engine) => void; + setStorageEngine: (engine: Engine) => void; +} + +const GrayStack = styled(Stack)(({ theme }) => ({ + backgroundColor: theme.palette.grey[200], +})); + +/** + * A component that allows users to search through the vault + * + * @component + */ +export const SearchComponent = ({ + disabled, + selectedFileMap, + onFileClick, + clearSelectedFiles, + model, + storageEngine, + setModel, + setStorageEngine, +}: SearchComponentProps) => { + /** + * Library hooks + */ + const { tool } = useInsight(); + const { models, storageEngines } = useAppContext(); + + /** + * State + */ + const [searchQuery, setSearchQuery] = useState( + (tool?.parameters?.command as string) || "", + ); + + /** + * Library hooks + */ + const debouncedSearch = useDebouncedValue(searchQuery, 750); + const [allFiles, isLoadingAllFiles] = useLoadingPixel( + `ListStoragePathDetails(storage = ${JSON.stringify(storageEngine?.app_id)}, storagePath="/" );`, + [], + !storageEngine, + ); + const [searchedFilePaths, isLoadingSearch] = useLoadingPixel( + `GetRelevantStorageDocuments(command=${JSON.stringify(debouncedSearch)}, storage=${JSON.stringify(storageEngine?.app_id)}, model=${JSON.stringify(model?.app_id)}, storagePath="/")`, + [], + !(debouncedSearch && model && storageEngine), + ); + + /** + * Memos + */ + const allFileMap = useMemo( + () => + allFiles.reduce( + (acc, curr) => { + acc[curr.Path] = curr; + return acc; + }, + {} as Record, + ), + [allFiles], + ); + + /** + * Constants + */ + const displayedFiles = debouncedSearch + ? Array.from( + new Set([ + ...searchedFilePaths, + ...allFiles + .filter((file) => + file.Name.toLowerCase().includes( + debouncedSearch.toLowerCase(), + ), + ) + .map((file) => file.Path), + ]), + ).map((path) => allFileMap[path]) + : allFiles; + + return ( + <> + + + Document Vault + + setSearchQuery(e.target.value)} + disabled={disabled} + /> + + engine.app_id} + getOptionLabel={(engine) => engine.app_name} + value={storageEngine} + onChange={(_e, val) => { + setStorageEngine(val); + clearSelectedFiles(); + }} + renderInput={(params) => ( + + )} + fullWidth + disabled={disabled} + /> + model.app_id} + getOptionLabel={(model) => model.app_name} + value={model} + onChange={(_e, val) => setModel(val)} + renderInput={(params) => ( + + )} + fullWidth + disabled={disabled} + /> + + + + + {isLoadingAllFiles || + isLoadingSearch || + debouncedSearch !== searchQuery + ? "Loading files..." + : `${ + !storageEngine + ? "Select a storage engine to get started." + : !displayedFiles.length + ? "No files found." + : `${displayedFiles.length} file${displayedFiles.length !== 1 ? "s" : ""} found.` + }${!model ? " Select a model to enable smart search." : ""}`} + + + {displayedFiles.map((file) => ( + + onFileClick(file)} + disabled={disabled} + /> + + ))} + + + + ); +}; diff --git a/client/src/components/vault/SubmitComponent.tsx b/client/src/components/vault/SubmitComponent.tsx new file mode 100644 index 0000000..95f73de --- /dev/null +++ b/client/src/components/vault/SubmitComponent.tsx @@ -0,0 +1,86 @@ +import { ArrowForwardRounded } from "@mui/icons-material"; +import { + Button, + Chip, + Stack, + styled, + Tooltip, + Typography, +} from "@mui/material"; +import type { SemossFile } from "@/types"; + +export interface SubmitComponentProps { + selectedFileMap: Record; + onSubmit: () => void; + disabled: boolean; + isLoadingSubmit: boolean; + onDelete: (file: SemossFile) => void; + disabledText: string; +} + +const GrayStack = styled(Stack)(({ theme }) => ({ + backgroundColor: theme.palette.grey[200], +})); + +/** + * A component that allows users to Submit documents + * + * @component + */ +export const SubmitComponent = ({ + selectedFileMap, + onSubmit, + disabled, + isLoadingSubmit, + onDelete, + disabledText, +}: SubmitComponentProps) => { + const areFilesSelected = Object.keys(selectedFileMap).length > 0; + + return ( + + + {Object.values(selectedFileMap).map((file) => ( + onDelete(file)} + /> + ))} + + + + {`${areFilesSelected ? `${Object.keys(selectedFileMap).length} file${Object.keys(selectedFileMap).length !== 1 ? "s" : ""} selected` : "No files selected."}`} + + + + + + + + + ); +}; diff --git a/client/src/components/vault/TextModal.tsx b/client/src/components/vault/TextModal.tsx new file mode 100644 index 0000000..0c90908 --- /dev/null +++ b/client/src/components/vault/TextModal.tsx @@ -0,0 +1,83 @@ +import { ArrowForwardRounded } from "@mui/icons-material"; +import { + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + Typography, +} from "@mui/material"; +import { useInsight } from "@semoss/sdk/react"; + +export interface TextModalProps { + open: boolean; + onExit: (submit: boolean) => void; + text: string; + loading: boolean; +} + +/** + * A component that renders the finalized text + * + * @component + */ +export const TextModal = ({ open, onExit, text, loading }: TextModalProps) => { + /** + * Library hooks + */ + const { tool } = useInsight(); + + return ( + onExit(false)} + maxWidth="md" + fullWidth + > + Parsed Text + + {text} + + + {tool ? ( + <> + + + + ) : ( + + )} + + + ); +}; diff --git a/client/src/components/vault/index.ts b/client/src/components/vault/index.ts new file mode 100644 index 0000000..eec6852 --- /dev/null +++ b/client/src/components/vault/index.ts @@ -0,0 +1,3 @@ +export * from "./SearchComponent"; +export * from "./SubmitComponent"; +export * from "./TextModal"; diff --git a/client/src/contexts/AppContext.tsx b/client/src/contexts/AppContext.tsx index d6e06ed..1f7bc0e 100644 --- a/client/src/contexts/AppContext.tsx +++ b/client/src/contexts/AppContext.tsx @@ -1,5 +1,5 @@ import { getSystemConfig, runPixel as runPixelSemossSdk } from "@semoss/sdk"; -import { useInsight } from "@semoss/sdk-react"; +import { useInsight } from "@semoss/sdk/react"; import { createContext, type Dispatch, @@ -12,17 +12,24 @@ import { } from "react"; import type { MessageSnackbarProps } from "@/components"; import { useLoadingState } from "@/hooks"; +import type { Engine } from "@/types"; export interface AppContextType { runPixel: ( pixelString: string, successMessage?: string, ) => Promise; + runMCPTool: ( + toolName: string, + toolInput?: Record, + successMessage?: string, + ) => Promise; login: (username: string, password: string) => Promise; logout: () => Promise; userLoginName: string; isAppDataLoading: boolean; - exampleStateData?: number; + models: Engine[]; + storageEngines: Engine[]; messageSnackbarProps: MessageSnackbarProps; setMessageSnackbarProps: Dispatch>; } @@ -66,14 +73,18 @@ export const AppContextProvider = ({ children }: PropsWithChildren) => { message: "", severity: "info", }); - // Example state variable to store the result of a pixel operation - const [exampleStateData, setExampleStateData] = useState(); + const [models, setModels] = useState([]); + const [storageEngines, setStorageEngines] = useState([]); /** * Functions */ - // Function to run a pixel and return the result. Opens the snackbar if there is an error. + /** + * Run pixel code + * @param pixelString - the pixel string to run + * @param successMessage - optional parameter to show a success message + */ const runPixel = useCallback( async (pixelString: string, successMessage?: string) => { try { @@ -120,6 +131,30 @@ export const AppContextProvider = ({ children }: PropsWithChildren) => { [insightId], ); + /** + * Run a MCP tool + * @param name - name of the tool + * @param parameters - parameters to pass to the tool + */ + const runMCPTool = useCallback( + async (name: string, parameters?: Record) => { + try { + const response = await actions.runMCPTool(name, parameters); + if (!response.output) + throw new Error("No output from MCP tool"); + return response.output; + } catch (error) { + setMessageSnackbarProps({ + open: true, + message: `${error.message ?? "Error during operation"}`, + severity: "error", + }); + throw error; + } + }, + [actions], + ); + // Allow users to log in, and grab their name when they do const login = useCallback( async (username: string, password: string) => { @@ -173,9 +208,13 @@ export const AppContextProvider = ({ children }: PropsWithChildren) => { // Create an array of loadSetPairs, each containing a loader function and a setter function const loadSetPairs: LoadSetPair[] = [ { - loader: "1 + 2", - setter: (response) => setExampleStateData(response), - } satisfies LoadSetPair, + loader: ` MyEngines ( metaKeys = [] , metaFilters = [{ "tag" : "text-generation" }] , engineTypes = [ 'MODEL' ] )`, + setter: (value: Engine[]) => setModels(value), + } satisfies LoadSetPair, + { + loader: ` MyEngines ( metaKeys = [], engineTypes = [ 'STORAGE' ] )`, + setter: (value: Engine[]) => setStorageEngines(value), + } satisfies LoadSetPair, ]; // Execute all loaders in parallel and wait for them all to complete @@ -213,7 +252,9 @@ export const AppContextProvider = ({ children }: PropsWithChildren) => { - SEMOSS Template + Document Vault diff --git a/client/src/pages/HomePage.tsx b/client/src/pages/HomePage.tsx index c3bbf21..b313801 100644 --- a/client/src/pages/HomePage.tsx +++ b/client/src/pages/HomePage.tsx @@ -1,4 +1,9 @@ -import { ExampleComponent } from "@/components"; +import { Stack } from "@mui/material"; +import { useInsight } from "@semoss/sdk/react"; +import { useState } from "react"; +import { SearchComponent, SubmitComponent, TextModal } from "@/components"; +import { useAppContext } from "@/contexts"; +import type { Engine, SemossFile } from "@/types"; /** * Renders the home page, currently displaying an example component. @@ -6,5 +11,124 @@ import { ExampleComponent } from "@/components"; * @component */ export const HomePage = () => { - return ; + /** + * Library hooks + */ + const { tool, actions } = useInsight(); + const { runPixel, setMessageSnackbarProps } = useAppContext(); + + /** + * State + */ + const [selectedFileMap, setSelectedFileMap] = useState< + Record + >({}); + const [isLoadingSubmit, setIsLoadingSubmit] = useState(false); + const [storageEngine, setStorageEngine] = useState(null); + const [model, setModel] = useState(null); + const [isModalOpen, setIsModalOpen] = useState(false); + const [modalText, setModalText] = useState(""); + const [isRunningMCP, setIsRunningMCP] = useState(false); + + /** + * Functions + */ + const handleParse = async () => { + setIsLoadingSubmit(true); + try { + const pixelResponse = await runPixel<{ content: string }>( + `AskStorageDocuments( storage=${JSON.stringify(storageEngine.app_id)}, storagePath=${JSON.stringify(Object.keys(selectedFileMap))}, model=${JSON.stringify(model.app_id)}, filePath="/", space="insight" );`, + ); + setModalText(pixelResponse.content); + setIsModalOpen(true); + } catch (error) { + setMessageSnackbarProps({ + open: true, + message: `Error during submission: ${error.message ?? error}`, + severity: "error", + }); + } finally { + setIsLoadingSubmit(false); + } + }; + + const handleMCP = () => { + setIsRunningMCP(true); + try { + if (tool?.name) { + actions.sendMCPResponseToPlayground(modalText); + setMessageSnackbarProps({ + open: true, + message: "MCP response sent to Playground successfully.", + severity: "success", + }); + } + setIsModalOpen(false); + } catch (error) { + setMessageSnackbarProps({ + open: true, + message: `Error during submission: ${error.message ?? error}`, + severity: "error", + }); + } finally { + setIsRunningMCP(false); + } + }; + + const handleFileClick = (file: SemossFile) => { + setSelectedFileMap((prevSelectedFileMap) => { + const newSelectedFileMap = { ...prevSelectedFileMap }; + if (newSelectedFileMap[file.Path]) { + delete newSelectedFileMap[file.Path]; + } else { + newSelectedFileMap[file.Path] = file; + } + return newSelectedFileMap; + }); + }; + + return ( + + setSelectedFileMap({})} + model={model} + storageEngine={storageEngine} + setModel={setModel} + setStorageEngine={setStorageEngine} + /> + + { + if (submit) { + handleMCP(); + } else { + setIsModalOpen(false); + } + }} + text={modalText} + loading={isRunningMCP} + /> + + ); }; diff --git a/client/src/pages/LoginPage.tsx b/client/src/pages/LoginPage.tsx index 1a6e0eb..2554822 100644 --- a/client/src/pages/LoginPage.tsx +++ b/client/src/pages/LoginPage.tsx @@ -1,5 +1,5 @@ import { Button, Stack, TextField } from "@mui/material"; -import { useInsight } from "@semoss/sdk-react"; +import { useInsight } from "@semoss/sdk/react"; import { type ChangeEvent, useRef, useState } from "react"; import { Navigate, useLocation } from "react-router-dom"; import { useAppContext } from "@/contexts"; @@ -57,7 +57,7 @@ export const LoginPage = () => { if (isAuthorized) return ; return ( - + { return ( - {/* Allow users to navigate around the app */} - - {/* Show message snackbar with notifications */} {isInitialized ? ( // If initialized, set up padding and scroll - + {/* Outlet is a react router component; it allows the router to choose the child based on the route */} diff --git a/client/src/theme.ts b/client/src/theme.ts index 8966ade..ca14eee 100644 --- a/client/src/theme.ts +++ b/client/src/theme.ts @@ -14,4 +14,13 @@ export const THEME = createTheme({ paper: "#FAFAFA", }, }, + breakpoints: { + values: { + xs: 0, + sm: 350, + md: 900, + lg: 1200, + xl: 1536, + }, + }, }); diff --git a/client/src/types.ts b/client/src/types.ts new file mode 100644 index 0000000..602697b --- /dev/null +++ b/client/src/types.ts @@ -0,0 +1,10 @@ +export interface SemossFile { + Path: string; + Name: string; + Size: number; // TBD +} + +export interface Engine { + app_id: string; + app_name: string; +} diff --git a/client/tsconfig.json b/client/tsconfig.json index bcb498a..315550a 100644 --- a/client/tsconfig.json +++ b/client/tsconfig.json @@ -10,7 +10,7 @@ "forceConsistentCasingInFileNames": true, "esModuleInterop": true, "module": "esnext", - "moduleResolution": "node", + "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "react-jsx", diff --git a/client/vite.config.ts b/client/vite.config.ts index bd632a7..c0c794b 100644 --- a/client/vite.config.ts +++ b/client/vite.config.ts @@ -1,11 +1,12 @@ import { resolve } from "node:path"; -import { defineConfig, loadEnv } from "vite"; import react from "@vitejs/plugin-react"; +import { defineConfig, loadEnv } from "vite"; export default defineConfig(({ mode }) => { const env = loadEnv(mode, process.cwd(), "") as { ENDPOINT: string; MODULE: string; + APP: string; }; return { @@ -21,6 +22,7 @@ export default defineConfig(({ mode }) => { define: { "import.meta.env.ENDPOINT": JSON.stringify(env.ENDPOINT), "import.meta.env.MODULE": JSON.stringify(env.MODULE), + "import.meta.env.APP": JSON.stringify(env.APP), }, server: { proxy: { diff --git a/java/src/reactors/AbstractProjectReactor.java b/java/src/reactors/AbstractProjectReactor.java index d6039f0..f4eca58 100644 --- a/java/src/reactors/AbstractProjectReactor.java +++ b/java/src/reactors/AbstractProjectReactor.java @@ -7,6 +7,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import prerna.auth.User; +import prerna.engine.impl.model.Room; +import prerna.engine.impl.model.RoomUtils; import prerna.reactor.AbstractReactor; import prerna.sablecc2.om.GenRowStruct; import prerna.sablecc2.om.PixelDataType; @@ -43,12 +45,12 @@ public abstract class AbstractProjectReactor extends AbstractReactor { /** Project-specific properties and configuration settings. */ protected ProjectProperties projectProperties; - // TODO: Initialize additional protected variables (engines, external services, - // etc.) - /** The result of the reactor execution, containing the output data and metadata. */ protected NounMetadata result = null; + /** The room context for this reactor execution. */ + protected Room room; + /** * Executes the reactor with standardized error handling and logging. This method orchestrates the * reactor execution by calling {@link #preExecute()} for setup and then {@link #doExecute()} for @@ -95,9 +97,13 @@ protected void preExecute() { projectId = this.insight.getProjectId(); } - projectProperties = ProjectProperties.getInstance(projectId); + // if there is not yet a room with the same id as this insight, create a new + // room for this insight + room = RoomUtils.createRoomIfNotExists(null, insight, null, "Room " + insight.getInsightId()); + // set the folder path for the insight + this.insight.setInsightFolder(room.getRoomFolderPath()); - // TODO: Initialize additional resources (engines, external services, etc.) + projectProperties = ProjectProperties.getInstance(projectId); user = this.insight.getUser(); organizeKeys(); diff --git a/java/src/reactors/digitalvault/AskStorageDocumentsReactor.java b/java/src/reactors/digitalvault/AskStorageDocumentsReactor.java new file mode 100644 index 0000000..1ca497e --- /dev/null +++ b/java/src/reactors/digitalvault/AskStorageDocumentsReactor.java @@ -0,0 +1,163 @@ +package reactors.digitalvault; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import prerna.auth.utils.SecurityEngineUtils; +import prerna.engine.api.IModelEngine; +import prerna.engine.api.IStorageEngine; +import prerna.engine.impl.model.message.InputMessage; +import prerna.engine.impl.model.message.ResponseMessage; +import prerna.sablecc2.om.GenRowStruct; +import prerna.sablecc2.om.PixelDataType; +import prerna.sablecc2.om.PixelOperationType; +import prerna.sablecc2.om.ReactorKeysEnum; +import prerna.sablecc2.om.nounmeta.NounMetadata; +import prerna.util.Constants; +import prerna.util.UploadInputUtility; +import prerna.util.Utility; +import reactors.AbstractProjectReactor; + +public class AskStorageDocumentsReactor extends AbstractProjectReactor { + + private static final Logger classLogger = LogManager.getLogger(AskStorageDocumentsReactor.class); + private static final Set SUPPORTED_IMAGE_TYPES = Set.of("jpg", "jpeg", "png"); + + public AskStorageDocumentsReactor() { + this.keysToGet = + new String[] { + ReactorKeysEnum.STORAGE.getKey(), + ReactorKeysEnum.STORAGE_PATH.getKey(), + ReactorKeysEnum.SPACE.getKey(), + ReactorKeysEnum.MODEL.getKey(), + ReactorKeysEnum.FILE_PATH.getKey() + }; + this.keyRequired = new int[] {1, 0, 1, 1, 1}; + } + + @Override + public NounMetadata doExecute() { + String storageEngineId = this.keyValue.get(ReactorKeysEnum.STORAGE.getKey()); + String modelId = this.keyValue.get(ReactorKeysEnum.MODEL.getKey()); + if (!SecurityEngineUtils.userCanViewEngine(user, storageEngineId)) { + throw new SecurityException( + "User does not have permission to access the specified storage engine: " + + storageEngineId); + } + if (!SecurityEngineUtils.userCanViewEngine(user, modelId)) { + throw new SecurityException( + "User does not have permission to access the specified model engine: " + modelId); + } + IStorageEngine storage = getStorage(); + IModelEngine modelEngine = Utility.getModel(modelId); + + List storagePaths = getStringListFromKey(ReactorKeysEnum.STORAGE_PATH); + + List invalidFiles = new ArrayList<>(); + List downloadedFiles = new ArrayList<>(); + for (String storagePath : storagePaths) { + + String fileLocation = + Utility.normalizePath(UploadInputUtility.getFilePath(this.store, this.insight)); + if (!(new File(fileLocation).isDirectory())) { + new File(fileLocation).mkdirs(); + } + + String fileExtension = storagePath.substring(storagePath.lastIndexOf('.') + 1).toLowerCase(); + if (!SUPPORTED_IMAGE_TYPES.contains(fileExtension)) { + invalidFiles.add(storagePath); + continue; + } + + try { + storage.copyToLocal(storagePath, fileLocation); + downloadedFiles.add(storagePath); + } catch (Exception e) { + classLogger.error(Constants.STACKTRACE, e); + throw new IllegalArgumentException("Error occurred downloading storage file to local"); + } + } + + classLogger.warn("Invalid file types skipped: " + String.join(", ", invalidFiles)); + + String builtPrompt = + """ + You are an expert OCR assistant. + Your task is to accurately extract all text from image files provided as input. + Organize the extracted text under clear section labels based on each image (e.g., 'filename1', 'filename2', etc.). + Maintain the logical order and formatting of the original text as closely as possible. + If an image contains no readable text, state 'No text found.' + Do not merge or combine text between different images. + """; + + InputMessage msg; + msg = + InputMessage.builder(room) + .withInputUIPrompt(StringEscapeUtils.escapeJava(builtPrompt)) + .withInputPrompt(StringEscapeUtils.escapeJava(builtPrompt)) + .withModelType(modelEngine.getModelType()) + .withImages(downloadedFiles, room) + .build(); + + ResponseMessage response = room.ask(msg, modelEngine); + + return new NounMetadata(response, PixelDataType.MAP, PixelOperationType.OPERATION); + } + + private IStorageEngine getStorage() { + + GenRowStruct grs = this.store.getGenRowStruct(ReactorKeysEnum.STORAGE.getKey()); + if (grs != null && !grs.isEmpty()) { + IStorageEngine storage = null; + if (grs.get(0) instanceof String) { + storage = (IStorageEngine) Utility.getStorage((String) grs.get(0)); + } else { + storage = (IStorageEngine) grs.get(0); + } + return storage; + } + + List storageInputs = this.curRow.getNounsOfType(PixelDataType.STORAGE); + if (storageInputs != null && !storageInputs.isEmpty()) { + return (IStorageEngine) storageInputs.get(0).getValue(); + } + + throw new NullPointerException("No storage engine defined"); + } + + public List getStringListFromKey(ReactorKeysEnum enumValue) { + List inputStrings = new ArrayList<>(); + GenRowStruct grs = this.store.getGenRowStruct(enumValue.getKey()); + if (grs != null && !grs.isEmpty()) { + int size = grs.size(); + for (int i = 0; i < size; i++) inputStrings.add(grs.get(i).toString()); + return inputStrings; + } + int size = this.curRow.size(); + for (int i = 0; i < size; i++) inputStrings.add(this.curRow.get(i).toString()); + return inputStrings; + } + + @Override + public String getReactorDescription() { + return "Pull files from a storage path to a local path"; + } + + @Override + protected String getDescriptionForKey(String key) { + if (key.equals(ReactorKeysEnum.STORAGE.getKey())) { + return "The storage engine instance or id"; + } else if (key.equals(ReactorKeysEnum.STORAGE_PATH.getKey())) { + return "The storage path(s) to download from"; + } else if (key.equals(ReactorKeysEnum.FILE_PATH.getKey())) { + return "The local path to download files to. It should always be /"; + } else if (key.equals(ReactorKeysEnum.MODEL.getKey())) { + return "Vision model to process downloaded file"; + } + return super.getDescriptionForKey(key); + } +} diff --git a/java/src/reactors/digitalvault/AskStorageReactor.java b/java/src/reactors/digitalvault/AskStorageReactor.java new file mode 100644 index 0000000..aa7c09d --- /dev/null +++ b/java/src/reactors/digitalvault/AskStorageReactor.java @@ -0,0 +1,34 @@ +package reactors.digitalvault; + +import prerna.sablecc2.om.PixelDataType; +import prerna.sablecc2.om.ReactorKeysEnum; +import prerna.sablecc2.om.nounmeta.NounMetadata; +import reactors.AbstractProjectReactor; + +public class AskStorageReactor extends AbstractProjectReactor { + + public AskStorageReactor() { + this.keysToGet = new String[] {ReactorKeysEnum.COMMAND.getKey()}; + this.keyRequired = new int[] {0}; + } + + @Override + protected NounMetadata doExecute() { + return new NounMetadata("true", PixelDataType.CONST_STRING); + } + + @Override + public String getReactorDescription() { + return "This tool takes in a request for information and retrieves the relevant parsed text" + + " from the user's digital vault. For example, \"Find my proof of residence\" could" + + " return the text from a user's utility bills."; + } + + @Override + protected String getDescriptionForKey(String key) { + if (key.equals(ReactorKeysEnum.COMMAND.getKey())) { + return "The type of information to retrieve from the storage engine."; + } + return super.getDescriptionForKey(key); + } +} diff --git a/java/src/reactors/digitalvault/GetRelevantStorageDocumentsReactor.java b/java/src/reactors/digitalvault/GetRelevantStorageDocumentsReactor.java new file mode 100644 index 0000000..d949415 --- /dev/null +++ b/java/src/reactors/digitalvault/GetRelevantStorageDocumentsReactor.java @@ -0,0 +1,182 @@ +package reactors.digitalvault; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import prerna.auth.utils.SecurityEngineUtils; +import prerna.engine.api.IModelEngine; +import prerna.engine.api.IStorageEngine; +import prerna.engine.impl.model.message.InputMessage; +import prerna.engine.impl.model.message.ResponseMessage; +import prerna.sablecc2.om.GenRowStruct; +import prerna.sablecc2.om.PixelDataType; +import prerna.sablecc2.om.PixelOperationType; +import prerna.sablecc2.om.ReactorKeysEnum; +import prerna.sablecc2.om.nounmeta.NounMetadata; +import prerna.util.Constants; +import prerna.util.Utility; +import reactors.AbstractProjectReactor; + +public class GetRelevantStorageDocumentsReactor extends AbstractProjectReactor { + + private static final Logger classLogger = + LogManager.getLogger(GetRelevantStorageDocumentsReactor.class); + private static final Set SUPPORTED_IMAGE_TYPES = Set.of("jpg", "jpeg", "png"); + + public GetRelevantStorageDocumentsReactor() { + this.keysToGet = + new String[] { + ReactorKeysEnum.STORAGE.getKey(), + ReactorKeysEnum.MODEL.getKey(), + ReactorKeysEnum.COMMAND.getKey(), + ReactorKeysEnum.STORAGE_PATH.getKey() + }; + this.keyRequired = new int[] {1, 1, 1, 0}; + } + + @Override + public NounMetadata doExecute() { + String storagePath = this.keyValue.get(ReactorKeysEnum.STORAGE_PATH.getKey()); + String storageEngineId = this.keyValue.get(ReactorKeysEnum.STORAGE.getKey()); + String modelId = this.keyValue.get(ReactorKeysEnum.MODEL.getKey()); + String command = this.keyValue.get(ReactorKeysEnum.COMMAND.getKey()); + if (!SecurityEngineUtils.userCanViewEngine(user, storageEngineId)) { + throw new SecurityException( + "User does not have permission to access the specified storage engine: " + + storageEngineId); + } + if (!SecurityEngineUtils.userCanViewEngine(user, modelId)) { + throw new SecurityException( + "User does not have permission to access the specified model engine: " + modelId); + } + IStorageEngine storage = getStorage(); + IModelEngine modelEngine = Utility.getModel(modelId); + + if (storagePath == null || storagePath.isEmpty()) { + storagePath = "/"; + } + + List invalidFiles = new ArrayList<>(); + List validFiles = new ArrayList<>(); + + List storageList = new ArrayList<>(); + + try { + storageList = storage.list(storagePath); + } catch (Exception e) { + classLogger.error(Constants.STACKTRACE, e); + throw new IllegalArgumentException("Error listing storage details at path " + storagePath); + } + + for (String filePath : storageList) { + String fileExtension = filePath.substring(filePath.lastIndexOf('.') + 1).toLowerCase(); + if (SUPPORTED_IMAGE_TYPES.contains(fileExtension)) { + validFiles.add(filePath); + } else { + invalidFiles.add(filePath); + } + } + + classLogger.warn("Invalid file types skipped: " + String.join(", ", invalidFiles)); + + String systemPrompt = + """ + Given the following list of files, return ONLY the filenames that are relevant to the user's prompt. + Respond with an array of strings containing exactly the relevant filenames, and nothing else—no explanations or extra text. + If there are no relevant files, return an empty array. + List of Files: + [Insert your file list here, e.g., "report.pdf", "summary.docx", "2023_financials.xlsx", ...] + User Prompt: + [Insert your user's specific prompt here, e.g., "Show me all files related to 2023 financials"] + Only output the array, e.g. + ["2023_financials.xlsx", "report.pdf"] + """; + + command += + "\n\nHere is the list of available files:\n" + + String.join("\n", validFiles) + + "\n\n" + + "From the above list, identify and return ONLY the filenames that are relevant to my" + + " prompt. Respond with an array of strings containing exactly the relevant filenames," + + " and nothing else."; + + InputMessage msg; + msg = + InputMessage.builder(room) + .withInputUIPrompt(StringEscapeUtils.escapeJava(command)) + .withInputPrompt(StringEscapeUtils.escapeJava(command)) + .withSystemPrompt(StringEscapeUtils.escapeJava(systemPrompt)) + .withModelType(modelEngine.getModelType()) + .build(); + + ResponseMessage response = room.ask(msg, modelEngine); + + String responseString = response.getContent(); + List docList = new ArrayList<>(); + try { + Gson gson = new Gson(); + docList = gson.fromJson(responseString, new TypeToken>() {}.getType()); + } catch (Exception e) { + classLogger.error(Constants.STACKTRACE, e); + throw new IllegalArgumentException("Error parsing model response: " + responseString); + } + + return new NounMetadata(docList, PixelDataType.VECTOR, PixelOperationType.OPERATION); + } + + private IStorageEngine getStorage() { + + GenRowStruct grs = this.store.getGenRowStruct(ReactorKeysEnum.STORAGE.getKey()); + if (grs != null && !grs.isEmpty()) { + IStorageEngine storage = null; + if (grs.get(0) instanceof String) { + storage = (IStorageEngine) Utility.getStorage((String) grs.get(0)); + } else { + storage = (IStorageEngine) grs.get(0); + } + return storage; + } + + List storageInputs = this.curRow.getNounsOfType(PixelDataType.STORAGE); + if (storageInputs != null && !storageInputs.isEmpty()) { + return (IStorageEngine) storageInputs.get(0).getValue(); + } + + throw new NullPointerException("No storage engine defined"); + } + + public List getStringListFromKey(ReactorKeysEnum enumValue) { + List inputStrings = new ArrayList<>(); + GenRowStruct grs = this.store.getGenRowStruct(enumValue.getKey()); + if (grs != null && !grs.isEmpty()) { + int size = grs.size(); + for (int i = 0; i < size; i++) inputStrings.add(grs.get(i).toString()); + return inputStrings; + } + int size = this.curRow.size(); + for (int i = 0; i < size; i++) inputStrings.add(this.curRow.get(i).toString()); + return inputStrings; + } + + @Override + public String getReactorDescription() { + return "Pull files from a storage path to a local path"; + } + + @Override + protected String getDescriptionForKey(String key) { + if (key.equals(ReactorKeysEnum.STORAGE.getKey())) { + return "The storage engine instance or id"; + } else if (key.equals(ReactorKeysEnum.STORAGE_PATH.getKey())) { + return "The storage path(s) to download from"; + } else if (key.equals(ReactorKeysEnum.MODEL.getKey())) { + return "Vision model to process downloaded file"; + } + return super.getDescriptionForKey(key); + } +} diff --git a/java/src/reactors/examples/CallPythonReactor.java b/java/src/reactors/examples/CallPythonReactor.java deleted file mode 100644 index ee92be4..0000000 --- a/java/src/reactors/examples/CallPythonReactor.java +++ /dev/null @@ -1,109 +0,0 @@ -package reactors.examples; - -import java.util.ArrayList; -import java.util.List; -import prerna.ds.py.PyTranslator; -import prerna.sablecc2.om.PixelDataType; -import prerna.sablecc2.om.ReactorKeysEnum; -import prerna.sablecc2.om.nounmeta.NounMetadata; -import reactors.AbstractProjectReactor; - -/** - * Reactor implementation that bridges Java reactor execution with an external Python helper - * function. This reactor expects a single numeric input and invokes a Python module function ( - * nthFibonacci) to compute the Nth Fibonacci number, returning the result. - * - *

Execution flow: - * - *

    - *
  • Validates and retrieves the required numeric input key ({@link - * ReactorKeysEnum#NUMERIC_VALUE}). - *
  • Loads the Python source file (nthFibonacci.py) into a runtime module via - * {@link PyTranslator}. - *
  • Invokes the Python function nthFibonacci with the provided argument list. - *
  • Wraps and returns the Python response inside a {@link NounMetadata} result for downstream - * pixel operations. - *
- * - *

This class extends {@link AbstractProjectReactor} and leverages its protected context members - * (such as {@code insight}, {@code user}, and parameter retrieval utilities) to access project and - * execution context seamlessly. - * - * @see {@link AbstractProjectReactor} for base reactor lifecycle and error handling. - * @see {@link #doExecute()} for detailed per-execution business logic. - */ -public class CallPythonReactor extends AbstractProjectReactor { - - // Note: Has access to protected variables defined in AbstractProjectReactor - - /** - * Constructs a new {@link CallPythonReactor} configuring the required input keys for execution. - * The reactor requires one numeric value key which represents the target index (N) for the - * Fibonacci computation. - * - *

Key configuration details: - * - *

    - *
  • {@link ReactorKeysEnum#NUMERIC_VALUE} - Required (denoted by 1 in {@code keyRequired}). - *
- * - * @see {@link CallPythonReactor} for overall reactor purpose. - */ - public CallPythonReactor() { - - // list of keys the reactor is expecting - this.keysToGet = new String[] {ReactorKeysEnum.NUMERIC_VALUE.getKey()}; - - // 1 for required keys, 0 for optional - this.keyRequired = new int[] {1}; - } - - /** - * Executes the Python-backed Fibonacci computation and returns the resulting number. This method - * performs all per-invocation logic: extracting the input numeric key, loading the Python module - * file, invoking the target function, and wrapping the response. - * - *

Processing steps: - * - *

    - *
  • Extract input N from {@link ReactorKeysEnum#NUMERIC_VALUE}. - *
  • Resolve project context ID (fallback to {@code insight.getProjectId()} when necessary). - *
  • Load nthFibonacci.py as a module using {@link PyTranslator}. - *
  • Invoke the Python function nthFibonacci with a single argument list holding - * N. - *
  • Wrap the returned Python object inside {@link NounMetadata} with type {@link - * PixelDataType#CONST_STRING}. - *
- * - * @return A {@link NounMetadata} representing the computed Fibonacci value as a constant string. - * @see {@link AbstractProjectReactor#doExecute()} for overarching execution contract. - */ - @Override - protected NounMetadata doExecute() { - // grab the input number - int inputNum = Integer.parseInt(this.keyValue.get(ReactorKeysEnum.NUMERIC_VALUE.getKey())); - - // define the file to grab the helper function from - String sourceFile = "nthFibonacci.py"; - - PyTranslator pt = this.insight.getPyTranslator(); - - String projectId = this.insight.getContextProjectId(); - if (projectId == null) { - projectId = this.insight.getProjectId(); - } - - String fibonacciModule = pt.loadPythonModuleFromFile(this.insight, sourceFile, projectId); - - String functionName = "nthFibonacci"; - - // define the arguments to be passed to the function - List argsList = new ArrayList<>(); - argsList.add(inputNum); - - Object pyResponse = - pt.runFunctionFromLoadedModule(this.insight, fibonacciModule, functionName, argsList); - - return new NounMetadata(pyResponse, PixelDataType.CONST_STRING); - } -} diff --git a/java/src/reactors/examples/HelloUserReactor.java b/java/src/reactors/examples/HelloUserReactor.java deleted file mode 100644 index 727aa6a..0000000 --- a/java/src/reactors/examples/HelloUserReactor.java +++ /dev/null @@ -1,64 +0,0 @@ -package reactors.examples; - -import prerna.sablecc2.om.PixelDataType; -import prerna.sablecc2.om.ReactorKeysEnum; -import prerna.sablecc2.om.nounmeta.NounMetadata; -import reactors.AbstractProjectReactor; - -/** - * Example reactor that demonstrates basic functionality by greeting a user. This reactor accepts an - * optional name parameter and returns a personalized greeting message. If no name is provided, it - * uses the current user's name from the authentication context. - * - *

This class serves as a simple example of how to extend {@link AbstractProjectReactor} and - * implement basic parameter handling and user context access. - * - * @see {@link AbstractProjectReactor} for base reactor functionality - */ -public class HelloUserReactor extends AbstractProjectReactor { - - // Note: Has access to protected variables defined in AbstractProjectReactor - - /** - * Constructs a HelloUserReactor and configures its expected input parameters. This constructor - * sets up the reactor to accept an optional "name" parameter. - */ - public HelloUserReactor() { - - // list of keys the reactor is expecting - this.keysToGet = new String[] {ReactorKeysEnum.NAME.getKey()}; - - // 1 for required keys, 0 for optional - this.keyRequired = new int[] {0}; - } - - /** - * Executes the main logic of the HelloUserReactor to generate a personalized greeting. This - * method retrieves the optional name parameter and creates a welcome message. If no name - * parameter is provided, it defaults to using the current authenticated user's name. - * - *

The method demonstrates how to: - * - *

    - *
  • Access optional parameters using {@link ReactorKeysEnum} - *
  • Use the protected {@code user} variable from {@link AbstractProjectReactor} - *
  • Return string results wrapped in {@link NounMetadata} - *
- * - * @return A {@link NounMetadata} containing the greeting message as a constant string - */ - @Override - protected NounMetadata doExecute() { - - // returns null if the argument is not found - String name = this.keyValue.get(ReactorKeysEnum.NAME.getKey()); - - // if name is not provided, use the user's name - name = (name == null) ? user.getPrimaryLoginToken().getName() : name; - - // grabbing user from AbstractProjectReactor - String response = "Hello, " + name + "! Welcome to SEMOSS."; - - return new NounMetadata(response, PixelDataType.CONST_STRING); - } -} diff --git a/mcp/pixel_mcp.json b/mcp/pixel_mcp.json new file mode 100644 index 0000000..80dff5b --- /dev/null +++ b/mcp/pixel_mcp.json @@ -0,0 +1,23 @@ +{ + "_meta": { "last_modified_date": "2025-11-20" }, + "tools": [ + { + "inputSchema": { + "type": "object", + "title": "AskStorage_Arguments", + "properties": { + "command": { + "description": "The type of information to retrieve from the storage engine.", + "title": "command", + "type": "string" + } + }, + "required": [] + }, + "name": "AskStorage", + "description": "This tool takes in a request for information and retrieves the relevant parsed text from the user's digital vault. For example, \"Find my proof of residence\" could return the text from a user's utility bills.", + "_meta": { "SMSS_MCP_EXECUTION": "ask" }, + "title": "Ask Storage" + } + ] +} diff --git a/py/nthFibonacci.py b/py/nthFibonacci.py deleted file mode 100644 index f39fca0..0000000 --- a/py/nthFibonacci.py +++ /dev/null @@ -1,14 +0,0 @@ -# sample python function that finds the nth fibonacci number -def nthFibonacci(n: int) -> int: - if n <= 1: - return n - - dp = [0] * (n + 1) - - dp[0] = 0 - dp[1] = 1 - - for i in range(2, n + 1): - dp[i] = dp[i - 1] + dp[i - 2] - - return dp[n] From 7bd9a1035576ef4f4e54d049005e16dc75229fb4 Mon Sep 17 00:00:00 2001 From: Van Buren Date: Mon, 24 Nov 2025 12:15:28 -0600 Subject: [PATCH 02/13] fix: kick out doc vault --- client/package.json | 4 +- client/src/components/base/MainNavigation.tsx | 2 +- client/src/components/index.ts | 1 - client/src/components/vault/FileCard.tsx | 100 --------- .../src/components/vault/SearchComponent.tsx | 192 ------------------ .../src/components/vault/SubmitComponent.tsx | 86 -------- client/src/components/vault/TextModal.tsx | 83 -------- client/src/components/vault/index.ts | 3 - client/src/contexts/AppContext.tsx | 21 +- client/src/index.html | 2 +- client/src/pages/HomePage.tsx | 128 +----------- client/src/pages/LoginPage.tsx | 2 +- .../src/pages/layouts/InitializedLayout.tsx | 7 +- client/src/theme.ts | 9 - client/src/types.ts | 10 - 15 files changed, 19 insertions(+), 631 deletions(-) delete mode 100644 client/src/components/vault/FileCard.tsx delete mode 100644 client/src/components/vault/SearchComponent.tsx delete mode 100644 client/src/components/vault/SubmitComponent.tsx delete mode 100644 client/src/components/vault/TextModal.tsx delete mode 100644 client/src/components/vault/index.ts delete mode 100644 client/src/types.ts diff --git a/client/package.json b/client/package.json index 7700f37..8876cfb 100644 --- a/client/package.json +++ b/client/package.json @@ -12,7 +12,7 @@ "@mui/material": "^7.3.5", "@mui/x-data-grid": "^8.17.0", "@mui/x-date-pickers": "^8.17.0", - "@semoss/sdk": "file:../../../../../../../apache-tomcat-9.0.102/webapps/SemossWeb/libs/sdk", + "@semoss/sdk": "1.0.0-beta.31", "dayjs": "^1.11.19", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -26,4 +26,4 @@ "typescript": "^5.9.3", "vite": "^7.2.2" } -} \ No newline at end of file +} diff --git a/client/src/components/base/MainNavigation.tsx b/client/src/components/base/MainNavigation.tsx index 23ce6a9..191bfc9 100644 --- a/client/src/components/base/MainNavigation.tsx +++ b/client/src/components/base/MainNavigation.tsx @@ -79,7 +79,7 @@ export const MainNavigation = () => { fontWeight="bold" whiteSpace="nowrap" > - Document Vault + SEMOSS Template diff --git a/client/src/components/index.ts b/client/src/components/index.ts index 5027915..cfe63f6 100644 --- a/client/src/components/index.ts +++ b/client/src/components/index.ts @@ -1,4 +1,3 @@ export * from "./base"; export * from "./examples"; export * from "./library"; -export * from "./vault"; diff --git a/client/src/components/vault/FileCard.tsx b/client/src/components/vault/FileCard.tsx deleted file mode 100644 index d5812ff..0000000 --- a/client/src/components/vault/FileCard.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import { FileCopyRounded } from "@mui/icons-material"; -import { - type ButtonProps, - CardActionArea, - Checkbox, - Stack, - styled, - Typography, - useTheme, -} from "@mui/material"; -import type { SemossFile } from "@/types"; - -export interface FileCardProps { - file: SemossFile; - onClick: () => void; - selected: boolean; - disabled: boolean; -} - -const StyledCard = styled("div", { - shouldForwardProp: (prop) => prop !== "selected", -})(({ selected, theme }) => ({ - borderRadius: theme.shape.borderRadius, - borderWidth: "2px", - borderStyle: "solid", - borderColor: selected - ? theme.palette.primary.main - : theme.palette.grey[500], -})); - -export const FileCard = ({ - file, - onClick, - selected, - disabled, -}: FileCardProps) => { - const { palette } = useTheme(); - - return ( - - - - - - - - - - {file.Name} - - - - - - ); -}; diff --git a/client/src/components/vault/SearchComponent.tsx b/client/src/components/vault/SearchComponent.tsx deleted file mode 100644 index 070f53f..0000000 --- a/client/src/components/vault/SearchComponent.tsx +++ /dev/null @@ -1,192 +0,0 @@ -import { - Autocomplete, - Grid, - Stack, - styled, - TextField, - Typography, -} from "@mui/material"; -import { useDebouncedValue, useInsight } from "@semoss/sdk/react"; -import { useMemo, useState } from "react"; -import { useAppContext } from "@/contexts"; -import { useLoadingPixel } from "@/hooks"; -import type { Engine, SemossFile } from "@/types"; -import { FileCard } from "./FileCard"; - -export interface SearchComponentProps { - selectedFileMap: Record; - onFileClick: (file: SemossFile) => void; - disabled: boolean; - clearSelectedFiles: () => void; - model: Engine; - storageEngine: Engine; - setModel: (model: Engine) => void; - setStorageEngine: (engine: Engine) => void; -} - -const GrayStack = styled(Stack)(({ theme }) => ({ - backgroundColor: theme.palette.grey[200], -})); - -/** - * A component that allows users to search through the vault - * - * @component - */ -export const SearchComponent = ({ - disabled, - selectedFileMap, - onFileClick, - clearSelectedFiles, - model, - storageEngine, - setModel, - setStorageEngine, -}: SearchComponentProps) => { - /** - * Library hooks - */ - const { tool } = useInsight(); - const { models, storageEngines } = useAppContext(); - - /** - * State - */ - const [searchQuery, setSearchQuery] = useState( - (tool?.parameters?.command as string) || "", - ); - - /** - * Library hooks - */ - const debouncedSearch = useDebouncedValue(searchQuery, 750); - const [allFiles, isLoadingAllFiles] = useLoadingPixel( - `ListStoragePathDetails(storage = ${JSON.stringify(storageEngine?.app_id)}, storagePath="/" );`, - [], - !storageEngine, - ); - const [searchedFilePaths, isLoadingSearch] = useLoadingPixel( - `GetRelevantStorageDocuments(command=${JSON.stringify(debouncedSearch)}, storage=${JSON.stringify(storageEngine?.app_id)}, model=${JSON.stringify(model?.app_id)}, storagePath="/")`, - [], - !(debouncedSearch && model && storageEngine), - ); - - /** - * Memos - */ - const allFileMap = useMemo( - () => - allFiles.reduce( - (acc, curr) => { - acc[curr.Path] = curr; - return acc; - }, - {} as Record, - ), - [allFiles], - ); - - /** - * Constants - */ - const displayedFiles = debouncedSearch - ? Array.from( - new Set([ - ...searchedFilePaths, - ...allFiles - .filter((file) => - file.Name.toLowerCase().includes( - debouncedSearch.toLowerCase(), - ), - ) - .map((file) => file.Path), - ]), - ).map((path) => allFileMap[path]) - : allFiles; - - return ( - <> - - - Document Vault - - setSearchQuery(e.target.value)} - disabled={disabled} - /> - - engine.app_id} - getOptionLabel={(engine) => engine.app_name} - value={storageEngine} - onChange={(_e, val) => { - setStorageEngine(val); - clearSelectedFiles(); - }} - renderInput={(params) => ( - - )} - fullWidth - disabled={disabled} - /> - model.app_id} - getOptionLabel={(model) => model.app_name} - value={model} - onChange={(_e, val) => setModel(val)} - renderInput={(params) => ( - - )} - fullWidth - disabled={disabled} - /> - - - - - {isLoadingAllFiles || - isLoadingSearch || - debouncedSearch !== searchQuery - ? "Loading files..." - : `${ - !storageEngine - ? "Select a storage engine to get started." - : !displayedFiles.length - ? "No files found." - : `${displayedFiles.length} file${displayedFiles.length !== 1 ? "s" : ""} found.` - }${!model ? " Select a model to enable smart search." : ""}`} - - - {displayedFiles.map((file) => ( - - onFileClick(file)} - disabled={disabled} - /> - - ))} - - - - ); -}; diff --git a/client/src/components/vault/SubmitComponent.tsx b/client/src/components/vault/SubmitComponent.tsx deleted file mode 100644 index 95f73de..0000000 --- a/client/src/components/vault/SubmitComponent.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { ArrowForwardRounded } from "@mui/icons-material"; -import { - Button, - Chip, - Stack, - styled, - Tooltip, - Typography, -} from "@mui/material"; -import type { SemossFile } from "@/types"; - -export interface SubmitComponentProps { - selectedFileMap: Record; - onSubmit: () => void; - disabled: boolean; - isLoadingSubmit: boolean; - onDelete: (file: SemossFile) => void; - disabledText: string; -} - -const GrayStack = styled(Stack)(({ theme }) => ({ - backgroundColor: theme.palette.grey[200], -})); - -/** - * A component that allows users to Submit documents - * - * @component - */ -export const SubmitComponent = ({ - selectedFileMap, - onSubmit, - disabled, - isLoadingSubmit, - onDelete, - disabledText, -}: SubmitComponentProps) => { - const areFilesSelected = Object.keys(selectedFileMap).length > 0; - - return ( - - - {Object.values(selectedFileMap).map((file) => ( - onDelete(file)} - /> - ))} - - - - {`${areFilesSelected ? `${Object.keys(selectedFileMap).length} file${Object.keys(selectedFileMap).length !== 1 ? "s" : ""} selected` : "No files selected."}`} - - - - - - - - - ); -}; diff --git a/client/src/components/vault/TextModal.tsx b/client/src/components/vault/TextModal.tsx deleted file mode 100644 index 0c90908..0000000 --- a/client/src/components/vault/TextModal.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { ArrowForwardRounded } from "@mui/icons-material"; -import { - Button, - Dialog, - DialogActions, - DialogContent, - DialogTitle, - Typography, -} from "@mui/material"; -import { useInsight } from "@semoss/sdk/react"; - -export interface TextModalProps { - open: boolean; - onExit: (submit: boolean) => void; - text: string; - loading: boolean; -} - -/** - * A component that renders the finalized text - * - * @component - */ -export const TextModal = ({ open, onExit, text, loading }: TextModalProps) => { - /** - * Library hooks - */ - const { tool } = useInsight(); - - return ( - onExit(false)} - maxWidth="md" - fullWidth - > - Parsed Text - - {text} - - - {tool ? ( - <> - - - - ) : ( - - )} - - - ); -}; diff --git a/client/src/components/vault/index.ts b/client/src/components/vault/index.ts deleted file mode 100644 index eec6852..0000000 --- a/client/src/components/vault/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./SearchComponent"; -export * from "./SubmitComponent"; -export * from "./TextModal"; diff --git a/client/src/contexts/AppContext.tsx b/client/src/contexts/AppContext.tsx index 1f7bc0e..4b43f77 100644 --- a/client/src/contexts/AppContext.tsx +++ b/client/src/contexts/AppContext.tsx @@ -12,7 +12,6 @@ import { } from "react"; import type { MessageSnackbarProps } from "@/components"; import { useLoadingState } from "@/hooks"; -import type { Engine } from "@/types"; export interface AppContextType { runPixel: ( @@ -28,8 +27,7 @@ export interface AppContextType { logout: () => Promise; userLoginName: string; isAppDataLoading: boolean; - models: Engine[]; - storageEngines: Engine[]; + exampleStateData?: number; messageSnackbarProps: MessageSnackbarProps; setMessageSnackbarProps: Dispatch>; } @@ -73,8 +71,8 @@ export const AppContextProvider = ({ children }: PropsWithChildren) => { message: "", severity: "info", }); - const [models, setModels] = useState([]); - const [storageEngines, setStorageEngines] = useState([]); + // Example state variable to store the result of a pixel operation + const [exampleStateData, setExampleStateData] = useState(); /** * Functions @@ -208,13 +206,9 @@ export const AppContextProvider = ({ children }: PropsWithChildren) => { // Create an array of loadSetPairs, each containing a loader function and a setter function const loadSetPairs: LoadSetPair[] = [ { - loader: ` MyEngines ( metaKeys = [] , metaFilters = [{ "tag" : "text-generation" }] , engineTypes = [ 'MODEL' ] )`, - setter: (value: Engine[]) => setModels(value), - } satisfies LoadSetPair, - { - loader: ` MyEngines ( metaKeys = [], engineTypes = [ 'STORAGE' ] )`, - setter: (value: Engine[]) => setStorageEngines(value), - } satisfies LoadSetPair, + loader: "1 + 2", + setter: (response) => setExampleStateData(response), + } satisfies LoadSetPair, ]; // Execute all loaders in parallel and wait for them all to complete @@ -253,8 +247,7 @@ export const AppContextProvider = ({ children }: PropsWithChildren) => { value={{ runPixel, runMCPTool, - models, - storageEngines, + exampleStateData, isAppDataLoading, messageSnackbarProps, setMessageSnackbarProps, diff --git a/client/src/index.html b/client/src/index.html index 7c9acf1..2614687 100644 --- a/client/src/index.html +++ b/client/src/index.html @@ -2,7 +2,7 @@ - Document Vault + SEMOSS Template diff --git a/client/src/pages/HomePage.tsx b/client/src/pages/HomePage.tsx index b313801..c3bbf21 100644 --- a/client/src/pages/HomePage.tsx +++ b/client/src/pages/HomePage.tsx @@ -1,9 +1,4 @@ -import { Stack } from "@mui/material"; -import { useInsight } from "@semoss/sdk/react"; -import { useState } from "react"; -import { SearchComponent, SubmitComponent, TextModal } from "@/components"; -import { useAppContext } from "@/contexts"; -import type { Engine, SemossFile } from "@/types"; +import { ExampleComponent } from "@/components"; /** * Renders the home page, currently displaying an example component. @@ -11,124 +6,5 @@ import type { Engine, SemossFile } from "@/types"; * @component */ export const HomePage = () => { - /** - * Library hooks - */ - const { tool, actions } = useInsight(); - const { runPixel, setMessageSnackbarProps } = useAppContext(); - - /** - * State - */ - const [selectedFileMap, setSelectedFileMap] = useState< - Record - >({}); - const [isLoadingSubmit, setIsLoadingSubmit] = useState(false); - const [storageEngine, setStorageEngine] = useState(null); - const [model, setModel] = useState(null); - const [isModalOpen, setIsModalOpen] = useState(false); - const [modalText, setModalText] = useState(""); - const [isRunningMCP, setIsRunningMCP] = useState(false); - - /** - * Functions - */ - const handleParse = async () => { - setIsLoadingSubmit(true); - try { - const pixelResponse = await runPixel<{ content: string }>( - `AskStorageDocuments( storage=${JSON.stringify(storageEngine.app_id)}, storagePath=${JSON.stringify(Object.keys(selectedFileMap))}, model=${JSON.stringify(model.app_id)}, filePath="/", space="insight" );`, - ); - setModalText(pixelResponse.content); - setIsModalOpen(true); - } catch (error) { - setMessageSnackbarProps({ - open: true, - message: `Error during submission: ${error.message ?? error}`, - severity: "error", - }); - } finally { - setIsLoadingSubmit(false); - } - }; - - const handleMCP = () => { - setIsRunningMCP(true); - try { - if (tool?.name) { - actions.sendMCPResponseToPlayground(modalText); - setMessageSnackbarProps({ - open: true, - message: "MCP response sent to Playground successfully.", - severity: "success", - }); - } - setIsModalOpen(false); - } catch (error) { - setMessageSnackbarProps({ - open: true, - message: `Error during submission: ${error.message ?? error}`, - severity: "error", - }); - } finally { - setIsRunningMCP(false); - } - }; - - const handleFileClick = (file: SemossFile) => { - setSelectedFileMap((prevSelectedFileMap) => { - const newSelectedFileMap = { ...prevSelectedFileMap }; - if (newSelectedFileMap[file.Path]) { - delete newSelectedFileMap[file.Path]; - } else { - newSelectedFileMap[file.Path] = file; - } - return newSelectedFileMap; - }); - }; - - return ( - - setSelectedFileMap({})} - model={model} - storageEngine={storageEngine} - setModel={setModel} - setStorageEngine={setStorageEngine} - /> - - { - if (submit) { - handleMCP(); - } else { - setIsModalOpen(false); - } - }} - text={modalText} - loading={isRunningMCP} - /> - - ); + return ; }; diff --git a/client/src/pages/LoginPage.tsx b/client/src/pages/LoginPage.tsx index 2554822..938b908 100644 --- a/client/src/pages/LoginPage.tsx +++ b/client/src/pages/LoginPage.tsx @@ -57,7 +57,7 @@ export const LoginPage = () => { if (isAuthorized) return ; return ( - + { return ( + {/* Allow users to navigate around the app */} + + {/* Show message snackbar with notifications */} {isInitialized ? ( // If initialized, set up padding and scroll - + {/* Outlet is a react router component; it allows the router to choose the child based on the route */} diff --git a/client/src/theme.ts b/client/src/theme.ts index ca14eee..8966ade 100644 --- a/client/src/theme.ts +++ b/client/src/theme.ts @@ -14,13 +14,4 @@ export const THEME = createTheme({ paper: "#FAFAFA", }, }, - breakpoints: { - values: { - xs: 0, - sm: 350, - md: 900, - lg: 1200, - xl: 1536, - }, - }, }); diff --git a/client/src/types.ts b/client/src/types.ts deleted file mode 100644 index 602697b..0000000 --- a/client/src/types.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface SemossFile { - Path: string; - Name: string; - Size: number; // TBD -} - -export interface Engine { - app_id: string; - app_name: string; -} From 8e35681613f2015e9e2a7aa5c42ecef6211311b6 Mon Sep 17 00:00:00 2001 From: Van Buren Date: Mon, 24 Nov 2025 12:17:32 -0600 Subject: [PATCH 03/13] feat: restore be --- java/src/reactors/AbstractProjectReactor.java | 16 +- .../AskStorageDocumentsReactor.java | 163 ---------------- .../digitalvault/AskStorageReactor.java | 34 ---- .../GetRelevantStorageDocumentsReactor.java | 182 ------------------ .../reactors/examples/CallPythonReactor.java | 109 +++++++++++ .../reactors/examples/HelloUserReactor.java | 64 ++++++ py/nthFibonacci.py | 14 ++ 7 files changed, 192 insertions(+), 390 deletions(-) delete mode 100644 java/src/reactors/digitalvault/AskStorageDocumentsReactor.java delete mode 100644 java/src/reactors/digitalvault/AskStorageReactor.java delete mode 100644 java/src/reactors/digitalvault/GetRelevantStorageDocumentsReactor.java create mode 100644 java/src/reactors/examples/CallPythonReactor.java create mode 100644 java/src/reactors/examples/HelloUserReactor.java create mode 100644 py/nthFibonacci.py diff --git a/java/src/reactors/AbstractProjectReactor.java b/java/src/reactors/AbstractProjectReactor.java index f4eca58..d6039f0 100644 --- a/java/src/reactors/AbstractProjectReactor.java +++ b/java/src/reactors/AbstractProjectReactor.java @@ -7,8 +7,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import prerna.auth.User; -import prerna.engine.impl.model.Room; -import prerna.engine.impl.model.RoomUtils; import prerna.reactor.AbstractReactor; import prerna.sablecc2.om.GenRowStruct; import prerna.sablecc2.om.PixelDataType; @@ -45,12 +43,12 @@ public abstract class AbstractProjectReactor extends AbstractReactor { /** Project-specific properties and configuration settings. */ protected ProjectProperties projectProperties; + // TODO: Initialize additional protected variables (engines, external services, + // etc.) + /** The result of the reactor execution, containing the output data and metadata. */ protected NounMetadata result = null; - /** The room context for this reactor execution. */ - protected Room room; - /** * Executes the reactor with standardized error handling and logging. This method orchestrates the * reactor execution by calling {@link #preExecute()} for setup and then {@link #doExecute()} for @@ -97,14 +95,10 @@ protected void preExecute() { projectId = this.insight.getProjectId(); } - // if there is not yet a room with the same id as this insight, create a new - // room for this insight - room = RoomUtils.createRoomIfNotExists(null, insight, null, "Room " + insight.getInsightId()); - // set the folder path for the insight - this.insight.setInsightFolder(room.getRoomFolderPath()); - projectProperties = ProjectProperties.getInstance(projectId); + // TODO: Initialize additional resources (engines, external services, etc.) + user = this.insight.getUser(); organizeKeys(); } diff --git a/java/src/reactors/digitalvault/AskStorageDocumentsReactor.java b/java/src/reactors/digitalvault/AskStorageDocumentsReactor.java deleted file mode 100644 index 1ca497e..0000000 --- a/java/src/reactors/digitalvault/AskStorageDocumentsReactor.java +++ /dev/null @@ -1,163 +0,0 @@ -package reactors.digitalvault; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import org.apache.commons.lang.StringEscapeUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import prerna.auth.utils.SecurityEngineUtils; -import prerna.engine.api.IModelEngine; -import prerna.engine.api.IStorageEngine; -import prerna.engine.impl.model.message.InputMessage; -import prerna.engine.impl.model.message.ResponseMessage; -import prerna.sablecc2.om.GenRowStruct; -import prerna.sablecc2.om.PixelDataType; -import prerna.sablecc2.om.PixelOperationType; -import prerna.sablecc2.om.ReactorKeysEnum; -import prerna.sablecc2.om.nounmeta.NounMetadata; -import prerna.util.Constants; -import prerna.util.UploadInputUtility; -import prerna.util.Utility; -import reactors.AbstractProjectReactor; - -public class AskStorageDocumentsReactor extends AbstractProjectReactor { - - private static final Logger classLogger = LogManager.getLogger(AskStorageDocumentsReactor.class); - private static final Set SUPPORTED_IMAGE_TYPES = Set.of("jpg", "jpeg", "png"); - - public AskStorageDocumentsReactor() { - this.keysToGet = - new String[] { - ReactorKeysEnum.STORAGE.getKey(), - ReactorKeysEnum.STORAGE_PATH.getKey(), - ReactorKeysEnum.SPACE.getKey(), - ReactorKeysEnum.MODEL.getKey(), - ReactorKeysEnum.FILE_PATH.getKey() - }; - this.keyRequired = new int[] {1, 0, 1, 1, 1}; - } - - @Override - public NounMetadata doExecute() { - String storageEngineId = this.keyValue.get(ReactorKeysEnum.STORAGE.getKey()); - String modelId = this.keyValue.get(ReactorKeysEnum.MODEL.getKey()); - if (!SecurityEngineUtils.userCanViewEngine(user, storageEngineId)) { - throw new SecurityException( - "User does not have permission to access the specified storage engine: " - + storageEngineId); - } - if (!SecurityEngineUtils.userCanViewEngine(user, modelId)) { - throw new SecurityException( - "User does not have permission to access the specified model engine: " + modelId); - } - IStorageEngine storage = getStorage(); - IModelEngine modelEngine = Utility.getModel(modelId); - - List storagePaths = getStringListFromKey(ReactorKeysEnum.STORAGE_PATH); - - List invalidFiles = new ArrayList<>(); - List downloadedFiles = new ArrayList<>(); - for (String storagePath : storagePaths) { - - String fileLocation = - Utility.normalizePath(UploadInputUtility.getFilePath(this.store, this.insight)); - if (!(new File(fileLocation).isDirectory())) { - new File(fileLocation).mkdirs(); - } - - String fileExtension = storagePath.substring(storagePath.lastIndexOf('.') + 1).toLowerCase(); - if (!SUPPORTED_IMAGE_TYPES.contains(fileExtension)) { - invalidFiles.add(storagePath); - continue; - } - - try { - storage.copyToLocal(storagePath, fileLocation); - downloadedFiles.add(storagePath); - } catch (Exception e) { - classLogger.error(Constants.STACKTRACE, e); - throw new IllegalArgumentException("Error occurred downloading storage file to local"); - } - } - - classLogger.warn("Invalid file types skipped: " + String.join(", ", invalidFiles)); - - String builtPrompt = - """ - You are an expert OCR assistant. - Your task is to accurately extract all text from image files provided as input. - Organize the extracted text under clear section labels based on each image (e.g., 'filename1', 'filename2', etc.). - Maintain the logical order and formatting of the original text as closely as possible. - If an image contains no readable text, state 'No text found.' - Do not merge or combine text between different images. - """; - - InputMessage msg; - msg = - InputMessage.builder(room) - .withInputUIPrompt(StringEscapeUtils.escapeJava(builtPrompt)) - .withInputPrompt(StringEscapeUtils.escapeJava(builtPrompt)) - .withModelType(modelEngine.getModelType()) - .withImages(downloadedFiles, room) - .build(); - - ResponseMessage response = room.ask(msg, modelEngine); - - return new NounMetadata(response, PixelDataType.MAP, PixelOperationType.OPERATION); - } - - private IStorageEngine getStorage() { - - GenRowStruct grs = this.store.getGenRowStruct(ReactorKeysEnum.STORAGE.getKey()); - if (grs != null && !grs.isEmpty()) { - IStorageEngine storage = null; - if (grs.get(0) instanceof String) { - storage = (IStorageEngine) Utility.getStorage((String) grs.get(0)); - } else { - storage = (IStorageEngine) grs.get(0); - } - return storage; - } - - List storageInputs = this.curRow.getNounsOfType(PixelDataType.STORAGE); - if (storageInputs != null && !storageInputs.isEmpty()) { - return (IStorageEngine) storageInputs.get(0).getValue(); - } - - throw new NullPointerException("No storage engine defined"); - } - - public List getStringListFromKey(ReactorKeysEnum enumValue) { - List inputStrings = new ArrayList<>(); - GenRowStruct grs = this.store.getGenRowStruct(enumValue.getKey()); - if (grs != null && !grs.isEmpty()) { - int size = grs.size(); - for (int i = 0; i < size; i++) inputStrings.add(grs.get(i).toString()); - return inputStrings; - } - int size = this.curRow.size(); - for (int i = 0; i < size; i++) inputStrings.add(this.curRow.get(i).toString()); - return inputStrings; - } - - @Override - public String getReactorDescription() { - return "Pull files from a storage path to a local path"; - } - - @Override - protected String getDescriptionForKey(String key) { - if (key.equals(ReactorKeysEnum.STORAGE.getKey())) { - return "The storage engine instance or id"; - } else if (key.equals(ReactorKeysEnum.STORAGE_PATH.getKey())) { - return "The storage path(s) to download from"; - } else if (key.equals(ReactorKeysEnum.FILE_PATH.getKey())) { - return "The local path to download files to. It should always be /"; - } else if (key.equals(ReactorKeysEnum.MODEL.getKey())) { - return "Vision model to process downloaded file"; - } - return super.getDescriptionForKey(key); - } -} diff --git a/java/src/reactors/digitalvault/AskStorageReactor.java b/java/src/reactors/digitalvault/AskStorageReactor.java deleted file mode 100644 index aa7c09d..0000000 --- a/java/src/reactors/digitalvault/AskStorageReactor.java +++ /dev/null @@ -1,34 +0,0 @@ -package reactors.digitalvault; - -import prerna.sablecc2.om.PixelDataType; -import prerna.sablecc2.om.ReactorKeysEnum; -import prerna.sablecc2.om.nounmeta.NounMetadata; -import reactors.AbstractProjectReactor; - -public class AskStorageReactor extends AbstractProjectReactor { - - public AskStorageReactor() { - this.keysToGet = new String[] {ReactorKeysEnum.COMMAND.getKey()}; - this.keyRequired = new int[] {0}; - } - - @Override - protected NounMetadata doExecute() { - return new NounMetadata("true", PixelDataType.CONST_STRING); - } - - @Override - public String getReactorDescription() { - return "This tool takes in a request for information and retrieves the relevant parsed text" - + " from the user's digital vault. For example, \"Find my proof of residence\" could" - + " return the text from a user's utility bills."; - } - - @Override - protected String getDescriptionForKey(String key) { - if (key.equals(ReactorKeysEnum.COMMAND.getKey())) { - return "The type of information to retrieve from the storage engine."; - } - return super.getDescriptionForKey(key); - } -} diff --git a/java/src/reactors/digitalvault/GetRelevantStorageDocumentsReactor.java b/java/src/reactors/digitalvault/GetRelevantStorageDocumentsReactor.java deleted file mode 100644 index d949415..0000000 --- a/java/src/reactors/digitalvault/GetRelevantStorageDocumentsReactor.java +++ /dev/null @@ -1,182 +0,0 @@ -package reactors.digitalvault; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import org.apache.commons.lang.StringEscapeUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import prerna.auth.utils.SecurityEngineUtils; -import prerna.engine.api.IModelEngine; -import prerna.engine.api.IStorageEngine; -import prerna.engine.impl.model.message.InputMessage; -import prerna.engine.impl.model.message.ResponseMessage; -import prerna.sablecc2.om.GenRowStruct; -import prerna.sablecc2.om.PixelDataType; -import prerna.sablecc2.om.PixelOperationType; -import prerna.sablecc2.om.ReactorKeysEnum; -import prerna.sablecc2.om.nounmeta.NounMetadata; -import prerna.util.Constants; -import prerna.util.Utility; -import reactors.AbstractProjectReactor; - -public class GetRelevantStorageDocumentsReactor extends AbstractProjectReactor { - - private static final Logger classLogger = - LogManager.getLogger(GetRelevantStorageDocumentsReactor.class); - private static final Set SUPPORTED_IMAGE_TYPES = Set.of("jpg", "jpeg", "png"); - - public GetRelevantStorageDocumentsReactor() { - this.keysToGet = - new String[] { - ReactorKeysEnum.STORAGE.getKey(), - ReactorKeysEnum.MODEL.getKey(), - ReactorKeysEnum.COMMAND.getKey(), - ReactorKeysEnum.STORAGE_PATH.getKey() - }; - this.keyRequired = new int[] {1, 1, 1, 0}; - } - - @Override - public NounMetadata doExecute() { - String storagePath = this.keyValue.get(ReactorKeysEnum.STORAGE_PATH.getKey()); - String storageEngineId = this.keyValue.get(ReactorKeysEnum.STORAGE.getKey()); - String modelId = this.keyValue.get(ReactorKeysEnum.MODEL.getKey()); - String command = this.keyValue.get(ReactorKeysEnum.COMMAND.getKey()); - if (!SecurityEngineUtils.userCanViewEngine(user, storageEngineId)) { - throw new SecurityException( - "User does not have permission to access the specified storage engine: " - + storageEngineId); - } - if (!SecurityEngineUtils.userCanViewEngine(user, modelId)) { - throw new SecurityException( - "User does not have permission to access the specified model engine: " + modelId); - } - IStorageEngine storage = getStorage(); - IModelEngine modelEngine = Utility.getModel(modelId); - - if (storagePath == null || storagePath.isEmpty()) { - storagePath = "/"; - } - - List invalidFiles = new ArrayList<>(); - List validFiles = new ArrayList<>(); - - List storageList = new ArrayList<>(); - - try { - storageList = storage.list(storagePath); - } catch (Exception e) { - classLogger.error(Constants.STACKTRACE, e); - throw new IllegalArgumentException("Error listing storage details at path " + storagePath); - } - - for (String filePath : storageList) { - String fileExtension = filePath.substring(filePath.lastIndexOf('.') + 1).toLowerCase(); - if (SUPPORTED_IMAGE_TYPES.contains(fileExtension)) { - validFiles.add(filePath); - } else { - invalidFiles.add(filePath); - } - } - - classLogger.warn("Invalid file types skipped: " + String.join(", ", invalidFiles)); - - String systemPrompt = - """ - Given the following list of files, return ONLY the filenames that are relevant to the user's prompt. - Respond with an array of strings containing exactly the relevant filenames, and nothing else—no explanations or extra text. - If there are no relevant files, return an empty array. - List of Files: - [Insert your file list here, e.g., "report.pdf", "summary.docx", "2023_financials.xlsx", ...] - User Prompt: - [Insert your user's specific prompt here, e.g., "Show me all files related to 2023 financials"] - Only output the array, e.g. - ["2023_financials.xlsx", "report.pdf"] - """; - - command += - "\n\nHere is the list of available files:\n" - + String.join("\n", validFiles) - + "\n\n" - + "From the above list, identify and return ONLY the filenames that are relevant to my" - + " prompt. Respond with an array of strings containing exactly the relevant filenames," - + " and nothing else."; - - InputMessage msg; - msg = - InputMessage.builder(room) - .withInputUIPrompt(StringEscapeUtils.escapeJava(command)) - .withInputPrompt(StringEscapeUtils.escapeJava(command)) - .withSystemPrompt(StringEscapeUtils.escapeJava(systemPrompt)) - .withModelType(modelEngine.getModelType()) - .build(); - - ResponseMessage response = room.ask(msg, modelEngine); - - String responseString = response.getContent(); - List docList = new ArrayList<>(); - try { - Gson gson = new Gson(); - docList = gson.fromJson(responseString, new TypeToken>() {}.getType()); - } catch (Exception e) { - classLogger.error(Constants.STACKTRACE, e); - throw new IllegalArgumentException("Error parsing model response: " + responseString); - } - - return new NounMetadata(docList, PixelDataType.VECTOR, PixelOperationType.OPERATION); - } - - private IStorageEngine getStorage() { - - GenRowStruct grs = this.store.getGenRowStruct(ReactorKeysEnum.STORAGE.getKey()); - if (grs != null && !grs.isEmpty()) { - IStorageEngine storage = null; - if (grs.get(0) instanceof String) { - storage = (IStorageEngine) Utility.getStorage((String) grs.get(0)); - } else { - storage = (IStorageEngine) grs.get(0); - } - return storage; - } - - List storageInputs = this.curRow.getNounsOfType(PixelDataType.STORAGE); - if (storageInputs != null && !storageInputs.isEmpty()) { - return (IStorageEngine) storageInputs.get(0).getValue(); - } - - throw new NullPointerException("No storage engine defined"); - } - - public List getStringListFromKey(ReactorKeysEnum enumValue) { - List inputStrings = new ArrayList<>(); - GenRowStruct grs = this.store.getGenRowStruct(enumValue.getKey()); - if (grs != null && !grs.isEmpty()) { - int size = grs.size(); - for (int i = 0; i < size; i++) inputStrings.add(grs.get(i).toString()); - return inputStrings; - } - int size = this.curRow.size(); - for (int i = 0; i < size; i++) inputStrings.add(this.curRow.get(i).toString()); - return inputStrings; - } - - @Override - public String getReactorDescription() { - return "Pull files from a storage path to a local path"; - } - - @Override - protected String getDescriptionForKey(String key) { - if (key.equals(ReactorKeysEnum.STORAGE.getKey())) { - return "The storage engine instance or id"; - } else if (key.equals(ReactorKeysEnum.STORAGE_PATH.getKey())) { - return "The storage path(s) to download from"; - } else if (key.equals(ReactorKeysEnum.MODEL.getKey())) { - return "Vision model to process downloaded file"; - } - return super.getDescriptionForKey(key); - } -} diff --git a/java/src/reactors/examples/CallPythonReactor.java b/java/src/reactors/examples/CallPythonReactor.java new file mode 100644 index 0000000..ee92be4 --- /dev/null +++ b/java/src/reactors/examples/CallPythonReactor.java @@ -0,0 +1,109 @@ +package reactors.examples; + +import java.util.ArrayList; +import java.util.List; +import prerna.ds.py.PyTranslator; +import prerna.sablecc2.om.PixelDataType; +import prerna.sablecc2.om.ReactorKeysEnum; +import prerna.sablecc2.om.nounmeta.NounMetadata; +import reactors.AbstractProjectReactor; + +/** + * Reactor implementation that bridges Java reactor execution with an external Python helper + * function. This reactor expects a single numeric input and invokes a Python module function ( + * nthFibonacci) to compute the Nth Fibonacci number, returning the result. + * + *

Execution flow: + * + *

    + *
  • Validates and retrieves the required numeric input key ({@link + * ReactorKeysEnum#NUMERIC_VALUE}). + *
  • Loads the Python source file (nthFibonacci.py) into a runtime module via + * {@link PyTranslator}. + *
  • Invokes the Python function nthFibonacci with the provided argument list. + *
  • Wraps and returns the Python response inside a {@link NounMetadata} result for downstream + * pixel operations. + *
+ * + *

This class extends {@link AbstractProjectReactor} and leverages its protected context members + * (such as {@code insight}, {@code user}, and parameter retrieval utilities) to access project and + * execution context seamlessly. + * + * @see {@link AbstractProjectReactor} for base reactor lifecycle and error handling. + * @see {@link #doExecute()} for detailed per-execution business logic. + */ +public class CallPythonReactor extends AbstractProjectReactor { + + // Note: Has access to protected variables defined in AbstractProjectReactor + + /** + * Constructs a new {@link CallPythonReactor} configuring the required input keys for execution. + * The reactor requires one numeric value key which represents the target index (N) for the + * Fibonacci computation. + * + *

Key configuration details: + * + *

    + *
  • {@link ReactorKeysEnum#NUMERIC_VALUE} - Required (denoted by 1 in {@code keyRequired}). + *
+ * + * @see {@link CallPythonReactor} for overall reactor purpose. + */ + public CallPythonReactor() { + + // list of keys the reactor is expecting + this.keysToGet = new String[] {ReactorKeysEnum.NUMERIC_VALUE.getKey()}; + + // 1 for required keys, 0 for optional + this.keyRequired = new int[] {1}; + } + + /** + * Executes the Python-backed Fibonacci computation and returns the resulting number. This method + * performs all per-invocation logic: extracting the input numeric key, loading the Python module + * file, invoking the target function, and wrapping the response. + * + *

Processing steps: + * + *

    + *
  • Extract input N from {@link ReactorKeysEnum#NUMERIC_VALUE}. + *
  • Resolve project context ID (fallback to {@code insight.getProjectId()} when necessary). + *
  • Load nthFibonacci.py as a module using {@link PyTranslator}. + *
  • Invoke the Python function nthFibonacci with a single argument list holding + * N. + *
  • Wrap the returned Python object inside {@link NounMetadata} with type {@link + * PixelDataType#CONST_STRING}. + *
+ * + * @return A {@link NounMetadata} representing the computed Fibonacci value as a constant string. + * @see {@link AbstractProjectReactor#doExecute()} for overarching execution contract. + */ + @Override + protected NounMetadata doExecute() { + // grab the input number + int inputNum = Integer.parseInt(this.keyValue.get(ReactorKeysEnum.NUMERIC_VALUE.getKey())); + + // define the file to grab the helper function from + String sourceFile = "nthFibonacci.py"; + + PyTranslator pt = this.insight.getPyTranslator(); + + String projectId = this.insight.getContextProjectId(); + if (projectId == null) { + projectId = this.insight.getProjectId(); + } + + String fibonacciModule = pt.loadPythonModuleFromFile(this.insight, sourceFile, projectId); + + String functionName = "nthFibonacci"; + + // define the arguments to be passed to the function + List argsList = new ArrayList<>(); + argsList.add(inputNum); + + Object pyResponse = + pt.runFunctionFromLoadedModule(this.insight, fibonacciModule, functionName, argsList); + + return new NounMetadata(pyResponse, PixelDataType.CONST_STRING); + } +} diff --git a/java/src/reactors/examples/HelloUserReactor.java b/java/src/reactors/examples/HelloUserReactor.java new file mode 100644 index 0000000..727aa6a --- /dev/null +++ b/java/src/reactors/examples/HelloUserReactor.java @@ -0,0 +1,64 @@ +package reactors.examples; + +import prerna.sablecc2.om.PixelDataType; +import prerna.sablecc2.om.ReactorKeysEnum; +import prerna.sablecc2.om.nounmeta.NounMetadata; +import reactors.AbstractProjectReactor; + +/** + * Example reactor that demonstrates basic functionality by greeting a user. This reactor accepts an + * optional name parameter and returns a personalized greeting message. If no name is provided, it + * uses the current user's name from the authentication context. + * + *

This class serves as a simple example of how to extend {@link AbstractProjectReactor} and + * implement basic parameter handling and user context access. + * + * @see {@link AbstractProjectReactor} for base reactor functionality + */ +public class HelloUserReactor extends AbstractProjectReactor { + + // Note: Has access to protected variables defined in AbstractProjectReactor + + /** + * Constructs a HelloUserReactor and configures its expected input parameters. This constructor + * sets up the reactor to accept an optional "name" parameter. + */ + public HelloUserReactor() { + + // list of keys the reactor is expecting + this.keysToGet = new String[] {ReactorKeysEnum.NAME.getKey()}; + + // 1 for required keys, 0 for optional + this.keyRequired = new int[] {0}; + } + + /** + * Executes the main logic of the HelloUserReactor to generate a personalized greeting. This + * method retrieves the optional name parameter and creates a welcome message. If no name + * parameter is provided, it defaults to using the current authenticated user's name. + * + *

The method demonstrates how to: + * + *

    + *
  • Access optional parameters using {@link ReactorKeysEnum} + *
  • Use the protected {@code user} variable from {@link AbstractProjectReactor} + *
  • Return string results wrapped in {@link NounMetadata} + *
+ * + * @return A {@link NounMetadata} containing the greeting message as a constant string + */ + @Override + protected NounMetadata doExecute() { + + // returns null if the argument is not found + String name = this.keyValue.get(ReactorKeysEnum.NAME.getKey()); + + // if name is not provided, use the user's name + name = (name == null) ? user.getPrimaryLoginToken().getName() : name; + + // grabbing user from AbstractProjectReactor + String response = "Hello, " + name + "! Welcome to SEMOSS."; + + return new NounMetadata(response, PixelDataType.CONST_STRING); + } +} diff --git a/py/nthFibonacci.py b/py/nthFibonacci.py new file mode 100644 index 0000000..f39fca0 --- /dev/null +++ b/py/nthFibonacci.py @@ -0,0 +1,14 @@ +# sample python function that finds the nth fibonacci number +def nthFibonacci(n: int) -> int: + if n <= 1: + return n + + dp = [0] * (n + 1) + + dp[0] = 0 + dp[1] = 1 + + for i in range(2, n + 1): + dp[i] = dp[i - 1] + dp[i - 2] + + return dp[n] From 3677c28e453ad2a08b3dd66490e53518d86fa9db Mon Sep 17 00:00:00 2001 From: Van Buren Date: Mon, 24 Nov 2025 12:22:04 -0600 Subject: [PATCH 04/13] feat: add dummy reactor --- .../reactors/examples/OpenMCPAppReactor.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 java/src/reactors/examples/OpenMCPAppReactor.java diff --git a/java/src/reactors/examples/OpenMCPAppReactor.java b/java/src/reactors/examples/OpenMCPAppReactor.java new file mode 100644 index 0000000..bceb012 --- /dev/null +++ b/java/src/reactors/examples/OpenMCPAppReactor.java @@ -0,0 +1,32 @@ +package reactors.examples; + +import prerna.sablecc2.om.PixelDataType; +import prerna.sablecc2.om.nounmeta.NounMetadata; +import reactors.AbstractProjectReactor; + +/** + * Dummy reactor that allows Playground to open the MCP App interface. + * + * @see {@link AbstractProjectReactor} for base reactor functionality + */ +public class OpenMCPAppReactor extends AbstractProjectReactor { + + /** + * Executes the main logic of the OpenMCPAppReactor to return a default message. This method + * currently serves as a placeholder and returns a constant string indicating that the + * auto-execute response has not yet been implemented. + * + * @return A {@link NounMetadata} containing the greeting message as a constant string + */ + @Override + protected NounMetadata doExecute() { + return new NounMetadata( + "This MCP tool's auto-execute response has not yet been implemented.", + PixelDataType.CONST_STRING); + } + + @Override + public String getReactorDescription() { + return "This tool allows the user to interact with the SEMOSS Template application."; + } +} From 6fc9cdc2a88e6ec6e2af4455071dee06ea235748 Mon Sep 17 00:00:00 2001 From: Van Buren Date: Mon, 24 Nov 2025 12:56:09 -0600 Subject: [PATCH 05/13] feat: mcp --- client/pnpm-lock.yaml | 10 +++++----- .../reactors/examples/OpenMCPAppReactor.java | 9 +++++++++ mcp/pixel_mcp.json | 18 ++++++------------ 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml index ea9373a..439f20c 100644 --- a/client/pnpm-lock.yaml +++ b/client/pnpm-lock.yaml @@ -27,8 +27,8 @@ importers: specifier: ^8.17.0 version: 8.17.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(dayjs@1.11.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@semoss/sdk': - specifier: file:../../../../../../../apache-tomcat-9.0.102/webapps/SemossWeb/libs/sdk - version: file:../../../../../../../apache-tomcat-9.0.102/webapps/SemossWeb/libs/sdk(react@18.3.1) + specifier: 1.0.0-beta.31 + version: 1.0.0-beta.31(react@18.3.1) dayjs: specifier: ^1.11.19 version: 1.11.19 @@ -652,8 +652,8 @@ packages: cpu: [x64] os: [win32] - '@semoss/sdk@file:../../../../../../../apache-tomcat-9.0.102/webapps/SemossWeb/libs/sdk': - resolution: {directory: ../../../../../../../apache-tomcat-9.0.102/webapps/SemossWeb/libs/sdk, type: directory} + '@semoss/sdk@1.0.0-beta.31': + resolution: {integrity: sha512-JIo4TvJvYhkw1aa3DsQ1rEC4zJXF9Qp7ImcdyrRTZpTXC1mxzFB0tqUC4hCGSwrbXN79q20Qr+nxo2fyO7H2Rg==} peerDependencies: react: 18.3.1 peerDependenciesMeta: @@ -1585,7 +1585,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.53.2': optional: true - '@semoss/sdk@file:../../../../../../../apache-tomcat-9.0.102/webapps/SemossWeb/libs/sdk(react@18.3.1)': + '@semoss/sdk@1.0.0-beta.31(react@18.3.1)': optionalDependencies: react: 18.3.1 diff --git a/java/src/reactors/examples/OpenMCPAppReactor.java b/java/src/reactors/examples/OpenMCPAppReactor.java index bceb012..9b07a8d 100644 --- a/java/src/reactors/examples/OpenMCPAppReactor.java +++ b/java/src/reactors/examples/OpenMCPAppReactor.java @@ -11,6 +11,15 @@ */ public class OpenMCPAppReactor extends AbstractProjectReactor { + /** Constructs a OpenMCPAppReactor. This constructor does not expect any input parameters. */ + public OpenMCPAppReactor() { + // list of keys the reactor is expecting + this.keysToGet = new String[] {}; + + // 1 for required keys, 0 for optional + this.keyRequired = new int[] {}; + } + /** * Executes the main logic of the OpenMCPAppReactor to return a default message. This method * currently serves as a placeholder and returns a constant string indicating that the diff --git a/mcp/pixel_mcp.json b/mcp/pixel_mcp.json index 80dff5b..8d00bc1 100644 --- a/mcp/pixel_mcp.json +++ b/mcp/pixel_mcp.json @@ -1,23 +1,17 @@ { - "_meta": { "last_modified_date": "2025-11-20" }, + "_meta": { "last_modified_date": "2025-11-24" }, "tools": [ { "inputSchema": { "type": "object", - "title": "AskStorage_Arguments", - "properties": { - "command": { - "description": "The type of information to retrieve from the storage engine.", - "title": "command", - "type": "string" - } - }, + "title": "OpenMCPApp_Arguments", + "properties": {}, "required": [] }, - "name": "AskStorage", - "description": "This tool takes in a request for information and retrieves the relevant parsed text from the user's digital vault. For example, \"Find my proof of residence\" could return the text from a user's utility bills.", + "name": "OpenMCPApp", + "description": "This tool allows the user to interact with the SEMOSS Template application.", "_meta": { "SMSS_MCP_EXECUTION": "ask" }, - "title": "Ask Storage" + "title": "Open MCP App" } ] } From 9b465070272c27987475f1bfa14a8d993226d82c Mon Sep 17 00:00:00 2001 From: Thomas Van Buren Date: Mon, 24 Nov 2025 14:09:29 -0500 Subject: [PATCH 06/13] Delete client/.DS_Store --- client/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 client/.DS_Store diff --git a/client/.DS_Store b/client/.DS_Store deleted file mode 100644 index d58a3eab9dcf338529628fc1eac1658ce22d52d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKOHRWu5Pj1|s1+Y|$ubup5;sVzbislRTmYIv1*8e$C$Y<(J8%Wg#|qxqRz+O8 zMSy0c@r&(wllVo-WB|zIaefGl01W7gy&;EhO!w8-tQS_ch@v@;s-~P(&5UzRX!iRR z(07+0!v$(QMelFSz3ju8JID@hagGu<92aC{xW+vi)LovuM7%xnYWflfs2HyqGCVWO z5>>=~kGMmeV2Uvc91}A#=3Pc_5i$CFraP3~C}sd&zno2ZlGo@c{p@D?#S zH8TZF0aM_QE5MqqHrV!PqbXntm;x&W^!t#~74v|tNB8OA;93A;!ewW?cEA3_R2PVO zz}6#IXyU0vPnFPONa!5I)489A_|~JRL)@L2C)`;=ha#czkko}ka*sBe0;WJ$fxe%P zwEj;w_y1jz%}fDP;9n^qNpV_Cc%)EU*AAz(Hl?4@)ikd4xT5gFm14$fDc+|$<9ezW V#5`c@kt;O&5pXitU<&-G0-v{0Ue^Es From 58e95d555d02ae1eb9e0ead64b9608d0698bf946 Mon Sep 17 00:00:00 2001 From: Van Buren Date: Mon, 24 Nov 2025 13:09:56 -0600 Subject: [PATCH 07/13] fix: ds store --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 612b62f..87f0cd9 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,7 @@ target/ *.local java/project.properties .admin/ -.DS_Store +**/.DS_Store **/.env !client/.env From 0c45e5e2e1c91e483f3677168f30e8612a85e6e6 Mon Sep 17 00:00:00 2001 From: Van Buren Date: Mon, 24 Nov 2025 13:12:38 -0600 Subject: [PATCH 08/13] feat: local files too --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 87f0cd9..7803f84 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ java/project.properties .admin/ **/.DS_Store **/.env +**/.env.* !client/.env # cache From 7009501155a11209ab154194936d96d866124119 Mon Sep 17 00:00:00 2001 From: Van Buren Date: Mon, 24 Nov 2025 13:17:11 -0600 Subject: [PATCH 09/13] feat: up --- biome.json | 2 +- client/package.json | 16 +- client/pnpm-lock.yaml | 470 ++++++++++++++++++++---------------------- package.json | 4 +- pnpm-lock.yaml | 86 ++++---- 5 files changed, 281 insertions(+), 297 deletions(-) diff --git a/biome.json b/biome.json index 4bff570..ab4c4ea 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.3.4/schema.json", + "$schema": "https://biomejs.dev/schemas/2.3.7/schema.json", "vcs": { "enabled": true, "clientKind": "git", diff --git a/client/package.json b/client/package.json index 8876cfb..3f5cd0d 100644 --- a/client/package.json +++ b/client/package.json @@ -10,20 +10,20 @@ "@emotion/styled": "^11.14.1", "@mui/icons-material": "^7.3.5", "@mui/material": "^7.3.5", - "@mui/x-data-grid": "^8.17.0", - "@mui/x-date-pickers": "^8.17.0", + "@mui/x-data-grid": "^8.19.0", + "@mui/x-date-pickers": "^8.19.0", "@semoss/sdk": "1.0.0-beta.31", "dayjs": "^1.11.19", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-router-dom": "^7.9.5" + "react-router-dom": "^7.9.6" }, "devDependencies": { - "@types/node": "^24.10.0", - "@types/react": "^18.3.26", - "@types/react-dom": "^18.3.7", - "@vitejs/plugin-react": "^5.1.0", + "@types/node": "^24.10.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "@vitejs/plugin-react": "^5.1.1", "typescript": "^5.9.3", - "vite": "^7.2.2" + "vite": "^7.2.4" } } diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml index 439f20c..13e20c9 100644 --- a/client/pnpm-lock.yaml +++ b/client/pnpm-lock.yaml @@ -10,22 +10,22 @@ importers: dependencies: '@emotion/react': specifier: ^11.14.0 - version: 11.14.0(@types/react@18.3.26)(react@18.3.1) + version: 11.14.0(@types/react@19.2.7)(react@18.3.1) '@emotion/styled': specifier: ^11.14.1 - version: 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) + version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) '@mui/icons-material': specifier: ^7.3.5 - version: 7.3.5(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) + version: 7.3.5(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) '@mui/material': specifier: ^7.3.5 - version: 7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/x-data-grid': - specifier: ^8.17.0 - version: 8.17.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^8.19.0 + version: 8.19.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/x-date-pickers': - specifier: ^8.17.0 - version: 8.17.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(dayjs@1.11.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^8.19.0 + version: 8.19.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(dayjs@1.11.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@semoss/sdk': specifier: 1.0.0-beta.31 version: 1.0.0-beta.31(react@18.3.1) @@ -39,27 +39,21 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) react-router-dom: - specifier: ^7.9.5 - version: 7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.9.6 + version: 7.9.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@types/node': - specifier: ^24.10.0 - version: 24.10.0 - '@types/react': - specifier: ^18.3.26 - version: 18.3.26 - '@types/react-dom': - specifier: ^18.3.7 - version: 18.3.7(@types/react@18.3.26) + specifier: ^24.10.1 + version: 24.10.1 '@vitejs/plugin-react': - specifier: ^5.1.0 - version: 5.1.0(vite@7.2.2(@types/node@24.10.0)(terser@5.44.0)) + specifier: ^5.1.1 + version: 5.1.1(vite@7.2.4(@types/node@24.10.1)(terser@5.44.0)) typescript: specifier: ^5.9.3 version: 5.9.3 vite: - specifier: ^7.2.2 - version: 7.2.2(@types/node@24.10.0)(terser@5.44.0) + specifier: ^7.2.4 + version: 7.2.4(@types/node@24.10.1)(terser@5.44.0) packages: @@ -470,8 +464,8 @@ packages: '@types/react': optional: true - '@mui/x-data-grid@8.17.0': - resolution: {integrity: sha512-eIzYM700Er5AKGS7T9NxQfpFNGpGP0NYpJ6RiQWSv904CkzAY0mbMZ6/XKldavbhSwzHVUfv37GK9mFeUl7I5g==} + '@mui/x-data-grid@8.19.0': + resolution: {integrity: sha512-jxt+d6Fms5Z/gPcSC6mpfCOsGw6YfKu7iiP8Q58RDPEh+I7C9XQfta7tPtNhcCNV1zJ7xBN7aQhslh8Rnadz5w==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.9.0 @@ -486,8 +480,8 @@ packages: '@emotion/styled': optional: true - '@mui/x-date-pickers@8.17.0': - resolution: {integrity: sha512-mrrkTJ1+r6MsPnKH/N5lCNJHkP0dZc2Fvd8fp5tyxa0jRyzwbxJKsadXooccoJWp65Z2vUjUuctXYUmubYP/Sg==} + '@mui/x-date-pickers@8.19.0': + resolution: {integrity: sha512-TQ4FsGUsiGJVs+Ie4q7nHXUmFqZADXL/1hVtZpOKsdr3WQXwpX7C5YmeakZGFR2NZnuv4snFj+WTee3kgyFbyQ==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.9.0 @@ -523,14 +517,14 @@ packages: moment-jalaali: optional: true - '@mui/x-internals@8.17.0': - resolution: {integrity: sha512-KvmR0PPX1j2i44y0DXwzs45jIPMu/YZYXYy7xvzo+ZNdYebbW5LbVeG4zdEUnKHyOG02oHdI7MM9AxcZE16TBw==} + '@mui/x-internals@8.19.0': + resolution: {integrity: sha512-mMmiyJAN5fW27srXJjhXhXJa+w2xGO45rwcjws6OQc9rdXGdJqRXhBwJd+OT7J1xwSdFIIUhjZRTz1KAfCSGBg==} engines: {node: '>=14.0.0'} peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@mui/x-virtualizer@0.2.7': - resolution: {integrity: sha512-xcdo+lvlfwuLE2FVAQtOEg078liB/aiVGjEuiyPv02Vzp8Y50qNH0EtV9lk/E/d/lbkkMGnapnk+JFT5HlUB0w==} + '@mui/x-virtualizer@0.2.9': + resolution: {integrity: sha512-++V8H8UQaDT2xsZn4eyNK4n55bsH9ncOuCatA238RptQa19uryLDVKqgSFhNbZ61aVUQ29Xel6q2rJVdS+J64Q==} engines: {node: '>=14.0.0'} peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -539,116 +533,116 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@rolldown/pluginutils@1.0.0-beta.43': - resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} + '@rolldown/pluginutils@1.0.0-beta.47': + resolution: {integrity: sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==} - '@rollup/rollup-android-arm-eabi@4.53.2': - resolution: {integrity: sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==} + '@rollup/rollup-android-arm-eabi@4.53.3': + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.2': - resolution: {integrity: sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==} + '@rollup/rollup-android-arm64@4.53.3': + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.2': - resolution: {integrity: sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==} + '@rollup/rollup-darwin-arm64@4.53.3': + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.2': - resolution: {integrity: sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==} + '@rollup/rollup-darwin-x64@4.53.3': + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.2': - resolution: {integrity: sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==} + '@rollup/rollup-freebsd-arm64@4.53.3': + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.2': - resolution: {integrity: sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==} + '@rollup/rollup-freebsd-x64@4.53.3': + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.2': - resolution: {integrity: sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==} + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.53.2': - resolution: {integrity: sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==} + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.53.2': - resolution: {integrity: sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==} + '@rollup/rollup-linux-arm64-gnu@4.53.3': + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.53.2': - resolution: {integrity: sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==} + '@rollup/rollup-linux-arm64-musl@4.53.3': + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.53.2': - resolution: {integrity: sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==} + '@rollup/rollup-linux-loong64-gnu@4.53.3': + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.53.2': - resolution: {integrity: sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==} + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.53.2': - resolution: {integrity: sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==} + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.53.2': - resolution: {integrity: sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==} + '@rollup/rollup-linux-riscv64-musl@4.53.3': + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.53.2': - resolution: {integrity: sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==} + '@rollup/rollup-linux-s390x-gnu@4.53.3': + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.53.2': - resolution: {integrity: sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==} + '@rollup/rollup-linux-x64-gnu@4.53.3': + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.53.2': - resolution: {integrity: sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==} + '@rollup/rollup-linux-x64-musl@4.53.3': + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.53.2': - resolution: {integrity: sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==} + '@rollup/rollup-openharmony-arm64@4.53.3': + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.2': - resolution: {integrity: sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==} + '@rollup/rollup-win32-arm64-msvc@4.53.3': + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.2': - resolution: {integrity: sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==} + '@rollup/rollup-win32-ia32-msvc@4.53.3': + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.2': - resolution: {integrity: sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==} + '@rollup/rollup-win32-x64-gnu@4.53.3': + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.2': - resolution: {integrity: sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==} + '@rollup/rollup-win32-x64-msvc@4.53.3': + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} cpu: [x64] os: [win32] @@ -675,8 +669,8 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/node@24.10.0': - resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==} + '@types/node@24.10.1': + resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -684,21 +678,16 @@ packages: '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - '@types/react-dom@18.3.7': - resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} - peerDependencies: - '@types/react': ^18.0.0 - '@types/react-transition-group@4.4.12': resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} peerDependencies: '@types/react': '*' - '@types/react@18.3.26': - resolution: {integrity: sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==} + '@types/react@19.2.7': + resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} - '@vitejs/plugin-react@5.1.0': - resolution: {integrity: sha512-4LuWrg7EKWgQaMJfnN+wcmbAW+VSsCmqGohftWjuct47bv8uE4n/nPpq4XjJPsxgq00GGG5J8dvBczp8uxScew==} + '@vitejs/plugin-react@5.1.1': + resolution: {integrity: sha512-WQfkSw0QbQ5aJ2CHYw23ZGkqnRwqKHD/KYsMeTkZzPT4Jcf0DcBxBtwMJxnu6E7oxw5+JC6ZAiePgh28uJ1HBA==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -712,12 +701,12 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} - baseline-browser-mapping@2.8.25: - resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==} + baseline-browser-mapping@2.8.31: + resolution: {integrity: sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==} hasBin: true - browserslist@4.27.0: - resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} + browserslist@4.28.0: + resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -728,8 +717,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001754: - resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} + caniuse-lite@1.0.30001757: + resolution: {integrity: sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==} clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} @@ -752,8 +741,8 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} dayjs@1.11.19: resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} @@ -770,8 +759,8 @@ packages: dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - electron-to-chromium@1.5.249: - resolution: {integrity: sha512-5vcfL3BBe++qZ5kuFhD/p8WOM1N9m3nwvJPULJx+4xf2usSlZFJ0qoNYO2fOX4hi3ocuDcmDobtA+5SFr4OmBg==} + electron-to-chromium@1.5.259: + resolution: {integrity: sha512-I+oLXgpEJzD6Cwuwt1gYjxsDmu/S/Kd41mmLA3O+/uH2pFRO/DvOjUyGozL8j3KeLV6WyZ7ssPwELMsXCcsJAQ==} error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} @@ -916,15 +905,15 @@ packages: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} - react-router-dom@7.9.5: - resolution: {integrity: sha512-mkEmq/K8tKN63Ae2M7Xgz3c9l9YNbY+NHH6NNeUmLA3kDkhKXRsNb/ZpxaEunvGo2/3YXdk5EJU3Hxp3ocaBPw==} + react-router-dom@7.9.6: + resolution: {integrity: sha512-2MkC2XSXq6HjGcihnx1s0DBWQETI4mlis4Ux7YTLvP67xnGxCvq+BcCQSO81qQHVUTM1V53tl4iVVaY5sReCOA==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' react-dom: '>=18' - react-router@7.9.5: - resolution: {integrity: sha512-JmxqrnBZ6E9hWmf02jzNn9Jm3UqyeimyiwzD69NjxGySG6lIz/1LVPsoTCwN7NBX2XjCEa1LIX5EMz1j2b6u6A==} + react-router@7.9.6: + resolution: {integrity: sha512-Y1tUp8clYRXpfPITyuifmSoE2vncSME18uVLgaqyxh9H35JWpIfzHo+9y3Fzh5odk/jxPW29IgLgzcdwxGqyNA==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' @@ -955,8 +944,8 @@ packages: engines: {node: '>= 0.4'} hasBin: true - rollup@4.53.2: - resolution: {integrity: sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==} + rollup@4.53.3: + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1020,8 +1009,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - vite@7.2.2: - resolution: {integrity: sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==} + vite@7.2.4: + resolution: {integrity: sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1109,7 +1098,7 @@ snapshots: dependencies: '@babel/compat-data': 7.28.5 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.27.0 + browserslist: 4.28.0 lru-cache: 5.1.1 semver: 6.3.1 @@ -1215,7 +1204,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1)': + '@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 @@ -1227,7 +1216,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.26 + '@types/react': 19.2.7 transitivePeerDependencies: - supports-color @@ -1237,22 +1226,22 @@ snapshots: '@emotion/memoize': 0.9.0 '@emotion/unitless': 0.10.0 '@emotion/utils': 1.4.2 - csstype: 3.1.3 + csstype: 3.2.3 '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1)': + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@19.2.7)(react@18.3.1) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) '@emotion/utils': 1.4.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.26 + '@types/react': 19.2.7 transitivePeerDependencies: - supports-color @@ -1371,145 +1360,145 @@ snapshots: '@mui/core-downloads-tracker@7.3.5': {} - '@mui/icons-material@7.3.5(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.26)(react@18.3.1)': + '@mui/icons-material@7.3.5(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@19.2.7)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.26 + '@types/react': 19.2.7 - '@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 '@mui/core-downloads-tracker': 7.3.5 - '@mui/system': 7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) - '@mui/types': 7.4.8(@types/react@18.3.26) - '@mui/utils': 7.3.5(@types/react@18.3.26)(react@18.3.1) + '@mui/system': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) + '@mui/types': 7.4.8(@types/react@19.2.7) + '@mui/utils': 7.3.5(@types/react@19.2.7)(react@18.3.1) '@popperjs/core': 2.11.8 - '@types/react-transition-group': 4.4.12(@types/react@18.3.26) + '@types/react-transition-group': 4.4.12(@types/react@19.2.7) clsx: 2.1.1 - csstype: 3.1.3 + csstype: 3.2.3 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 19.2.0 react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) - '@types/react': 18.3.26 + '@emotion/react': 11.14.0(@types/react@19.2.7)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) + '@types/react': 19.2.7 - '@mui/private-theming@7.3.5(@types/react@18.3.26)(react@18.3.1)': + '@mui/private-theming@7.3.5(@types/react@19.2.7)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.5(@types/react@18.3.26)(react@18.3.1) + '@mui/utils': 7.3.5(@types/react@19.2.7)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.26 + '@types/react': 19.2.7 - '@mui/styled-engine@7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 '@emotion/sheet': 1.4.0 - csstype: 3.1.3 + csstype: 3.2.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@19.2.7)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) - '@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1)': + '@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/private-theming': 7.3.5(@types/react@18.3.26)(react@18.3.1) - '@mui/styled-engine': 7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.4.8(@types/react@18.3.26) - '@mui/utils': 7.3.5(@types/react@18.3.26)(react@18.3.1) + '@mui/private-theming': 7.3.5(@types/react@19.2.7)(react@18.3.1) + '@mui/styled-engine': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.4.8(@types/react@19.2.7) + '@mui/utils': 7.3.5(@types/react@19.2.7)(react@18.3.1) clsx: 2.1.1 - csstype: 3.1.3 + csstype: 3.2.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) - '@types/react': 18.3.26 + '@emotion/react': 11.14.0(@types/react@19.2.7)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) + '@types/react': 19.2.7 - '@mui/types@7.4.8(@types/react@18.3.26)': + '@mui/types@7.4.8(@types/react@19.2.7)': dependencies: '@babel/runtime': 7.28.4 optionalDependencies: - '@types/react': 18.3.26 + '@types/react': 19.2.7 - '@mui/utils@7.3.5(@types/react@18.3.26)(react@18.3.1)': + '@mui/utils@7.3.5(@types/react@19.2.7)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/types': 7.4.8(@types/react@18.3.26) + '@mui/types': 7.4.8(@types/react@19.2.7) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-is: 19.2.0 optionalDependencies: - '@types/react': 18.3.26 + '@types/react': 19.2.7 - '@mui/x-data-grid@8.17.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-data-grid@8.19.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) - '@mui/utils': 7.3.5(@types/react@18.3.26)(react@18.3.1) - '@mui/x-internals': 8.17.0(@types/react@18.3.26)(react@18.3.1) - '@mui/x-virtualizer': 0.2.7(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) + '@mui/utils': 7.3.5(@types/react@19.2.7)(react@18.3.1) + '@mui/x-internals': 8.19.0(@types/react@19.2.7)(react@18.3.1) + '@mui/x-virtualizer': 0.2.9(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.6.0(react@18.3.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@19.2.7)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) transitivePeerDependencies: - '@types/react' - '@mui/x-date-pickers@8.17.0(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(dayjs@1.11.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-date-pickers@8.19.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(dayjs@1.11.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 7.3.5(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) - '@mui/utils': 7.3.5(@types/react@18.3.26)(react@18.3.1) - '@mui/x-internals': 8.17.0(@types/react@18.3.26)(react@18.3.1) - '@types/react-transition-group': 4.4.12(@types/react@18.3.26) + '@mui/material': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) + '@mui/utils': 7.3.5(@types/react@19.2.7)(react@18.3.1) + '@mui/x-internals': 8.19.0(@types/react@19.2.7)(react@18.3.1) + '@types/react-transition-group': 4.4.12(@types/react@19.2.7) clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@19.2.7)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) dayjs: 1.11.19 transitivePeerDependencies: - '@types/react' - '@mui/x-internals@8.17.0(@types/react@18.3.26)(react@18.3.1)': + '@mui/x-internals@8.19.0(@types/react@19.2.7)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.5(@types/react@18.3.26)(react@18.3.1) + '@mui/utils': 7.3.5(@types/react@19.2.7)(react@18.3.1) react: 18.3.1 reselect: 5.1.1 use-sync-external-store: 1.6.0(react@18.3.1) transitivePeerDependencies: - '@types/react' - '@mui/x-virtualizer@0.2.7(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-virtualizer@0.2.9(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.5(@types/react@18.3.26)(react@18.3.1) - '@mui/x-internals': 8.17.0(@types/react@18.3.26)(react@18.3.1) + '@mui/utils': 7.3.5(@types/react@19.2.7)(react@18.3.1) + '@mui/x-internals': 8.19.0(@types/react@19.2.7)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -1517,72 +1506,72 @@ snapshots: '@popperjs/core@2.11.8': {} - '@rolldown/pluginutils@1.0.0-beta.43': {} + '@rolldown/pluginutils@1.0.0-beta.47': {} - '@rollup/rollup-android-arm-eabi@4.53.2': + '@rollup/rollup-android-arm-eabi@4.53.3': optional: true - '@rollup/rollup-android-arm64@4.53.2': + '@rollup/rollup-android-arm64@4.53.3': optional: true - '@rollup/rollup-darwin-arm64@4.53.2': + '@rollup/rollup-darwin-arm64@4.53.3': optional: true - '@rollup/rollup-darwin-x64@4.53.2': + '@rollup/rollup-darwin-x64@4.53.3': optional: true - '@rollup/rollup-freebsd-arm64@4.53.2': + '@rollup/rollup-freebsd-arm64@4.53.3': optional: true - '@rollup/rollup-freebsd-x64@4.53.2': + '@rollup/rollup-freebsd-x64@4.53.3': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.2': + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.2': + '@rollup/rollup-linux-arm-musleabihf@4.53.3': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.2': + '@rollup/rollup-linux-arm64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.2': + '@rollup/rollup-linux-arm64-musl@4.53.3': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.2': + '@rollup/rollup-linux-loong64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.2': + '@rollup/rollup-linux-ppc64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.2': + '@rollup/rollup-linux-riscv64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.2': + '@rollup/rollup-linux-riscv64-musl@4.53.3': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.2': + '@rollup/rollup-linux-s390x-gnu@4.53.3': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.2': + '@rollup/rollup-linux-x64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-x64-musl@4.53.2': + '@rollup/rollup-linux-x64-musl@4.53.3': optional: true - '@rollup/rollup-openharmony-arm64@4.53.2': + '@rollup/rollup-openharmony-arm64@4.53.3': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.2': + '@rollup/rollup-win32-arm64-msvc@4.53.3': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.2': + '@rollup/rollup-win32-ia32-msvc@4.53.3': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.2': + '@rollup/rollup-win32-x64-gnu@4.53.3': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.2': + '@rollup/rollup-win32-x64-msvc@4.53.3': optional: true '@semoss/sdk@1.0.0-beta.31(react@18.3.1)': @@ -1612,7 +1601,7 @@ snapshots: '@types/estree@1.0.8': {} - '@types/node@24.10.0': + '@types/node@24.10.1': dependencies: undici-types: 7.16.0 @@ -1620,28 +1609,23 @@ snapshots: '@types/prop-types@15.7.15': {} - '@types/react-dom@18.3.7(@types/react@18.3.26)': + '@types/react-transition-group@4.4.12(@types/react@19.2.7)': dependencies: - '@types/react': 18.3.26 + '@types/react': 19.2.7 - '@types/react-transition-group@4.4.12(@types/react@18.3.26)': + '@types/react@19.2.7': dependencies: - '@types/react': 18.3.26 - - '@types/react@18.3.26': - dependencies: - '@types/prop-types': 15.7.15 - csstype: 3.1.3 + csstype: 3.2.3 - '@vitejs/plugin-react@5.1.0(vite@7.2.2(@types/node@24.10.0)(terser@5.44.0))': + '@vitejs/plugin-react@5.1.1(vite@7.2.4(@types/node@24.10.1)(terser@5.44.0))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) - '@rolldown/pluginutils': 1.0.0-beta.43 + '@rolldown/pluginutils': 1.0.0-beta.47 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.2.2(@types/node@24.10.0)(terser@5.44.0) + vite: 7.2.4(@types/node@24.10.1)(terser@5.44.0) transitivePeerDependencies: - supports-color @@ -1654,22 +1638,22 @@ snapshots: cosmiconfig: 7.1.0 resolve: 1.22.11 - baseline-browser-mapping@2.8.25: {} + baseline-browser-mapping@2.8.31: {} - browserslist@4.27.0: + browserslist@4.28.0: dependencies: - baseline-browser-mapping: 2.8.25 - caniuse-lite: 1.0.30001754 - electron-to-chromium: 1.5.249 + baseline-browser-mapping: 2.8.31 + caniuse-lite: 1.0.30001757 + electron-to-chromium: 1.5.259 node-releases: 2.0.27 - update-browserslist-db: 1.1.4(browserslist@4.27.0) + update-browserslist-db: 1.1.4(browserslist@4.28.0) buffer-from@1.1.2: optional: true callsites@3.1.0: {} - caniuse-lite@1.0.30001754: {} + caniuse-lite@1.0.30001757: {} clsx@2.1.1: {} @@ -1690,7 +1674,7 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - csstype@3.1.3: {} + csstype@3.2.3: {} dayjs@1.11.19: {} @@ -1701,9 +1685,9 @@ snapshots: dom-helpers@5.2.1: dependencies: '@babel/runtime': 7.28.4 - csstype: 3.1.3 + csstype: 3.2.3 - electron-to-chromium@1.5.249: {} + electron-to-chromium@1.5.259: {} error-ex@1.3.4: dependencies: @@ -1843,13 +1827,13 @@ snapshots: react-refresh@0.18.0: {} - react-router-dom@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router-dom@7.9.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router: 7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-router: 7.9.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router@7.9.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: cookie: 1.0.2 react: 18.3.1 @@ -1880,32 +1864,32 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - rollup@4.53.2: + rollup@4.53.3: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.2 - '@rollup/rollup-android-arm64': 4.53.2 - '@rollup/rollup-darwin-arm64': 4.53.2 - '@rollup/rollup-darwin-x64': 4.53.2 - '@rollup/rollup-freebsd-arm64': 4.53.2 - '@rollup/rollup-freebsd-x64': 4.53.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.2 - '@rollup/rollup-linux-arm-musleabihf': 4.53.2 - '@rollup/rollup-linux-arm64-gnu': 4.53.2 - '@rollup/rollup-linux-arm64-musl': 4.53.2 - '@rollup/rollup-linux-loong64-gnu': 4.53.2 - '@rollup/rollup-linux-ppc64-gnu': 4.53.2 - '@rollup/rollup-linux-riscv64-gnu': 4.53.2 - '@rollup/rollup-linux-riscv64-musl': 4.53.2 - '@rollup/rollup-linux-s390x-gnu': 4.53.2 - '@rollup/rollup-linux-x64-gnu': 4.53.2 - '@rollup/rollup-linux-x64-musl': 4.53.2 - '@rollup/rollup-openharmony-arm64': 4.53.2 - '@rollup/rollup-win32-arm64-msvc': 4.53.2 - '@rollup/rollup-win32-ia32-msvc': 4.53.2 - '@rollup/rollup-win32-x64-gnu': 4.53.2 - '@rollup/rollup-win32-x64-msvc': 4.53.2 + '@rollup/rollup-android-arm-eabi': 4.53.3 + '@rollup/rollup-android-arm64': 4.53.3 + '@rollup/rollup-darwin-arm64': 4.53.3 + '@rollup/rollup-darwin-x64': 4.53.3 + '@rollup/rollup-freebsd-arm64': 4.53.3 + '@rollup/rollup-freebsd-x64': 4.53.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 + '@rollup/rollup-linux-arm64-musl': 4.53.3 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 + '@rollup/rollup-linux-x64-gnu': 4.53.3 + '@rollup/rollup-linux-x64-musl': 4.53.3 + '@rollup/rollup-openharmony-arm64': 4.53.3 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 + '@rollup/rollup-win32-x64-gnu': 4.53.3 + '@rollup/rollup-win32-x64-msvc': 4.53.3 fsevents: 2.3.3 scheduler@0.23.2: @@ -1950,9 +1934,9 @@ snapshots: undici-types@7.16.0: {} - update-browserslist-db@1.1.4(browserslist@4.27.0): + update-browserslist-db@1.1.4(browserslist@4.28.0): dependencies: - browserslist: 4.27.0 + browserslist: 4.28.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -1960,16 +1944,16 @@ snapshots: dependencies: react: 18.3.1 - vite@7.2.2(@types/node@24.10.0)(terser@5.44.0): + vite@7.2.4(@types/node@24.10.1)(terser@5.44.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.53.2 + rollup: 4.53.3 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.0 + '@types/node': 24.10.1 fsevents: 2.3.3 terser: 5.44.0 diff --git a/package.json b/package.json index c87955c..9dd6b70 100644 --- a/package.json +++ b/package.json @@ -6,10 +6,10 @@ "javadoc": "mvn clean javadoc:javadoc && mvn site && pnpm exec http-server target/site/apidocs -p 1227 -a localhost -o" }, "devDependencies": { - "@biomejs/biome": "2.3.4", + "@biomejs/biome": "2.3.7", "http-server": "^14.1.1", "husky": "^9.1.7", - "lint-staged": "^16.2.6" + "lint-staged": "^16.2.7" }, "lint-staged": { "**/*.{js,jsx,ts,tsx,json,html,css}": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ff4e492..8a95e27 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: devDependencies: '@biomejs/biome': - specifier: 2.3.4 - version: 2.3.4 + specifier: 2.3.7 + version: 2.3.7 http-server: specifier: ^14.1.1 version: 14.1.1 @@ -18,60 +18,60 @@ importers: specifier: ^9.1.7 version: 9.1.7 lint-staged: - specifier: ^16.2.6 - version: 16.2.6 + specifier: ^16.2.7 + version: 16.2.7 packages: - '@biomejs/biome@2.3.4': - resolution: {integrity: sha512-TU08LXjBHdy0mEY9APtEtZdNQQijXUDSXR7IK1i45wgoPD5R0muK7s61QcFir6FpOj/RP1+YkPx5QJlycXUU3w==} + '@biomejs/biome@2.3.7': + resolution: {integrity: sha512-CTbAS/jNAiUc6rcq94BrTB8z83O9+BsgWj2sBCQg9rD6Wkh2gjfR87usjx0Ncx0zGXP1NKgT7JNglay5Zfs9jw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.3.4': - resolution: {integrity: sha512-w40GvlNzLaqmuWYiDU6Ys9FNhJiclngKqcGld3iJIiy2bpJ0Q+8n3haiaC81uTPY/NA0d8Q/I3Z9+ajc14102Q==} + '@biomejs/cli-darwin-arm64@2.3.7': + resolution: {integrity: sha512-LirkamEwzIUULhXcf2D5b+NatXKeqhOwilM+5eRkbrnr6daKz9rsBL0kNZ16Hcy4b8RFq22SG4tcLwM+yx/wFA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.3.4': - resolution: {integrity: sha512-3s7TLVtjJ7ni1xADXsS7x7GMUrLBZXg8SemXc3T0XLslzvqKj/dq1xGeBQ+pOWQzng9MaozfacIHdK2UlJ3jGA==} + '@biomejs/cli-darwin-x64@2.3.7': + resolution: {integrity: sha512-Q4TO633kvrMQkKIV7wmf8HXwF0dhdTD9S458LGE24TYgBjSRbuhvio4D5eOQzirEYg6eqxfs53ga/rbdd8nBKg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.3.4': - resolution: {integrity: sha512-IruVGQRwMURivWazchiq7gKAqZSFs5so6gi0hJyxk7x6HR+iwZbO2IxNOqyLURBvL06qkIHs7Wffl6Bw30vCbQ==} + '@biomejs/cli-linux-arm64-musl@2.3.7': + resolution: {integrity: sha512-/afy8lto4CB8scWfMdt+NoCZtatBUF62Tk3ilWH2w8ENd5spLhM77zKlFZEvsKJv9AFNHknMl03zO67CiklL2Q==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@2.3.4': - resolution: {integrity: sha512-y7efHyyM2gYmHy/AdWEip+VgTMe9973aP7XYKPzu/j8JxnPHuSUXftzmPhkVw0lfm4ECGbdBdGD6+rLmTgNZaA==} + '@biomejs/cli-linux-arm64@2.3.7': + resolution: {integrity: sha512-inHOTdlstUBzgjDcx0ge71U4SVTbwAljmkfi3MC5WzsYCRhancqfeL+sa4Ke6v2ND53WIwCFD5hGsYExoI3EZQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@2.3.4': - resolution: {integrity: sha512-mzKFFv/w66e4/jCobFmD3kymCqG+FuWE7sVa4Yjqd9v7qt2UhXo67MSZKY9Ih18V2IwPzRKQPCw6KwdZs6AXSA==} + '@biomejs/cli-linux-x64-musl@2.3.7': + resolution: {integrity: sha512-CQUtgH1tIN6e5wiYSJqzSwJumHYolNtaj1dwZGCnZXm2PZU1jOJof9TsyiP3bXNDb+VOR7oo7ZvY01If0W3iFQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@2.3.4': - resolution: {integrity: sha512-gKfjWR/6/dfIxPJCw8REdEowiXCkIpl9jycpNVHux8aX2yhWPLjydOshkDL6Y/82PcQJHn95VCj7J+BRcE5o1Q==} + '@biomejs/cli-linux-x64@2.3.7': + resolution: {integrity: sha512-fJMc3ZEuo/NaMYo5rvoWjdSS5/uVSW+HPRQujucpZqm2ZCq71b8MKJ9U4th9yrv2L5+5NjPF0nqqILCl8HY/fg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@2.3.4': - resolution: {integrity: sha512-5TJ6JfVez+yyupJ/iGUici2wzKf0RrSAxJhghQXtAEsc67OIpdwSKAQboemILrwKfHDi5s6mu7mX+VTCTUydkw==} + '@biomejs/cli-win32-arm64@2.3.7': + resolution: {integrity: sha512-aJAE8eCNyRpcfx2JJAtsPtISnELJ0H4xVVSwnxm13bzI8RwbXMyVtxy2r5DV1xT3WiSP+7LxORcApWw0LM8HiA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.3.4': - resolution: {integrity: sha512-FGCijXecmC4IedQ0esdYNlMpx0Jxgf4zceCaMu6fkjWyjgn50ZQtMiqZZQ0Q/77yqPxvtkgZAvt5uGw0gAAjig==} + '@biomejs/cli-win32-x64@2.3.7': + resolution: {integrity: sha512-pulzUshqv9Ed//MiE8MOUeeEkbkSHVDVY5Cz5wVAnH1DUqliCQG3j6s1POaITTFqFfo7AVIx2sWdKpx/GS+Nqw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -257,8 +257,8 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - lint-staged@16.2.6: - resolution: {integrity: sha512-s1gphtDbV4bmW1eylXpVMk2u7is7YsrLl8hzrtvC70h4ByhcMLZFY01Fx05ZUDNuv1H8HO4E+e2zgejV1jVwNw==} + lint-staged@16.2.7: + resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==} engines: {node: '>=20.17'} hasBin: true @@ -415,39 +415,39 @@ packages: snapshots: - '@biomejs/biome@2.3.4': + '@biomejs/biome@2.3.7': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.3.4 - '@biomejs/cli-darwin-x64': 2.3.4 - '@biomejs/cli-linux-arm64': 2.3.4 - '@biomejs/cli-linux-arm64-musl': 2.3.4 - '@biomejs/cli-linux-x64': 2.3.4 - '@biomejs/cli-linux-x64-musl': 2.3.4 - '@biomejs/cli-win32-arm64': 2.3.4 - '@biomejs/cli-win32-x64': 2.3.4 - - '@biomejs/cli-darwin-arm64@2.3.4': + '@biomejs/cli-darwin-arm64': 2.3.7 + '@biomejs/cli-darwin-x64': 2.3.7 + '@biomejs/cli-linux-arm64': 2.3.7 + '@biomejs/cli-linux-arm64-musl': 2.3.7 + '@biomejs/cli-linux-x64': 2.3.7 + '@biomejs/cli-linux-x64-musl': 2.3.7 + '@biomejs/cli-win32-arm64': 2.3.7 + '@biomejs/cli-win32-x64': 2.3.7 + + '@biomejs/cli-darwin-arm64@2.3.7': optional: true - '@biomejs/cli-darwin-x64@2.3.4': + '@biomejs/cli-darwin-x64@2.3.7': optional: true - '@biomejs/cli-linux-arm64-musl@2.3.4': + '@biomejs/cli-linux-arm64-musl@2.3.7': optional: true - '@biomejs/cli-linux-arm64@2.3.4': + '@biomejs/cli-linux-arm64@2.3.7': optional: true - '@biomejs/cli-linux-x64-musl@2.3.4': + '@biomejs/cli-linux-x64-musl@2.3.7': optional: true - '@biomejs/cli-linux-x64@2.3.4': + '@biomejs/cli-linux-x64@2.3.7': optional: true - '@biomejs/cli-win32-arm64@2.3.4': + '@biomejs/cli-win32-arm64@2.3.7': optional: true - '@biomejs/cli-win32-x64@2.3.4': + '@biomejs/cli-win32-x64@2.3.7': optional: true ansi-escapes@7.2.0: @@ -617,7 +617,7 @@ snapshots: is-number@7.0.0: {} - lint-staged@16.2.6: + lint-staged@16.2.7: dependencies: commander: 14.0.2 listr2: 9.0.5 From 5e72ef862f07db6865ca8d370cba1d055b34035f Mon Sep 17 00:00:00 2001 From: Van Buren Date: Mon, 24 Nov 2025 13:18:18 -0600 Subject: [PATCH 10/13] fix: react types --- client/package.json | 4 +- client/pnpm-lock.yaml | 150 +++++++++++++++++++++++------------------- 2 files changed, 85 insertions(+), 69 deletions(-) diff --git a/client/package.json b/client/package.json index 3f5cd0d..2c26b39 100644 --- a/client/package.json +++ b/client/package.json @@ -20,8 +20,8 @@ }, "devDependencies": { "@types/node": "^24.10.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "@types/react": "^18.3.27", + "@types/react-dom": "^18.3.7", "@vitejs/plugin-react": "^5.1.1", "typescript": "^5.9.3", "vite": "^7.2.4" diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml index 13e20c9..2b85a84 100644 --- a/client/pnpm-lock.yaml +++ b/client/pnpm-lock.yaml @@ -10,22 +10,22 @@ importers: dependencies: '@emotion/react': specifier: ^11.14.0 - version: 11.14.0(@types/react@19.2.7)(react@18.3.1) + version: 11.14.0(@types/react@18.3.27)(react@18.3.1) '@emotion/styled': specifier: ^11.14.1 - version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) + version: 11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1) '@mui/icons-material': specifier: ^7.3.5 - version: 7.3.5(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) + version: 7.3.5(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.27)(react@18.3.1) '@mui/material': specifier: ^7.3.5 - version: 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/x-data-grid': specifier: ^8.19.0 - version: 8.19.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 8.19.0(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/x-date-pickers': specifier: ^8.19.0 - version: 8.19.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(dayjs@1.11.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 8.19.0(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(dayjs@1.11.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@semoss/sdk': specifier: 1.0.0-beta.31 version: 1.0.0-beta.31(react@18.3.1) @@ -45,6 +45,12 @@ importers: '@types/node': specifier: ^24.10.1 version: 24.10.1 + '@types/react': + specifier: ^18.3.27 + version: 18.3.27 + '@types/react-dom': + specifier: ^18.3.7 + version: 18.3.7(@types/react@18.3.27) '@vitejs/plugin-react': specifier: ^5.1.1 version: 5.1.1(vite@7.2.4(@types/node@24.10.1)(terser@5.44.0)) @@ -678,13 +684,18 @@ packages: '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + '@types/react-transition-group@4.4.12': resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} peerDependencies: '@types/react': '*' - '@types/react@19.2.7': - resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} + '@types/react@18.3.27': + resolution: {integrity: sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==} '@vitejs/plugin-react@5.1.1': resolution: {integrity: sha512-WQfkSw0QbQ5aJ2CHYw23ZGkqnRwqKHD/KYsMeTkZzPT4Jcf0DcBxBtwMJxnu6E7oxw5+JC6ZAiePgh28uJ1HBA==} @@ -1204,7 +1215,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1)': + '@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 @@ -1216,7 +1227,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 18.3.27 transitivePeerDependencies: - supports-color @@ -1230,18 +1241,18 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1)': + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.14.0(@types/react@19.2.7)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.27)(react@18.3.1) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) '@emotion/utils': 1.4.2 react: 18.3.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 18.3.27 transitivePeerDependencies: - supports-color @@ -1360,23 +1371,23 @@ snapshots: '@mui/core-downloads-tracker@7.3.5': {} - '@mui/icons-material@7.3.5(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@19.2.7)(react@18.3.1)': + '@mui/icons-material@7.3.5(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.27)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 18.3.27 - '@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 '@mui/core-downloads-tracker': 7.3.5 - '@mui/system': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) - '@mui/types': 7.4.8(@types/react@19.2.7) - '@mui/utils': 7.3.5(@types/react@19.2.7)(react@18.3.1) + '@mui/system': 7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1) + '@mui/types': 7.4.8(@types/react@18.3.27) + '@mui/utils': 7.3.5(@types/react@18.3.27)(react@18.3.1) '@popperjs/core': 2.11.8 - '@types/react-transition-group': 4.4.12(@types/react@19.2.7) + '@types/react-transition-group': 4.4.12(@types/react@18.3.27) clsx: 2.1.1 csstype: 3.2.3 prop-types: 15.8.1 @@ -1385,20 +1396,20 @@ snapshots: react-is: 19.2.0 react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.7)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) - '@types/react': 19.2.7 + '@emotion/react': 11.14.0(@types/react@18.3.27)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 - '@mui/private-theming@7.3.5(@types/react@19.2.7)(react@18.3.1)': + '@mui/private-theming@7.3.5(@types/react@18.3.27)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.5(@types/react@19.2.7)(react@18.3.1) + '@mui/utils': 7.3.5(@types/react@18.3.27)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 18.3.27 - '@mui/styled-engine@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 '@emotion/cache': 11.14.0 @@ -1408,97 +1419,97 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.7)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.27)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1) - '@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1)': + '@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/private-theming': 7.3.5(@types/react@19.2.7)(react@18.3.1) - '@mui/styled-engine': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.4.8(@types/react@19.2.7) - '@mui/utils': 7.3.5(@types/react@19.2.7)(react@18.3.1) + '@mui/private-theming': 7.3.5(@types/react@18.3.27)(react@18.3.1) + '@mui/styled-engine': 7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.4.8(@types/react@18.3.27) + '@mui/utils': 7.3.5(@types/react@18.3.27)(react@18.3.1) clsx: 2.1.1 csstype: 3.2.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.7)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) - '@types/react': 19.2.7 + '@emotion/react': 11.14.0(@types/react@18.3.27)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 - '@mui/types@7.4.8(@types/react@19.2.7)': + '@mui/types@7.4.8(@types/react@18.3.27)': dependencies: '@babel/runtime': 7.28.4 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 18.3.27 - '@mui/utils@7.3.5(@types/react@19.2.7)(react@18.3.1)': + '@mui/utils@7.3.5(@types/react@18.3.27)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/types': 7.4.8(@types/react@19.2.7) + '@mui/types': 7.4.8(@types/react@18.3.27) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-is: 19.2.0 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 18.3.27 - '@mui/x-data-grid@8.19.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-data-grid@8.19.0(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) - '@mui/utils': 7.3.5(@types/react@19.2.7)(react@18.3.1) - '@mui/x-internals': 8.19.0(@types/react@19.2.7)(react@18.3.1) - '@mui/x-virtualizer': 0.2.9(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1) + '@mui/utils': 7.3.5(@types/react@18.3.27)(react@18.3.1) + '@mui/x-internals': 8.19.0(@types/react@18.3.27)(react@18.3.1) + '@mui/x-virtualizer': 0.2.9(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.6.0(react@18.3.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.7)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.27)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1) transitivePeerDependencies: - '@types/react' - '@mui/x-date-pickers@8.19.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(dayjs@1.11.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-date-pickers@8.19.0(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@mui/material@7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(dayjs@1.11.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 7.3.5(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) - '@mui/utils': 7.3.5(@types/react@19.2.7)(react@18.3.1) - '@mui/x-internals': 8.19.0(@types/react@19.2.7)(react@18.3.1) - '@types/react-transition-group': 4.4.12(@types/react@19.2.7) + '@mui/material': 7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 7.3.5(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1) + '@mui/utils': 7.3.5(@types/react@18.3.27)(react@18.3.1) + '@mui/x-internals': 8.19.0(@types/react@18.3.27)(react@18.3.1) + '@types/react-transition-group': 4.4.12(@types/react@18.3.27) clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.7)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@18.3.1))(@types/react@19.2.7)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.27)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.27)(react@18.3.1))(@types/react@18.3.27)(react@18.3.1) dayjs: 1.11.19 transitivePeerDependencies: - '@types/react' - '@mui/x-internals@8.19.0(@types/react@19.2.7)(react@18.3.1)': + '@mui/x-internals@8.19.0(@types/react@18.3.27)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.5(@types/react@19.2.7)(react@18.3.1) + '@mui/utils': 7.3.5(@types/react@18.3.27)(react@18.3.1) react: 18.3.1 reselect: 5.1.1 use-sync-external-store: 1.6.0(react@18.3.1) transitivePeerDependencies: - '@types/react' - '@mui/x-virtualizer@0.2.9(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-virtualizer@0.2.9(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.5(@types/react@19.2.7)(react@18.3.1) - '@mui/x-internals': 8.19.0(@types/react@19.2.7)(react@18.3.1) + '@mui/utils': 7.3.5(@types/react@18.3.27)(react@18.3.1) + '@mui/x-internals': 8.19.0(@types/react@18.3.27)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -1609,12 +1620,17 @@ snapshots: '@types/prop-types@15.7.15': {} - '@types/react-transition-group@4.4.12(@types/react@19.2.7)': + '@types/react-dom@18.3.7(@types/react@18.3.27)': dependencies: - '@types/react': 19.2.7 + '@types/react': 18.3.27 - '@types/react@19.2.7': + '@types/react-transition-group@4.4.12(@types/react@18.3.27)': dependencies: + '@types/react': 18.3.27 + + '@types/react@18.3.27': + dependencies: + '@types/prop-types': 15.7.15 csstype: 3.2.3 '@vitejs/plugin-react@5.1.1(vite@7.2.4(@types/node@24.10.1)(terser@5.44.0))': From 5d276da4b2ea56cd7e2cbebb6d99892355fb59b0 Mon Sep 17 00:00:00 2001 From: Van Buren Date: Tue, 25 Nov 2025 09:05:07 -0600 Subject: [PATCH 11/13] fix: cleanup --- client/package.json | 4 ++-- client/src/declarations.d.ts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/client/package.json b/client/package.json index 73417ed..1631d92 100644 --- a/client/package.json +++ b/client/package.json @@ -49,10 +49,10 @@ "postcss": "^8.5.6", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-router-dom": "^7.9.6", "tailwindcss": "^4.1.17", "tailwind-merge": "^3.4.0", - "tw-animate-css": "^1.4.0", - "react-router-dom": "^7.9.6" + "tw-animate-css": "^1.4.0" }, "devDependencies": { "@types/node": "^24.10.1", diff --git a/client/src/declarations.d.ts b/client/src/declarations.d.ts index 5ad1709..d0e2172 100644 --- a/client/src/declarations.d.ts +++ b/client/src/declarations.d.ts @@ -5,7 +5,6 @@ interface ImportMetaEnv { readonly APP: string; readonly CLIENT_ACCESS_KEY: string; readonly CLIENT_SECRET_KEY: string; - readonly APP: string; readonly HOME_PAGE_ENABLED: string; // more env variables... } From f1ac3094685c7176c183761fa46e3c4fae41a6bc Mon Sep 17 00:00:00 2001 From: Van Buren Date: Tue, 25 Nov 2025 09:06:39 -0600 Subject: [PATCH 12/13] fix: 9090 --- client/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/.env b/client/.env index 4afb58d..adb6f83 100644 --- a/client/.env +++ b/client/.env @@ -1,5 +1,5 @@ # This file contains environment variables for the SEMOSS client application -ENDPOINT="http://localhost:9091/" +ENDPOINT="http://localhost:9090/" MODULE="/Monolith" HOME_PAGE_ENABLED=false # APP="your-app-id" # In .env.local, this should be set to your specific app ID \ No newline at end of file From b0d0071f92ec83993dd6d9ed0601edd802bb924e Mon Sep 17 00:00:00 2001 From: Van Buren Date: Tue, 25 Nov 2025 09:08:17 -0600 Subject: [PATCH 13/13] fix: biome --- .vscode/settings.json | 24 +++++------ client/components.json | 40 +++++++++---------- .../src/components/base/MessageSnackbar.tsx | 5 --- client/src/lib/utils.ts | 6 +-- client/src/pages/HomePage.tsx | 2 +- client/src/pages/layouts/MCPLayout.tsx | 3 +- 6 files changed, 37 insertions(+), 43 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 553c02a..89ec287 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,14 +1,14 @@ { - "java.configuration.updateBuildConfiguration": "automatic", - "java.compile.nullAnalysis.mode": "automatic", - "editor.formatOnSave": true, - "editor.codeActionsOnSave": { - "source.organizeImports.biome": "explicit", - "source.fixAll.biome": "explicit" - }, - "[java]": { - "editor.defaultFormatter": null, - "editor.codeActionsOnSave": {} - }, - "editor.defaultFormatter": "biomejs.biome" + "java.configuration.updateBuildConfiguration": "automatic", + "java.compile.nullAnalysis.mode": "automatic", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports.biome": "explicit", + "source.fixAll.biome": "explicit" + }, + "[java]": { + "editor.defaultFormatter": null, + "editor.codeActionsOnSave": {} + }, + "editor.defaultFormatter": "biomejs.biome" } diff --git a/client/components.json b/client/components.json index 9d3362f..03ca16a 100644 --- a/client/components.json +++ b/client/components.json @@ -1,22 +1,22 @@ { - "$schema": "https://ui.shadcn.com/schema.json", - "style": "new-york", - "rsc": false, - "tsx": true, - "tailwind": { - "config": "tailwind.config.js", - "css": "src/globals.css", - "baseColor": "zinc", - "cssVariables": true, - "prefix": "" - }, - "iconLibrary": "lucide", - "aliases": { - "components": "@/components", - "utils": "@/lib/utils", - "ui": "@/components/ui", - "lib": "@/lib", - "hooks": "@/hooks" - }, - "registries": {} + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/globals.css", + "baseColor": "zinc", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "registries": {} } diff --git a/client/src/components/base/MessageSnackbar.tsx b/client/src/components/base/MessageSnackbar.tsx index b45ee32..afffd87 100644 --- a/client/src/components/base/MessageSnackbar.tsx +++ b/client/src/components/base/MessageSnackbar.tsx @@ -53,7 +53,6 @@ export const MessageSnackbar = ({ return ; case "warning": return ; - case "info": default: return ; } @@ -63,9 +62,6 @@ export const MessageSnackbar = ({ switch (severity) { case "error": return "destructive" as const; - case "success": - case "warning": - case "info": default: return "default" as const; } @@ -79,7 +75,6 @@ export const MessageSnackbar = ({ return "border-yellow-500/50 text-yellow-600 bg-yellow-50 dark:border-yellow-500 [&>svg]:text-yellow-600"; case "info": return "border-blue-500/50 text-blue-600 bg-blue-50 dark:border-blue-500 [&>svg]:text-blue-600"; - case "error": default: return ""; } diff --git a/client/src/lib/utils.ts b/client/src/lib/utils.ts index bd0c391..3200be2 100644 --- a/client/src/lib/utils.ts +++ b/client/src/lib/utils.ts @@ -1,6 +1,6 @@ -import { clsx, type ClassValue } from "clsx" -import { twMerge } from "tailwind-merge" +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) + return twMerge(clsx(inputs)); } diff --git a/client/src/pages/HomePage.tsx b/client/src/pages/HomePage.tsx index ec8d46e..f4e2b4e 100644 --- a/client/src/pages/HomePage.tsx +++ b/client/src/pages/HomePage.tsx @@ -1,4 +1,4 @@ -/** biome-ignore-all lint/suspicious/noExplicitAny: */ +/** biome-ignore-all lint/suspicious/noExplicitAny: TODO */ import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { useAppContext } from "@/contexts"; diff --git a/client/src/pages/layouts/MCPLayout.tsx b/client/src/pages/layouts/MCPLayout.tsx index 64c6623..c0f8b71 100644 --- a/client/src/pages/layouts/MCPLayout.tsx +++ b/client/src/pages/layouts/MCPLayout.tsx @@ -1,7 +1,6 @@ import { Navigate, Outlet, useLocation } from "react-router-dom"; import { LoadingScreen } from "@/components"; import { useAppContext } from "@/contexts"; -import { HomePage } from "../HomePage"; // Function to process tool name by removing content before first underscore const getProcessedToolName = (toolName: string) => { @@ -19,7 +18,7 @@ const getProcessedToolName = (toolName: string) => { export const MCPLayout = () => { // Get the curent route, so that if we are trying to log the user in, we can take them to where they were trying to go const { pathname } = useLocation(); - const { isAppDataLoading, tool, tools } = useAppContext(); + const { isAppDataLoading, tool } = useAppContext(); // If the app data is still loading, show a loading screen if (isAppDataLoading) {