From f15dc557ce6c53ea05a54e84dfc809b09c761aef Mon Sep 17 00:00:00 2001 From: Tejas Lokeshrao Date: Thu, 18 Sep 2025 12:33:09 -0400 Subject: [PATCH 01/28] fix: add example python call and add comments elsewhere --- java/src/reactors/AbstractProjectReactor.java | 18 ++++- .../reactors/examples/CallPythonReactor.java | 74 ++++++++++++++++++ .../reactors/examples/HelloUserReactor.java | 4 + py/__pycache__/nthFibonacci.cpython-311.pyc | Bin 0 -> 681 bytes py/nthFibonacci.py | 14 ++++ 5 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 java/src/reactors/examples/CallPythonReactor.java create mode 100644 py/__pycache__/nthFibonacci.cpython-311.pyc create mode 100644 py/nthFibonacci.py diff --git a/java/src/reactors/AbstractProjectReactor.java b/java/src/reactors/AbstractProjectReactor.java index fc92c09..be9ffb8 100644 --- a/java/src/reactors/AbstractProjectReactor.java +++ b/java/src/reactors/AbstractProjectReactor.java @@ -14,18 +14,24 @@ import prerna.sablecc2.om.nounmeta.NounMetadata; import util.ProjectProperties; +/** + * Base class for all project-specific reactors. Provides project context, standardized error + * handling, and utility methods. + */ public abstract class AbstractProjectReactor extends AbstractReactor { private static final Logger LOGGER = LogManager.getLogger(AbstractProjectReactor.class); + // Core project context available to all extending reactors protected User user; protected String projectId; protected ProjectProperties projectProperties; - // TODO: intialize protected variables you would like your reactors to have access to + // TODO: Initialize additional protected variables (engines, external services, etc.) protected NounMetadata result = null; + /** Main execution entry point with standardized error handling. */ @Override public NounMetadata execute() { try { @@ -38,12 +44,13 @@ public NounMetadata execute() { } else { ex = new ProjectException(ErrorCode.INTERNAL_SERVER_ERROR, e); } - LOGGER.error(String.format("Reactor %s threw an error", this.getClass().getSimpleName()), e); + LOGGER.error(String.format("Reactor %s threw an error", this.getClass().getSimpleName()), e); return new NounMetadata(ex.getAsMap(), PixelDataType.MAP, PixelOperationType.ERROR); } } + /** Initializes project context before execution. */ protected void preExecute() { projectId = this.insight.getContextProjectId(); if (projectId == null) { @@ -52,13 +59,13 @@ protected void preExecute() { projectProperties = ProjectProperties.getInstance(projectId); - // TODO: Update protected variables + // TODO: Initialize additional resources (engines, external services, etc.) user = this.insight.getUser(); - organizeKeys(); } + /** Utility method to extract Map parameters from reactor input. */ protected Map getMap(String paramName) { GenRowStruct mapGrs = this.store.getNoun(paramName); if (mapGrs != null && !mapGrs.isEmpty()) { @@ -67,12 +74,15 @@ protected Map getMap(String paramName) { return (Map) mapInputs.get(0).getValue(); } } + List mapInputs = this.curRow.getNounsOfType(PixelDataType.MAP); if (mapInputs != null && !mapInputs.isEmpty()) { return (Map) mapInputs.get(0).getValue(); } + return null; } + /** Abstract method for concrete reactor implementation. */ protected abstract NounMetadata doExecute(); } diff --git a/java/src/reactors/examples/CallPythonReactor.java b/java/src/reactors/examples/CallPythonReactor.java new file mode 100644 index 0000000..d22afa0 --- /dev/null +++ b/java/src/reactors/examples/CallPythonReactor.java @@ -0,0 +1,74 @@ +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 prerna.util.AssetUtility; +import prerna.util.Constants; +import reactors.AbstractProjectReactor; + +/** + * Example reactor that calls Python functions from Java. Takes a numeric input and calls + * nthFibonacci Python function. + */ +public class CallPythonReactor extends AbstractProjectReactor { + + // Note: Has access to protected variables defined in AbstractProjectReactor + + 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}; + } + + @Override + protected NounMetadata doExecute() { + // grab the input number + int inputNum = (Integer) this.keyValue.get(ReactorKeysEnum.NUMERIC_VALUE.getKey()); + String appFolder = AssetUtility.getProjectAssetsFolder(projectId); + // define the file to grab the helper function from + String sourceFile = "nthFibonacci.py"; + // define the helper function to be executed + String functionName = "nthFibonacci"; + String path = appFolder + DIR_SEPARATOR + Constants.PY_BASE_FOLDER + DIR_SEPARATOR; + path = path.replace("\\", "/"); + + String moduleName = sourceFile.replace(".py", ""); + + // define the arguments to be passed to the function + List argsList = new ArrayList<>(); + argsList.add(inputNum); + + String args = ""; + if (argsList != null && !argsList.isEmpty()) { + args = String.join(", ", argsList); + } + + // Create a python script to be executed + String commands = + "import sys\n" + + "sys.path.append(\"" + + path + + "\")\n" + + "from " + + moduleName + + " import " + + functionName + + "\n" + + functionName + + "(" + + args + + ")\n"; + + PyTranslator pt = this.insight.getPyTranslator(); + Object pyResponse = pt.runDirectPy(this.insight, commands); + + return new NounMetadata(pyResponse, PixelDataType.CONST_STRING); + } +} diff --git a/java/src/reactors/examples/HelloUserReactor.java b/java/src/reactors/examples/HelloUserReactor.java index 75feb75..fed1b31 100644 --- a/java/src/reactors/examples/HelloUserReactor.java +++ b/java/src/reactors/examples/HelloUserReactor.java @@ -5,6 +5,10 @@ import prerna.sablecc2.om.nounmeta.NounMetadata; import reactors.AbstractProjectReactor; +/** + * Example reactor that demonstrates basic user interaction. Accepts optional name parameter or uses + * current user's name. + */ public class HelloUserReactor extends AbstractProjectReactor { // Note: Has access to protected variables defined in AbstractProjectReactor diff --git a/py/__pycache__/nthFibonacci.cpython-311.pyc b/py/__pycache__/nthFibonacci.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86a9e3df7c2141d5dae799ba0abff7126c22d1fb GIT binary patch literal 681 zcmZWn&ubGw6rS02F*aF^dJ?R}gF+7JHf=)`iqKdEL3#;Z1X*TxCrwPUvzggMT2ffW z!v=ClKxhgcJoy9v3h!RLg*^qtLvDfGdh*TcLc|B}&G)|d=6!EqKI!@z0-J4ouYZH{ zr%V#Vf59>X;1oINEqaa|Tt#`sPHM7616RS9pCO#0KJ+x>I#>FriX7z-OYRt|$IyF% z9iw={$;;`(bwDfq z@P-Qqb16BOGv-nvk0Xr}_mJk*2)mKucoA+0`LJ9rcYbC(6O;?XZ?Ps7bxxSE&+KlS zy1p=~w9SMtUNPPj9QhvCEK#M3-@T56m|d?tWE2F zp;q47wsvZ@E$WmF;&~=#%r|A)PC z3xu`1aR~7=D@&bm>D{GCWzzXjJnO!H@*{gERKnsw3$_UAl`n|P m@5ALcJ5TMlnbU322mCUm@s_s$EL4o~LdoE(3-o`8@Bao@SfvyI literal 0 HcmV?d00001 diff --git a/py/nthFibonacci.py b/py/nthFibonacci.py new file mode 100644 index 0000000..e6899ff --- /dev/null +++ b/py/nthFibonacci.py @@ -0,0 +1,14 @@ +# sample python function that finds the nth fibonacci number +def nthFibonacci(n): + 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 7c2fb64abc14996f8c7aabe44b767ea8953e306e Mon Sep 17 00:00:00 2001 From: Tejas Lokeshrao Date: Thu, 18 Sep 2025 12:34:59 -0400 Subject: [PATCH 02/28] fix: remove int cast --- java/src/reactors/examples/CallPythonReactor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/src/reactors/examples/CallPythonReactor.java b/java/src/reactors/examples/CallPythonReactor.java index d22afa0..29d38ae 100644 --- a/java/src/reactors/examples/CallPythonReactor.java +++ b/java/src/reactors/examples/CallPythonReactor.java @@ -30,7 +30,7 @@ public CallPythonReactor() { @Override protected NounMetadata doExecute() { // grab the input number - int inputNum = (Integer) this.keyValue.get(ReactorKeysEnum.NUMERIC_VALUE.getKey()); + String inputNum = this.keyValue.get(ReactorKeysEnum.NUMERIC_VALUE.getKey()); String appFolder = AssetUtility.getProjectAssetsFolder(projectId); // define the file to grab the helper function from String sourceFile = "nthFibonacci.py"; @@ -42,7 +42,7 @@ protected NounMetadata doExecute() { String moduleName = sourceFile.replace(".py", ""); // define the arguments to be passed to the function - List argsList = new ArrayList<>(); + List argsList = new ArrayList<>(); argsList.add(inputNum); String args = ""; From 9b69f151b97d4c855cecc8e4105f751721d836d6 Mon Sep 17 00:00:00 2001 From: tlokeshrao Date: Thu, 18 Sep 2025 12:38:19 -0400 Subject: [PATCH 03/28] Delete py/__pycache__ directory --- py/__pycache__/nthFibonacci.cpython-311.pyc | Bin 681 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 py/__pycache__/nthFibonacci.cpython-311.pyc diff --git a/py/__pycache__/nthFibonacci.cpython-311.pyc b/py/__pycache__/nthFibonacci.cpython-311.pyc deleted file mode 100644 index 86a9e3df7c2141d5dae799ba0abff7126c22d1fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681 zcmZWn&ubGw6rS02F*aF^dJ?R}gF+7JHf=)`iqKdEL3#;Z1X*TxCrwPUvzggMT2ffW z!v=ClKxhgcJoy9v3h!RLg*^qtLvDfGdh*TcLc|B}&G)|d=6!EqKI!@z0-J4ouYZH{ zr%V#Vf59>X;1oINEqaa|Tt#`sPHM7616RS9pCO#0KJ+x>I#>FriX7z-OYRt|$IyF% z9iw={$;;`(bwDfq z@P-Qqb16BOGv-nvk0Xr}_mJk*2)mKucoA+0`LJ9rcYbC(6O;?XZ?Ps7bxxSE&+KlS zy1p=~w9SMtUNPPj9QhvCEK#M3-@T56m|d?tWE2F zp;q47wsvZ@E$WmF;&~=#%r|A)PC z3xu`1aR~7=D@&bm>D{GCWzzXjJnO!H@*{gERKnsw3$_UAl`n|P m@5ALcJ5TMlnbU322mCUm@s_s$EL4o~LdoE(3-o`8@Bao@SfvyI From 4c805f72d3d8be59d6e5c05f4cb5d99bd351e537 Mon Sep 17 00:00:00 2001 From: Tejas Lokeshrao Date: Thu, 18 Sep 2025 12:38:56 -0400 Subject: [PATCH 04/28] fix: add pycache to gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index cae43ae..1c04125 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,7 @@ target/ java/project.properties .admin/ .DS_Store -.vscode/ \ No newline at end of file +.vscode/ + +# cache +py/__pycache__/ \ No newline at end of file From 28f36425489e69a94dba63bd9895bcdac9a1e8e3 Mon Sep 17 00:00:00 2001 From: Tejas Lokeshrao Date: Mon, 29 Sep 2025 21:43:18 -0400 Subject: [PATCH 05/28] fix: updated with new semoss py helper --- .../reactors/examples/CallPythonReactor.java | 45 +-- py/rando.py | 354 ++++++++++++++++++ 2 files changed, 367 insertions(+), 32 deletions(-) create mode 100644 py/rando.py diff --git a/java/src/reactors/examples/CallPythonReactor.java b/java/src/reactors/examples/CallPythonReactor.java index 29d38ae..d6af78e 100644 --- a/java/src/reactors/examples/CallPythonReactor.java +++ b/java/src/reactors/examples/CallPythonReactor.java @@ -6,8 +6,6 @@ import prerna.sablecc2.om.PixelDataType; import prerna.sablecc2.om.ReactorKeysEnum; import prerna.sablecc2.om.nounmeta.NounMetadata; -import prerna.util.AssetUtility; -import prerna.util.Constants; import reactors.AbstractProjectReactor; /** @@ -31,43 +29,26 @@ public CallPythonReactor() { protected NounMetadata doExecute() { // grab the input number String inputNum = this.keyValue.get(ReactorKeysEnum.NUMERIC_VALUE.getKey()); - String appFolder = AssetUtility.getProjectAssetsFolder(projectId); + // define the file to grab the helper function from - String sourceFile = "nthFibonacci.py"; - // define the helper function to be executed - String functionName = "nthFibonacci"; - String path = appFolder + DIR_SEPARATOR + Constants.PY_BASE_FOLDER + DIR_SEPARATOR; - path = path.replace("\\", "/"); + String sourceFile = "py/nthFibonacci.py"; + + PyTranslator pt = this.insight.getPyTranslator(); + + String projectId = this.insight.getContextProjectId(); + if (projectId == null) { + projectId = this.insight.getProjectId(); + } - String moduleName = sourceFile.replace(".py", ""); + String fibonacciModule = pt.loadPythonModuleFromFile(sourceFile, projectId); + + String functionName = "nthFibonacci"; // define the arguments to be passed to the function List argsList = new ArrayList<>(); argsList.add(inputNum); - String args = ""; - if (argsList != null && !argsList.isEmpty()) { - args = String.join(", ", argsList); - } - - // Create a python script to be executed - String commands = - "import sys\n" - + "sys.path.append(\"" - + path - + "\")\n" - + "from " - + moduleName - + " import " - + functionName - + "\n" - + functionName - + "(" - + args - + ")\n"; - - PyTranslator pt = this.insight.getPyTranslator(); - Object pyResponse = pt.runDirectPy(this.insight, commands); + Object pyResponse = pt.runFunctionFromLoadedModule(fibonacciModule, functionName, argsList); return new NounMetadata(pyResponse, PixelDataType.CONST_STRING); } diff --git a/py/rando.py b/py/rando.py new file mode 100644 index 0000000..14a78be --- /dev/null +++ b/py/rando.py @@ -0,0 +1,354 @@ +from gaas_server_proxy import ServerProxy +from typing import Dict, Optional + + +class StorageEngine(ServerProxy): + def __init__( + self, + engine_id: str = None, + insight_id: Optional[str] = None, + ): + assert engine_id is not None + super().__init__() + self.engine_id = engine_id + if insight_id is None: + insight_id = super().get_thread_insight_id() + self.insight_id = insight_id + print(f"Storage Engine {engine_id} is initialized") + + def list(self, storagePath: str = None, insight_id: Optional[str] = None): + """ + This method is responsible for listing the files in the storage engine + + Args: + storagePath (`str`): The path in the storage engine to delete + leaveFolderStructure (`bool`): If we should maintain the folder structure after deletion + insight_id (`Optional[str]`): Unique identifier for the temporal worksapce where actions are being isolated + + Returns: + boolean: true/false if this ran successfully + """ + assert storagePath is not None + if insight_id is None: + insight_id = self.insight_id + assert insight_id is not None + + epoc = super().get_next_epoc() + + pixel = ( + f'Storage("{self.engine_id}")|ListStoragePath(storagePath="{storagePath}");' + ) + pixelReturn = super().callReactor( + epoc=epoc, + pixel=pixel, + insight_id=insight_id, + ) + + if pixelReturn is not None and len(pixelReturn) > 0: + output = pixelReturn[0]["pixelReturn"][0] + return output["output"] + + return pixelReturn + + def listDetails(self, storagePath: str = None, insight_id: Optional[str] = None): + """ + This method is responsible for listing the files in the storage engine + + Args: + storagePath (`str`): The path in the storage engine to delete + leaveFolderStructure (`bool`): If we should maintain the folder structure after deletion + insight_id (`Optional[str]`): Unique identifier for the temporal worksapce where actions are being isolated + + Returns: + boolean: true/false if this ran successfully + """ + assert storagePath is not None + if insight_id is None: + insight_id = self.insight_id + assert insight_id is not None + + epoc = super().get_next_epoc() + + pixel = f'Storage("{self.engine_id}")|ListStoragePathDetails(storagePath="{storagePath}");' + pixelReturn = super().callReactor( + epoc=epoc, + pixel=pixel, + insight_id=insight_id, + ) + + if pixelReturn is not None and len(pixelReturn) > 0: + output = pixelReturn[0]["pixelReturn"][0] + return output["output"] + + return pixelReturn + + def syncLocalToStorage( + self, + storagePath: str = None, + localPath: str = None, + space: Optional[str] = None, + metadata: Optional[Dict] = {}, + insight_id: Optional[str] = None, + ): + """ + This method is responsible for syncing from insight/project/user space to cloud storage + + Args: + storagePath (`str`): The path in the storage engine to sync into + localPath (`str`): The path in the application to sync from (insight, project, user space) + space (`str`): The space to use. None = current insight. Can be the project id or 'user' for the user specific space + metadata (`Optional[Dict]`): Define custom metadata associated with the files being moved to storage. Only available if the underlying storage system supports custom metadata. + insight_id (`Optional[str]`): Unique identifier for the temporal worksapce where actions are being isolated + + Returns: + boolean: true/false if this ran successfully + """ + assert storagePath is not None + assert localPath is not None + if insight_id is None: + insight_id = self.insight_id + assert insight_id is not None + + spaceStr = f',space="{space}"' if space is not None else "" + metadataStr = f",metadata=[{metadata}]" if metadata is not None else "" + + epoc = super().get_next_epoc() + + pixel = f'Storage("{self.engine_id}")|SyncLocalToStorage(storagePath="{storagePath}",filePath="{localPath}"{spaceStr}{metadataStr});' + pixelReturn = super().callReactor( + epoc=epoc, + pixel=pixel, + insight_id=insight_id, + ) + + if pixelReturn is not None and len(pixelReturn) > 0: + output = pixelReturn[0]["pixelReturn"][0] + return output["output"] + + return pixelReturn + + def syncStorageToLocal( + self, + storagePath: str = None, + localPath: str = None, + space: Optional[str] = None, + insight_id: Optional[str] = None, + ): + """ + This method is responsible for syncing from cloud storage into the insight/project/user space + + Args: + storagePath (`str`): The path in the storage engine to sync from + localPath (`str`): The path in the application to sync into (insight, project, user space) + space (`str`): The space to use. None = current insight. Can be the project id or 'user' for the user specific space + insight_id (`Optional[str]`): Unique identifier for the temporal worksapce where actions are being isolated + + Returns: + boolean: true/false if this ran successfully + """ + assert storagePath is not None + assert localPath is not None + if insight_id is None: + insight_id = self.insight_id + assert insight_id is not None + + spaceStr = f',space="{space}"' if space is not None else "" + + epoc = super().get_next_epoc() + + pixel = f'Storage("{self.engine_id}")|SyncStorageToLocal(storagePath="{storagePath}",filePath="{localPath}"{spaceStr});' + pixelReturn = super().callReactor( + epoc=epoc, + pixel=pixel, + insight_id=insight_id, + ) + + if pixelReturn is not None and len(pixelReturn) > 0: + output = pixelReturn[0]["pixelReturn"][0] + return output["output"] + + return pixelReturn + + def copyToLocal( + self, + storagePath: str = None, + localPath: str = None, + space: Optional[str] = None, + insight_id: Optional[str] = None, + ): + """ + This method is responsible for copying from cloud storage into the insight/project/user space + + Args: + storagePath (`str`): The path in the storage engine to pull from + localPath (`str`): The path in the application to copy into (insight, project, user space) + space (`str`): The space to use. None = current insight. Can be the project id or 'user' for the user specific space + insight_id (`Optional[str]`): Unique identifier for the temporal worksapce where actions are being isolated + + Returns: + boolean: true/false if this ran successfully + """ + assert storagePath is not None + assert localPath is not None + if insight_id is None: + insight_id = self.insight_id + assert insight_id is not None + + spaceStr = f',space="{space}"' if space is not None else "" + + epoc = super().get_next_epoc() + + pixel = f'Storage("{self.engine_id}")|PullFromStorage(storagePath="{storagePath}",filePath="{localPath}"{spaceStr});' + pixelReturn = super().callReactor( + epoc=epoc, + pixel=pixel, + insight_id=insight_id, + ) + + if pixelReturn is not None and len(pixelReturn) > 0: + output = pixelReturn[0]["pixelReturn"][0] + return output["output"] + + return pixelReturn + + def copyToStorage( + self, + storagePath: str = None, + localPath: str = None, + space: Optional[str] = None, + metadata: Optional[Dict] = {}, + insight_id: Optional[str] = None, + ): + """ + This method is responsible for copying from insight/project/user space to cloud storage + + Args: + storagePath (`str`): The path in the storage engine to push into + localPath (`str`): The path in the application we are pushing to cloud storage (insight, project, user space) + space (`str`): The space to use. None = current insight. Can be the project id or 'user' for the user specific space + metadata (`Optional[Dict]`): Define custom metadata associated with the files being moved to storage. Only available if the underlying storage system supports custom metadata. + insight_id (`Optional[str]`): Unique identifier for the temporal worksapce where actions are being isolated + + Returns: + boolean: true/false if this ran successfully + """ + assert storagePath is not None + assert localPath is not None + if insight_id is None: + insight_id = self.insight_id + assert insight_id is not None + + spaceStr = f',space="{space}"' if space is not None else "" + metadataStr = f",metadata=[{metadata}]" if metadata is not None else "" + + epoc = super().get_next_epoc() + + pixel = f'Storage("{self.engine_id}")|PushToStorage(storagePath="{storagePath}",filePath="{localPath}"{spaceStr}{metadataStr});' + pixelReturn = super().callReactor( + epoc=epoc, + pixel=pixel, + insight_id=insight_id, + ) + + if pixelReturn is not None and len(pixelReturn) > 0: + output = pixelReturn[0]["pixelReturn"][0] + return output["output"] + + return pixelReturn + + def deleteFromStorage( + self, + storagePath: str = None, + leaveFolderStructure: bool = False, + insight_id: Optional[str] = None, + ): + """ + This method is responsible for deleting from a storage + + Args: + storagePath (`str`): The path in the storage engine to delete + leaveFolderStructure (`bool`): If we should maintain the folder structure after deletion + insight_id (`Optional[str]`): Unique identifier for the temporal worksapce where actions are being isolated + + Returns: + boolean: true/false if this ran successfully + """ + assert storagePath is not None + if insight_id is None: + insight_id = self.insight_id + assert insight_id is not None + + leaveFolderStructureStr = "true" if leaveFolderStructure else "false" + + epoc = super().get_next_epoc() + + pixel = f'Storage("{self.engine_id}")|DeleteFromStorage(storagePath="{storagePath}",leaveFolderStructure={leaveFolderStructureStr});' + pixelReturn = super().callReactor( + epoc=epoc, + pixel=pixel, + insight_id=insight_id, + ) + + if pixelReturn is not None and len(pixelReturn) > 0: + output = pixelReturn[0]["pixelReturn"][0] + return output["output"] + + return pixelReturn + + def to_langchain_storage(self): + """Transform the storage engine into a langchain BaseStore object so that it can be used with langchain code""" + from langchain_core.stores import BaseStore + + class SemossLangchainStorage(BaseStore): + engine_id: str + storage_engine: StorageEngine + insight_id: Optional[str] + + def __init__(self, storage_engine): + """Initialize with the provided storage engine.""" + self.engine_id = storage_engine.engine_id + self.storage_engine = storage_engine + + def list(self, storagePath: str) -> any: + """Retrieve the file list from storage.""" + return self.storage_engine.list(storagePath=storagePath) + + def listDetails(self, storagePath: str) -> any: + """Retrieve the files details list from storage.""" + return self.storage_engine.listDetails(storagePath=storagePath) + + def syncLocalToStorage(self, localPath: str, storagePath: str) -> any: + """Sync the files from local to storage.""" + return self.storage_engine.syncLocalToStorage( + localPath=localPath, storagePath=storagePath + ) + + def syncStorageToLocal(self, localPath: str, storagePath: str) -> any: + """Sync the files from storage to local.""" + return self.storage_engine.syncStorageToLocal( + localPath=localPath, storagePath=storagePath + ) + + def copyToLocal(self, storageFilePath: str, localFolderPath: str) -> any: + """Copy a specific file from the storage to the local system.""" + return self.storage_engine.copyToLocal( + storageFilePath=storageFilePath, localFolderPath=localFolderPath + ) + + def deleteFromStorage(self, storagePath: str) -> any: + """Delete a file from storage.""" + return self.storage_engine.deleteFromStorage(storagePath=storagePath) + + def mdelete(self): + pass + + def mget(self): + pass + + def mset(self): + pass + + def yield_keys(self): + pass + + return SemossLangchainStorage(storage_engine=self) \ No newline at end of file From e76bf5bc296308773757525dffcb153e27071150 Mon Sep 17 00:00:00 2001 From: tlokeshrao Date: Mon, 6 Oct 2025 13:06:56 -0400 Subject: [PATCH 06/28] Delete py/rando.py --- py/rando.py | 354 ---------------------------------------------------- 1 file changed, 354 deletions(-) delete mode 100644 py/rando.py diff --git a/py/rando.py b/py/rando.py deleted file mode 100644 index 14a78be..0000000 --- a/py/rando.py +++ /dev/null @@ -1,354 +0,0 @@ -from gaas_server_proxy import ServerProxy -from typing import Dict, Optional - - -class StorageEngine(ServerProxy): - def __init__( - self, - engine_id: str = None, - insight_id: Optional[str] = None, - ): - assert engine_id is not None - super().__init__() - self.engine_id = engine_id - if insight_id is None: - insight_id = super().get_thread_insight_id() - self.insight_id = insight_id - print(f"Storage Engine {engine_id} is initialized") - - def list(self, storagePath: str = None, insight_id: Optional[str] = None): - """ - This method is responsible for listing the files in the storage engine - - Args: - storagePath (`str`): The path in the storage engine to delete - leaveFolderStructure (`bool`): If we should maintain the folder structure after deletion - insight_id (`Optional[str]`): Unique identifier for the temporal worksapce where actions are being isolated - - Returns: - boolean: true/false if this ran successfully - """ - assert storagePath is not None - if insight_id is None: - insight_id = self.insight_id - assert insight_id is not None - - epoc = super().get_next_epoc() - - pixel = ( - f'Storage("{self.engine_id}")|ListStoragePath(storagePath="{storagePath}");' - ) - pixelReturn = super().callReactor( - epoc=epoc, - pixel=pixel, - insight_id=insight_id, - ) - - if pixelReturn is not None and len(pixelReturn) > 0: - output = pixelReturn[0]["pixelReturn"][0] - return output["output"] - - return pixelReturn - - def listDetails(self, storagePath: str = None, insight_id: Optional[str] = None): - """ - This method is responsible for listing the files in the storage engine - - Args: - storagePath (`str`): The path in the storage engine to delete - leaveFolderStructure (`bool`): If we should maintain the folder structure after deletion - insight_id (`Optional[str]`): Unique identifier for the temporal worksapce where actions are being isolated - - Returns: - boolean: true/false if this ran successfully - """ - assert storagePath is not None - if insight_id is None: - insight_id = self.insight_id - assert insight_id is not None - - epoc = super().get_next_epoc() - - pixel = f'Storage("{self.engine_id}")|ListStoragePathDetails(storagePath="{storagePath}");' - pixelReturn = super().callReactor( - epoc=epoc, - pixel=pixel, - insight_id=insight_id, - ) - - if pixelReturn is not None and len(pixelReturn) > 0: - output = pixelReturn[0]["pixelReturn"][0] - return output["output"] - - return pixelReturn - - def syncLocalToStorage( - self, - storagePath: str = None, - localPath: str = None, - space: Optional[str] = None, - metadata: Optional[Dict] = {}, - insight_id: Optional[str] = None, - ): - """ - This method is responsible for syncing from insight/project/user space to cloud storage - - Args: - storagePath (`str`): The path in the storage engine to sync into - localPath (`str`): The path in the application to sync from (insight, project, user space) - space (`str`): The space to use. None = current insight. Can be the project id or 'user' for the user specific space - metadata (`Optional[Dict]`): Define custom metadata associated with the files being moved to storage. Only available if the underlying storage system supports custom metadata. - insight_id (`Optional[str]`): Unique identifier for the temporal worksapce where actions are being isolated - - Returns: - boolean: true/false if this ran successfully - """ - assert storagePath is not None - assert localPath is not None - if insight_id is None: - insight_id = self.insight_id - assert insight_id is not None - - spaceStr = f',space="{space}"' if space is not None else "" - metadataStr = f",metadata=[{metadata}]" if metadata is not None else "" - - epoc = super().get_next_epoc() - - pixel = f'Storage("{self.engine_id}")|SyncLocalToStorage(storagePath="{storagePath}",filePath="{localPath}"{spaceStr}{metadataStr});' - pixelReturn = super().callReactor( - epoc=epoc, - pixel=pixel, - insight_id=insight_id, - ) - - if pixelReturn is not None and len(pixelReturn) > 0: - output = pixelReturn[0]["pixelReturn"][0] - return output["output"] - - return pixelReturn - - def syncStorageToLocal( - self, - storagePath: str = None, - localPath: str = None, - space: Optional[str] = None, - insight_id: Optional[str] = None, - ): - """ - This method is responsible for syncing from cloud storage into the insight/project/user space - - Args: - storagePath (`str`): The path in the storage engine to sync from - localPath (`str`): The path in the application to sync into (insight, project, user space) - space (`str`): The space to use. None = current insight. Can be the project id or 'user' for the user specific space - insight_id (`Optional[str]`): Unique identifier for the temporal worksapce where actions are being isolated - - Returns: - boolean: true/false if this ran successfully - """ - assert storagePath is not None - assert localPath is not None - if insight_id is None: - insight_id = self.insight_id - assert insight_id is not None - - spaceStr = f',space="{space}"' if space is not None else "" - - epoc = super().get_next_epoc() - - pixel = f'Storage("{self.engine_id}")|SyncStorageToLocal(storagePath="{storagePath}",filePath="{localPath}"{spaceStr});' - pixelReturn = super().callReactor( - epoc=epoc, - pixel=pixel, - insight_id=insight_id, - ) - - if pixelReturn is not None and len(pixelReturn) > 0: - output = pixelReturn[0]["pixelReturn"][0] - return output["output"] - - return pixelReturn - - def copyToLocal( - self, - storagePath: str = None, - localPath: str = None, - space: Optional[str] = None, - insight_id: Optional[str] = None, - ): - """ - This method is responsible for copying from cloud storage into the insight/project/user space - - Args: - storagePath (`str`): The path in the storage engine to pull from - localPath (`str`): The path in the application to copy into (insight, project, user space) - space (`str`): The space to use. None = current insight. Can be the project id or 'user' for the user specific space - insight_id (`Optional[str]`): Unique identifier for the temporal worksapce where actions are being isolated - - Returns: - boolean: true/false if this ran successfully - """ - assert storagePath is not None - assert localPath is not None - if insight_id is None: - insight_id = self.insight_id - assert insight_id is not None - - spaceStr = f',space="{space}"' if space is not None else "" - - epoc = super().get_next_epoc() - - pixel = f'Storage("{self.engine_id}")|PullFromStorage(storagePath="{storagePath}",filePath="{localPath}"{spaceStr});' - pixelReturn = super().callReactor( - epoc=epoc, - pixel=pixel, - insight_id=insight_id, - ) - - if pixelReturn is not None and len(pixelReturn) > 0: - output = pixelReturn[0]["pixelReturn"][0] - return output["output"] - - return pixelReturn - - def copyToStorage( - self, - storagePath: str = None, - localPath: str = None, - space: Optional[str] = None, - metadata: Optional[Dict] = {}, - insight_id: Optional[str] = None, - ): - """ - This method is responsible for copying from insight/project/user space to cloud storage - - Args: - storagePath (`str`): The path in the storage engine to push into - localPath (`str`): The path in the application we are pushing to cloud storage (insight, project, user space) - space (`str`): The space to use. None = current insight. Can be the project id or 'user' for the user specific space - metadata (`Optional[Dict]`): Define custom metadata associated with the files being moved to storage. Only available if the underlying storage system supports custom metadata. - insight_id (`Optional[str]`): Unique identifier for the temporal worksapce where actions are being isolated - - Returns: - boolean: true/false if this ran successfully - """ - assert storagePath is not None - assert localPath is not None - if insight_id is None: - insight_id = self.insight_id - assert insight_id is not None - - spaceStr = f',space="{space}"' if space is not None else "" - metadataStr = f",metadata=[{metadata}]" if metadata is not None else "" - - epoc = super().get_next_epoc() - - pixel = f'Storage("{self.engine_id}")|PushToStorage(storagePath="{storagePath}",filePath="{localPath}"{spaceStr}{metadataStr});' - pixelReturn = super().callReactor( - epoc=epoc, - pixel=pixel, - insight_id=insight_id, - ) - - if pixelReturn is not None and len(pixelReturn) > 0: - output = pixelReturn[0]["pixelReturn"][0] - return output["output"] - - return pixelReturn - - def deleteFromStorage( - self, - storagePath: str = None, - leaveFolderStructure: bool = False, - insight_id: Optional[str] = None, - ): - """ - This method is responsible for deleting from a storage - - Args: - storagePath (`str`): The path in the storage engine to delete - leaveFolderStructure (`bool`): If we should maintain the folder structure after deletion - insight_id (`Optional[str]`): Unique identifier for the temporal worksapce where actions are being isolated - - Returns: - boolean: true/false if this ran successfully - """ - assert storagePath is not None - if insight_id is None: - insight_id = self.insight_id - assert insight_id is not None - - leaveFolderStructureStr = "true" if leaveFolderStructure else "false" - - epoc = super().get_next_epoc() - - pixel = f'Storage("{self.engine_id}")|DeleteFromStorage(storagePath="{storagePath}",leaveFolderStructure={leaveFolderStructureStr});' - pixelReturn = super().callReactor( - epoc=epoc, - pixel=pixel, - insight_id=insight_id, - ) - - if pixelReturn is not None and len(pixelReturn) > 0: - output = pixelReturn[0]["pixelReturn"][0] - return output["output"] - - return pixelReturn - - def to_langchain_storage(self): - """Transform the storage engine into a langchain BaseStore object so that it can be used with langchain code""" - from langchain_core.stores import BaseStore - - class SemossLangchainStorage(BaseStore): - engine_id: str - storage_engine: StorageEngine - insight_id: Optional[str] - - def __init__(self, storage_engine): - """Initialize with the provided storage engine.""" - self.engine_id = storage_engine.engine_id - self.storage_engine = storage_engine - - def list(self, storagePath: str) -> any: - """Retrieve the file list from storage.""" - return self.storage_engine.list(storagePath=storagePath) - - def listDetails(self, storagePath: str) -> any: - """Retrieve the files details list from storage.""" - return self.storage_engine.listDetails(storagePath=storagePath) - - def syncLocalToStorage(self, localPath: str, storagePath: str) -> any: - """Sync the files from local to storage.""" - return self.storage_engine.syncLocalToStorage( - localPath=localPath, storagePath=storagePath - ) - - def syncStorageToLocal(self, localPath: str, storagePath: str) -> any: - """Sync the files from storage to local.""" - return self.storage_engine.syncStorageToLocal( - localPath=localPath, storagePath=storagePath - ) - - def copyToLocal(self, storageFilePath: str, localFolderPath: str) -> any: - """Copy a specific file from the storage to the local system.""" - return self.storage_engine.copyToLocal( - storageFilePath=storageFilePath, localFolderPath=localFolderPath - ) - - def deleteFromStorage(self, storagePath: str) -> any: - """Delete a file from storage.""" - return self.storage_engine.deleteFromStorage(storagePath=storagePath) - - def mdelete(self): - pass - - def mget(self): - pass - - def mset(self): - pass - - def yield_keys(self): - pass - - return SemossLangchainStorage(storage_engine=self) \ No newline at end of file From ad49168bd8f3631f380f58e964c3b531e9bdf1c5 Mon Sep 17 00:00:00 2001 From: Van Buren Date: Wed, 15 Oct 2025 10:43:29 -0400 Subject: [PATCH 07/28] feat: call call pyton --- client/src/pages/HomePage.tsx | 25 ++++++++++++++++--- .../reactors/examples/CallPythonReactor.java | 7 +++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/client/src/pages/HomePage.tsx b/client/src/pages/HomePage.tsx index c5454f3..df65ead 100644 --- a/client/src/pages/HomePage.tsx +++ b/client/src/pages/HomePage.tsx @@ -8,9 +8,12 @@ import { useLoadingPixel } from "@/hooks"; */ export const HomePage = () => { /** - * State + * Library hooks */ - const [data, isLoading] = useLoadingPixel("HelloUser()"); + const [helloUserResponse, isLoadingHelloUser] = + useLoadingPixel("HelloUser()"); + const [callPythonResponse, isLoadingCallPython] = + useLoadingPixel("CallPython()"); return ( @@ -28,7 +31,23 @@ export const HomePage = () => {
  • - {isLoading ? "Loading..." : data} + {isLoadingHelloUser + ? "Loading..." + : helloUserResponse} + +
  • +
+ +
  • + + CallPython() + +
      +
    • + + {isLoadingCallPython + ? "Loading..." + : callPythonResponse}
    diff --git a/java/src/reactors/examples/CallPythonReactor.java b/java/src/reactors/examples/CallPythonReactor.java index d6af78e..f7fda38 100644 --- a/java/src/reactors/examples/CallPythonReactor.java +++ b/java/src/reactors/examples/CallPythonReactor.java @@ -40,15 +40,16 @@ protected NounMetadata doExecute() { projectId = this.insight.getProjectId(); } - String fibonacciModule = pt.loadPythonModuleFromFile(sourceFile, projectId); + String fibonacciModule = pt.loadPythonModuleFromFile(this.insight, sourceFile, projectId); String functionName = "nthFibonacci"; // define the arguments to be passed to the function - List argsList = new ArrayList<>(); + List argsList = new ArrayList<>(); argsList.add(inputNum); - Object pyResponse = pt.runFunctionFromLoadedModule(fibonacciModule, functionName, argsList); + Object pyResponse = + pt.runFunctionFromLoadedModule(this.insight, fibonacciModule, functionName, argsList); return new NounMetadata(pyResponse, PixelDataType.CONST_STRING); } From 83f38214d02717d24284767d89a3aa88a6c7f2db Mon Sep 17 00:00:00 2001 From: Van Buren Date: Wed, 15 Oct 2025 12:35:51 -0400 Subject: [PATCH 08/28] feat: python --- client/src/hooks/useLoadingPixel.ts | 45 +++++++++++-------- client/src/pages/HomePage.tsx | 33 +++++++++++--- .../reactors/examples/CallPythonReactor.java | 2 +- 3 files changed, 55 insertions(+), 25 deletions(-) diff --git a/client/src/hooks/useLoadingPixel.ts b/client/src/hooks/useLoadingPixel.ts index bad70f0..fca9571 100644 --- a/client/src/hooks/useLoadingPixel.ts +++ b/client/src/hooks/useLoadingPixel.ts @@ -6,16 +6,16 @@ import { useLoadingState } from "./useLoadingState"; * Custom hook to call a reactor, typically for fetching data on page load. * * @template T The expected type of the pixel response. - * @param {string} [pixelString] The pixel to call. + * @param {string | (...args: R[]) => (string | Promise)} [pixelString] The pixel to call. * @param {T} [initialValue] The initial value of the state, before being overwritten by the pixel return. * @param {boolean} [waitToLoad] A flag that prevents the pixel from running until ready. - * @returns {[T, boolean, () => void]} The pixel return, whether the call is loading, and a function to re-fetch. + * @returns {[T, boolean, (...args: R[]) => void]} The pixel return, whether the call is loading, and a function to re-fetch. */ -export const useLoadingPixel = ( - pixelString: string, +export const useLoadingPixel = ( + pixelString: string | ((...args: R[]) => string | Promise), initialValue?: T, - waitToLoad = false, -): [T, boolean, () => void] => { + waitToLoad: boolean = false, +): [T, boolean, (...args: R[]) => void] => { const { runPixel } = useAppContext(); /** @@ -27,18 +27,27 @@ export const useLoadingPixel = ( /** * Functions */ - const fetchPixel = useCallback(() => { - if (waitToLoad) return; - (async () => { - const loadingKey = setIsLoading(true); - try { - const response = await runPixel(pixelString); - setIsLoading(false, loadingKey, () => setResponse(response)); - } catch { - setIsLoading(false, loadingKey); - } - })(); - }, [pixelString, setIsLoading, runPixel, waitToLoad]); + const fetchPixel = useCallback( + (...args: R[]) => { + if (waitToLoad) return; + (async () => { + const loadingKey = setIsLoading(true); + try { + const response = await runPixel( + typeof pixelString === "function" + ? await pixelString(...args) + : pixelString, + ); + setIsLoading(false, loadingKey, () => + setResponse(response), + ); + } catch { + setIsLoading(false, loadingKey); + } + })(); + }, + [pixelString, setIsLoading, runPixel, waitToLoad], + ); /** * Effects diff --git a/client/src/pages/HomePage.tsx b/client/src/pages/HomePage.tsx index df65ead..629e718 100644 --- a/client/src/pages/HomePage.tsx +++ b/client/src/pages/HomePage.tsx @@ -1,4 +1,5 @@ -import { Stack, Typography } from "@mui/material"; +import { Stack, TextField, Typography } from "@mui/material"; +import { useState } from "react"; import { useLoadingPixel } from "@/hooks"; /** @@ -7,13 +8,21 @@ import { useLoadingPixel } from "@/hooks"; * @component */ export const HomePage = () => { + /** + * State + */ + const [numValue, setNumValue] = useState(""); + /** * Library hooks */ const [helloUserResponse, isLoadingHelloUser] = useLoadingPixel("HelloUser()"); - const [callPythonResponse, isLoadingCallPython] = - useLoadingPixel("CallPython()"); + const [callPythonResponse, isLoadingCallPython] = useLoadingPixel( + `CallPython(${numValue})`, + "", + numValue === "", + ); return ( @@ -39,9 +48,21 @@ export const HomePage = () => {
  • - - CallPython() - + + + {"CallPython( numValue ="} + + + setNumValue(Number(e.target.value) || "") + } + size="small" + /> + + {")"} + +
    • diff --git a/java/src/reactors/examples/CallPythonReactor.java b/java/src/reactors/examples/CallPythonReactor.java index f7fda38..13724aa 100644 --- a/java/src/reactors/examples/CallPythonReactor.java +++ b/java/src/reactors/examples/CallPythonReactor.java @@ -31,7 +31,7 @@ protected NounMetadata doExecute() { String inputNum = this.keyValue.get(ReactorKeysEnum.NUMERIC_VALUE.getKey()); // define the file to grab the helper function from - String sourceFile = "py/nthFibonacci.py"; + String sourceFile = "nthFibonacci.py"; PyTranslator pt = this.insight.getPyTranslator(); From af6d5d34942f4219bde9d075e398dbb9311646db Mon Sep 17 00:00:00 2001 From: Van Buren Date: Wed, 15 Oct 2025 12:51:32 -0400 Subject: [PATCH 09/28] fix: py --- client/src/pages/HomePage.tsx | 2 +- py/nthFibonacci.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/client/src/pages/HomePage.tsx b/client/src/pages/HomePage.tsx index 629e718..baae08f 100644 --- a/client/src/pages/HomePage.tsx +++ b/client/src/pages/HomePage.tsx @@ -31,7 +31,7 @@ export const HomePage = () => { Welcome to the SEMOSS Template application! This repository is meant to be a starting point for your own SEMOSS application. - Example pixel call: + Example pixel calls:
      • diff --git a/py/nthFibonacci.py b/py/nthFibonacci.py index e6899ff..5376bdd 100644 --- a/py/nthFibonacci.py +++ b/py/nthFibonacci.py @@ -1,5 +1,6 @@ # sample python function that finds the nth fibonacci number -def nthFibonacci(n): +def nthFibonacci(n: int) -> int: + n = int(n) # ensure n is an integer if n <= 1: return n From a75a66253ad2aa0cf84a105c680a4f15d4fa2291 Mon Sep 17 00:00:00 2001 From: Rithvik Doshi Date: Wed, 15 Oct 2025 14:04:16 -0400 Subject: [PATCH 10/28] fix: tejas momentus --- java/src/reactors/AbstractProjectReactor.java | 2 +- java/src/reactors/examples/CallPythonReactor.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/java/src/reactors/AbstractProjectReactor.java b/java/src/reactors/AbstractProjectReactor.java index 5f10cfb..8f58f6e 100644 --- a/java/src/reactors/AbstractProjectReactor.java +++ b/java/src/reactors/AbstractProjectReactor.java @@ -115,7 +115,7 @@ protected void preExecute() { */ @SuppressWarnings("unchecked") protected Map getMap(String paramName) { - GenRowStruct mapGrs = this.store.getNoun(paramName); + GenRowStruct mapGrs = this.store.getGenRowStruct(paramName); if (mapGrs != null && !mapGrs.isEmpty()) { List mapInputs = mapGrs.getNounsOfType(PixelDataType.MAP); if (mapInputs != null && !mapInputs.isEmpty()) { diff --git a/java/src/reactors/examples/CallPythonReactor.java b/java/src/reactors/examples/CallPythonReactor.java index 13724aa..9dc425e 100644 --- a/java/src/reactors/examples/CallPythonReactor.java +++ b/java/src/reactors/examples/CallPythonReactor.java @@ -28,7 +28,7 @@ public CallPythonReactor() { @Override protected NounMetadata doExecute() { // grab the input number - String inputNum = this.keyValue.get(ReactorKeysEnum.NUMERIC_VALUE.getKey()); + int inputNum = Integer.parseInt(this.keyValue.get(ReactorKeysEnum.NUMERIC_VALUE.getKey())); // define the file to grab the helper function from String sourceFile = "nthFibonacci.py"; @@ -49,7 +49,8 @@ protected NounMetadata doExecute() { argsList.add(inputNum); Object pyResponse = - pt.runFunctionFromLoadedModule(this.insight, fibonacciModule, functionName, argsList); + pt.runFunctionFromLoadedModule( + this.insight, fibonacciModule, functionName, List.of(inputNum)); return new NounMetadata(pyResponse, PixelDataType.CONST_STRING); } From d294b55061df20ba31fba56ceee02770fc1c8035 Mon Sep 17 00:00:00 2001 From: Rithvik Doshi Date: Wed, 15 Oct 2025 14:05:52 -0400 Subject: [PATCH 11/28] fix: oop --- java/src/reactors/examples/CallPythonReactor.java | 3 +-- py/nthFibonacci.py | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/java/src/reactors/examples/CallPythonReactor.java b/java/src/reactors/examples/CallPythonReactor.java index 9dc425e..9577ab0 100644 --- a/java/src/reactors/examples/CallPythonReactor.java +++ b/java/src/reactors/examples/CallPythonReactor.java @@ -49,8 +49,7 @@ protected NounMetadata doExecute() { argsList.add(inputNum); Object pyResponse = - pt.runFunctionFromLoadedModule( - this.insight, fibonacciModule, functionName, List.of(inputNum)); + pt.runFunctionFromLoadedModule(this.insight, fibonacciModule, functionName, argsList); return new NounMetadata(pyResponse, PixelDataType.CONST_STRING); } diff --git a/py/nthFibonacci.py b/py/nthFibonacci.py index 5376bdd..f39fca0 100644 --- a/py/nthFibonacci.py +++ b/py/nthFibonacci.py @@ -1,6 +1,5 @@ # sample python function that finds the nth fibonacci number def nthFibonacci(n: int) -> int: - n = int(n) # ensure n is an integer if n <= 1: return n From 50b1a1dd867c5f5c2926336070a6f365fc339086 Mon Sep 17 00:00:00 2001 From: Rithvik Doshi Date: Wed, 15 Oct 2025 14:13:39 -0400 Subject: [PATCH 12/28] feat: nice cool workflow --- .github/workflows/pre-commit.yml | 21 +++++++++++++++++++++ .pre-commit-config.yaml | 24 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 .github/workflows/pre-commit.yml diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 0000000..9924bae --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,21 @@ +name: Pre-commit + +on: + pull_request: + branches: [ dev ] + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + # Official pre-commit action handles caching automatically + - uses: pre-commit/action@v3.0.1 + with: + extra_args: --all-files --show-diff-on-failure \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c37ec35..cf91c35 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -34,6 +34,30 @@ repos: - id: isort args: ['--profile', 'black'] files: '^py.*\.py$' + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.18.2 + hooks: + - id: mypy + files: '\.py$' + args: [ + "--ignore-missing-imports", + "--show-error-codes", + "--explicit-package-bases", + "--allow-untyped-defs", + "--allow-incomplete-defs", + "--allow-untyped-calls", + "--no-strict-optional", + "--disable-error-code=misc", + "--disable-error-code=no-any-return", + "--disable-error-code=name-defined", + "--disable-error-code=attr-defined" + ] + additional_dependencies: [ + "types-requests", + "types-toml", + "pandas-stubs", + "numpy" + ] - repo: https://github.com/pamoller/xmlformatter rev: v0.2.8 hooks: From 66323f05f14afacb00a30dbd4afb9628879ed018 Mon Sep 17 00:00:00 2001 From: Rithvik Doshi Date: Wed, 15 Oct 2025 14:14:53 -0400 Subject: [PATCH 13/28] fix: oh --- .github/workflows/pre-commit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 9924bae..2721a85 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -2,7 +2,7 @@ name: Pre-commit on: pull_request: - branches: [ dev ] + branches: [ default-app ] jobs: pre-commit: From 80a22c2f21757272bf6a8426faadc665327c30fe Mon Sep 17 00:00:00 2001 From: rithvik-doshi <81876806+rithvik-doshi@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:16:57 -0400 Subject: [PATCH 14/28] Update Python version in pre-commit workflow --- .github/workflows/pre-commit.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 2721a85..3fa6b94 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -13,9 +13,9 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: '3.11' + python-version: '3.12.9' # Official pre-commit action handles caching automatically - uses: pre-commit/action@v3.0.1 with: - extra_args: --all-files --show-diff-on-failure \ No newline at end of file + extra_args: --all-files --show-diff-on-failure From 03ca08a250ba1c5cf2d9f8084823da92b321a8bd Mon Sep 17 00:00:00 2001 From: Van Buren Date: Wed, 15 Oct 2025 14:21:48 -0400 Subject: [PATCH 15/28] fix: ux --- client/src/pages/HomePage.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/src/pages/HomePage.tsx b/client/src/pages/HomePage.tsx index baae08f..00b4bf6 100644 --- a/client/src/pages/HomePage.tsx +++ b/client/src/pages/HomePage.tsx @@ -11,7 +11,7 @@ export const HomePage = () => { /** * State */ - const [numValue, setNumValue] = useState(""); + const [textValue, setTextValue] = useState(""); /** * Library hooks @@ -19,9 +19,9 @@ export const HomePage = () => { const [helloUserResponse, isLoadingHelloUser] = useLoadingPixel("HelloUser()"); const [callPythonResponse, isLoadingCallPython] = useLoadingPixel( - `CallPython(${numValue})`, + `CallPython(${Number(textValue)})`, "", - numValue === "", + !Number(textValue) && textValue !== "0", ); return ( @@ -53,9 +53,9 @@ export const HomePage = () => { {"CallPython( numValue ="} - setNumValue(Number(e.target.value) || "") + setTextValue(e.target.value?.replace(/\D/g, "")) } size="small" /> From 9e0f1072482257dc916b4dcb0694d6228d405872 Mon Sep 17 00:00:00 2001 From: Van Buren Date: Fri, 17 Oct 2025 14:41:40 -0400 Subject: [PATCH 16/28] feat: up --- biome.json | 2 +- client/package.json | 12 +- client/pnpm-lock.yaml | 482 ++++++++++++++++++++---------------------- package.json | 4 +- pnpm-lock.yaml | 102 ++++----- 5 files changed, 293 insertions(+), 309 deletions(-) diff --git a/biome.json b/biome.json index 55ae5a7..2640499 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.2.5/schema.json", + "$schema": "https://biomejs.dev/schemas/2.2.6/schema.json", "vcs": { "enabled": true, "clientKind": "git", diff --git a/client/package.json b/client/package.json index 3df67b6..4a47e07 100644 --- a/client/package.json +++ b/client/package.json @@ -10,21 +10,21 @@ "@emotion/styled": "^11.14.1", "@mui/icons-material": "^7.3.4", "@mui/material": "^7.3.4", - "@mui/x-data-grid": "^8.13.1", - "@mui/x-date-pickers": "^8.12.0", + "@mui/x-data-grid": "^8.14.1", + "@mui/x-date-pickers": "^8.14.1", "@semoss/sdk": "1.0.0-beta.31", "@semoss/sdk-react": "1.0.0-beta.20", "dayjs": "^1.11.18", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-router-dom": "^7.9.3" + "react-router-dom": "^7.9.4" }, "devDependencies": { - "@types/node": "^24.6.2", - "@types/react": "^18.3.25", + "@types/node": "^24.8.1", + "@types/react": "^18.3.26", "@types/react-dom": "^18.3.7", "@vitejs/plugin-react": "^5.0.4", "typescript": "^5.9.3", - "vite": "^7.1.9" + "vite": "^7.1.10" } } diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml index 32ca198..2bdb6c3 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.25)(react@18.3.1) + version: 11.14.0(@types/react@18.3.26)(react@18.3.1) '@emotion/styled': specifier: ^11.14.1 - version: 11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.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) '@mui/icons-material': specifier: ^7.3.4 - version: 7.3.4(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) + version: 7.3.4(@mui/material@7.3.4(@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/material': specifier: ^7.3.4 - version: 7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 7.3.4(@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/x-data-grid': - specifier: ^8.13.1 - version: 8.13.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^8.14.1 + version: 8.14.1(@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.4(@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.3(@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-date-pickers': - specifier: ^8.12.0 - version: 8.12.0(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(dayjs@1.11.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^8.14.1 + version: 8.14.1(@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.4(@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.3(@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.18)(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) @@ -42,27 +42,27 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) react-router-dom: - specifier: ^7.9.3 - version: 7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.9.4 + version: 7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@types/node': - specifier: ^24.6.2 - version: 24.6.2 + specifier: ^24.8.1 + version: 24.8.1 '@types/react': - specifier: ^18.3.25 - version: 18.3.25 + specifier: ^18.3.26 + version: 18.3.26 '@types/react-dom': specifier: ^18.3.7 - version: 18.3.7(@types/react@18.3.25) + version: 18.3.7(@types/react@18.3.26) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.9(@types/node@24.6.2)(terser@5.44.0)) + version: 5.0.4(vite@7.1.10(@types/node@24.8.1)(terser@5.44.0)) typescript: specifier: ^5.9.3 version: 5.9.3 vite: - specifier: ^7.1.9 - version: 7.1.9(@types/node@24.6.2)(terser@5.44.0) + specifier: ^7.1.10 + version: 7.1.10(@types/node@24.8.1)(terser@5.44.0) packages: @@ -207,158 +207,158 @@ packages: '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} - '@esbuild/aix-ppc64@0.25.10': - resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.10': - resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.10': - resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.10': - resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.10': - resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.10': - resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.10': - resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.10': - resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.10': - resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.10': - resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.10': - resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.10': - resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.10': - resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.10': - resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.10': - resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.10': - resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.10': - resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.10': - resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.10': - resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.10': - resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.10': - resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.10': - resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.10': - resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.10': - resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.10': - resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.10': - resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -473,8 +473,8 @@ packages: '@types/react': optional: true - '@mui/x-data-grid@8.13.1': - resolution: {integrity: sha512-64MlyukMoGEDLT3kqdm6tw+rocgMayChj+h+fdAwqD4+2NMQoD5wZElQE+xTNmU0/DPv710X4ENceBRt2hMuGw==} + '@mui/x-data-grid@8.14.1': + resolution: {integrity: sha512-OY2oi61BSElXROgxZ2MPDFfnXGPyc7UbLc2ZrAryXus50XSQDYSxK0IP0pe0JyBDmZywV+5+GbV6YX7ZnlxRHw==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.9.0 @@ -489,8 +489,8 @@ packages: '@emotion/styled': optional: true - '@mui/x-date-pickers@8.12.0': - resolution: {integrity: sha512-CDcjdBNwMcTy3flZTCKZqSUS6deBFGKLqy3Vl6bgr5KTo8Vky2v+S+zNi56fv23Qs+P47GwpILcm3QZt/0BP0A==} + '@mui/x-date-pickers@8.14.1': + resolution: {integrity: sha512-NpUt08a0djJA/qnGzvfFoqZu8aumST73wdSgfFpA76Gd20a50NNL8OMk0enDQZG45jKHsgJqEYN9ramB+R/t5A==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.9.0 @@ -526,20 +526,14 @@ packages: moment-jalaali: optional: true - '@mui/x-internals@8.12.0': - resolution: {integrity: sha512-KCZgFHwuPg0v8I2gpjeC6k3eDRXPPX8RIGSNDXe8zSZ8dAw+p6Q2pzT9kKvctqCXSFK8ct/5YQwqx8Quhs8Ndg==} + '@mui/x-internals@8.14.0': + resolution: {integrity: sha512-esYyl61nuuFXiN631TWuPh2tqdoyTdBI/4UXgwH3rytF8jiWvy6prPBPRHEH1nvW3fgw9FoBI48FlOO+yEI8xg==} engines: {node: '>=14.0.0'} peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@mui/x-internals@8.13.1': - resolution: {integrity: sha512-OKQyCJ9uxtMpjBZCOEQGOR5MhgL1f9HjI4qZHuaLxxtDATK5rcBbVjBF67hI8FzXeF1wrcZP2wsjc4AgGpAo9g==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - - '@mui/x-virtualizer@0.2.2': - resolution: {integrity: sha512-+ZcGYh/9ykoEofzcAWcJ3n6TBXzCc2ETvytho30wRkYv1ez+8yps0ezns/QvC4JqXBge/3y+e+QatIYjkTltdw==} + '@mui/x-virtualizer@0.2.4': + resolution: {integrity: sha512-mQ5m/hcbmrSS6ZhxltO1a3nnKGl/sh8Rz9HohyiDlUKS7I/g8+lADzhCXcsDzg9PhQXGn0B5a0VQaK8UwMi6Yw==} engines: {node: '>=14.0.0'} peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -691,8 +685,8 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/node@24.6.2': - resolution: {integrity: sha512-d2L25Y4j+W3ZlNAeMKcy7yDsK425ibcAOO2t7aPTz6gNMH0z2GThtwENCDc0d/Pw9wgyRqE5Px1wkV7naz8ang==} + '@types/node@24.8.1': + resolution: {integrity: sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -710,8 +704,8 @@ packages: peerDependencies: '@types/react': '*' - '@types/react@18.3.25': - resolution: {integrity: sha512-oSVZmGtDPmRZtVDqvdKUi/qgCsWp5IDY29wp8na8Bj4B3cc99hfNzvNhlMkVVxctkAOGUA3Km7MMpBHAnWfcIA==} + '@types/react@18.3.26': + resolution: {integrity: sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==} '@vitejs/plugin-react@5.0.4': resolution: {integrity: sha512-La0KD0vGkVkSk6K+piWDKRUyg8Rl5iAIKRMH0vMJI0Eg47bq1eOxmoObAaQG37WMW9MSyk7Cs8EIWwJC1PtzKA==} @@ -728,8 +722,8 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} - baseline-browser-mapping@2.8.11: - resolution: {integrity: sha512-i+sRXGhz4+QW8aACZ3+r1GAKMt0wlFpeA8M5rOQd0HEYw9zhDrlx9Wc8uQ0IdXakjJRthzglEwfB/yqIjO6iDg==} + baseline-browser-mapping@2.8.17: + resolution: {integrity: sha512-j5zJcx6golJYTG6c05LUZ3Z8Gi+M62zRT/ycz4Xq4iCOdpcxwg7ngEYD4KA0eWZC7U17qh/Smq8bYbACJ0ipBA==} hasBin: true browserslist@4.26.3: @@ -744,8 +738,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001747: - resolution: {integrity: sha512-mzFa2DGIhuc5490Nd/G31xN1pnBnYMadtkyTjefPI7wzypqgCEpeWu9bJr0OnDsyKrW75zA9ZAt7pbQFmwLsQg==} + caniuse-lite@1.0.30001751: + resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} @@ -786,14 +780,14 @@ packages: dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - electron-to-chromium@1.5.230: - resolution: {integrity: sha512-A6A6Fd3+gMdaed9wX83CvHYJb4UuapPD5X5SLq72VZJzxHSY0/LUweGXRWmQlh2ln7KV7iw7jnwXK7dlPoOnHQ==} + electron-to-chromium@1.5.237: + resolution: {integrity: sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==} error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - esbuild@0.25.10: - resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} engines: {node: '>=18'} hasBin: true @@ -881,8 +875,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - node-releases@2.0.21: - resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + node-releases@2.0.25: + resolution: {integrity: sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -932,15 +926,15 @@ packages: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} - react-router-dom@7.9.3: - resolution: {integrity: sha512-1QSbA0TGGFKTAc/aWjpfW/zoEukYfU4dc1dLkT/vvf54JoGMkW+fNA+3oyo2gWVW1GM7BxjJVHz5GnPJv40rvg==} + react-router-dom@7.9.4: + resolution: {integrity: sha512-f30P6bIkmYvnHHa5Gcu65deIXoA2+r3Eb6PJIAddvsT9aGlchMatJ51GgpU470aSqRRbFX22T70yQNUGuW3DfA==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' react-dom: '>=18' - react-router@7.9.3: - resolution: {integrity: sha512-4o2iWCFIwhI/eYAIL43+cjORXYn/aRQPgtFRRZb3VzoyQ5Uej0Bmqj7437L97N9NJW4wnicSwLOLS+yCXfAPgg==} + react-router@7.9.4: + resolution: {integrity: sha512-SD3G8HKviFHg9xj7dNODUKDFgpG4xqD5nhyd0mYoB5iISepuZAvzSr8ywxgxKJ52yRzf/HWtVHc9AWwoTbljvA==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' @@ -1022,8 +1016,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - undici-types@7.13.0: - resolution: {integrity: sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==} + undici-types@7.14.0: + resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} @@ -1036,8 +1030,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - vite@7.1.9: - resolution: {integrity: sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==} + vite@7.1.10: + resolution: {integrity: sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1231,7 +1225,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1)': + '@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 @@ -1243,7 +1237,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.25 + '@types/react': 18.3.26 transitivePeerDependencies: - supports-color @@ -1257,18 +1251,18 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(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)': 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.25)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.26)(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.25 + '@types/react': 18.3.26 transitivePeerDependencies: - supports-color @@ -1282,82 +1276,82 @@ snapshots: '@emotion/weak-memoize@0.4.0': {} - '@esbuild/aix-ppc64@0.25.10': + '@esbuild/aix-ppc64@0.25.11': optional: true - '@esbuild/android-arm64@0.25.10': + '@esbuild/android-arm64@0.25.11': optional: true - '@esbuild/android-arm@0.25.10': + '@esbuild/android-arm@0.25.11': optional: true - '@esbuild/android-x64@0.25.10': + '@esbuild/android-x64@0.25.11': optional: true - '@esbuild/darwin-arm64@0.25.10': + '@esbuild/darwin-arm64@0.25.11': optional: true - '@esbuild/darwin-x64@0.25.10': + '@esbuild/darwin-x64@0.25.11': optional: true - '@esbuild/freebsd-arm64@0.25.10': + '@esbuild/freebsd-arm64@0.25.11': optional: true - '@esbuild/freebsd-x64@0.25.10': + '@esbuild/freebsd-x64@0.25.11': optional: true - '@esbuild/linux-arm64@0.25.10': + '@esbuild/linux-arm64@0.25.11': optional: true - '@esbuild/linux-arm@0.25.10': + '@esbuild/linux-arm@0.25.11': optional: true - '@esbuild/linux-ia32@0.25.10': + '@esbuild/linux-ia32@0.25.11': optional: true - '@esbuild/linux-loong64@0.25.10': + '@esbuild/linux-loong64@0.25.11': optional: true - '@esbuild/linux-mips64el@0.25.10': + '@esbuild/linux-mips64el@0.25.11': optional: true - '@esbuild/linux-ppc64@0.25.10': + '@esbuild/linux-ppc64@0.25.11': optional: true - '@esbuild/linux-riscv64@0.25.10': + '@esbuild/linux-riscv64@0.25.11': optional: true - '@esbuild/linux-s390x@0.25.10': + '@esbuild/linux-s390x@0.25.11': optional: true - '@esbuild/linux-x64@0.25.10': + '@esbuild/linux-x64@0.25.11': optional: true - '@esbuild/netbsd-arm64@0.25.10': + '@esbuild/netbsd-arm64@0.25.11': optional: true - '@esbuild/netbsd-x64@0.25.10': + '@esbuild/netbsd-x64@0.25.11': optional: true - '@esbuild/openbsd-arm64@0.25.10': + '@esbuild/openbsd-arm64@0.25.11': optional: true - '@esbuild/openbsd-x64@0.25.10': + '@esbuild/openbsd-x64@0.25.11': optional: true - '@esbuild/openharmony-arm64@0.25.10': + '@esbuild/openharmony-arm64@0.25.11': optional: true - '@esbuild/sunos-x64@0.25.10': + '@esbuild/sunos-x64@0.25.11': optional: true - '@esbuild/win32-arm64@0.25.10': + '@esbuild/win32-arm64@0.25.11': optional: true - '@esbuild/win32-ia32@0.25.10': + '@esbuild/win32-ia32@0.25.11': optional: true - '@esbuild/win32-x64@0.25.10': + '@esbuild/win32-x64@0.25.11': optional: true '@jridgewell/gen-mapping@0.3.13': @@ -1387,23 +1381,23 @@ snapshots: '@mui/core-downloads-tracker@7.3.4': {} - '@mui/icons-material@7.3.4(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.25)(react@18.3.1)': + '@mui/icons-material@7.3.4(@mui/material@7.3.4(@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)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 7.3.4(@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) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.25 + '@types/react': 18.3.26 - '@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@7.3.4(@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)': dependencies: '@babel/runtime': 7.28.4 '@mui/core-downloads-tracker': 7.3.4 - '@mui/system': 7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) - '@mui/types': 7.4.7(@types/react@18.3.25) - '@mui/utils': 7.3.3(@types/react@18.3.25)(react@18.3.1) + '@mui/system': 7.3.3(@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.7(@types/react@18.3.26) + '@mui/utils': 7.3.3(@types/react@18.3.26)(react@18.3.1) '@popperjs/core': 2.11.8 - '@types/react-transition-group': 4.4.12(@types/react@18.3.25) + '@types/react-transition-group': 4.4.12(@types/react@18.3.26) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 @@ -1412,20 +1406,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@18.3.25)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) - '@types/react': 18.3.25 + '@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 - '@mui/private-theming@7.3.3(@types/react@18.3.25)(react@18.3.1)': + '@mui/private-theming@7.3.3(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.3(@types/react@18.3.25)(react@18.3.1) + '@mui/utils': 7.3.3(@types/react@18.3.26)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.25 + '@types/react': 18.3.26 - '@mui/styled-engine@7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@7.3.3(@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)': dependencies: '@babel/runtime': 7.28.4 '@emotion/cache': 11.14.0 @@ -1435,107 +1429,97 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.25)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) + '@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/system@7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1)': + '@mui/system@7.3.3(@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)': dependencies: '@babel/runtime': 7.28.4 - '@mui/private-theming': 7.3.3(@types/react@18.3.25)(react@18.3.1) - '@mui/styled-engine': 7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.4.7(@types/react@18.3.25) - '@mui/utils': 7.3.3(@types/react@18.3.25)(react@18.3.1) + '@mui/private-theming': 7.3.3(@types/react@18.3.26)(react@18.3.1) + '@mui/styled-engine': 7.3.3(@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.7(@types/react@18.3.26) + '@mui/utils': 7.3.3(@types/react@18.3.26)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.25)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) - '@types/react': 18.3.25 + '@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 - '@mui/types@7.4.7(@types/react@18.3.25)': + '@mui/types@7.4.7(@types/react@18.3.26)': dependencies: '@babel/runtime': 7.28.4 optionalDependencies: - '@types/react': 18.3.25 + '@types/react': 18.3.26 - '@mui/utils@7.3.3(@types/react@18.3.25)(react@18.3.1)': + '@mui/utils@7.3.3(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/types': 7.4.7(@types/react@18.3.25) + '@mui/types': 7.4.7(@types/react@18.3.26) '@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.25 + '@types/react': 18.3.26 - '@mui/x-data-grid@8.13.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-data-grid@8.14.1(@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.4(@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.3(@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)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) - '@mui/utils': 7.3.3(@types/react@18.3.25)(react@18.3.1) - '@mui/x-internals': 8.13.1(@types/react@18.3.25)(react@18.3.1) - '@mui/x-virtualizer': 0.2.2(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 7.3.4(@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.3(@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.3(@types/react@18.3.26)(react@18.3.1) + '@mui/x-internals': 8.14.0(@types/react@18.3.26)(react@18.3.1) + '@mui/x-virtualizer': 0.2.4(@types/react@18.3.26)(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.25)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) + '@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) transitivePeerDependencies: - '@types/react' - '@mui/x-date-pickers@8.12.0(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(dayjs@1.11.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-date-pickers@8.14.1(@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.4(@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.3(@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.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) - '@mui/utils': 7.3.3(@types/react@18.3.25)(react@18.3.1) - '@mui/x-internals': 8.12.0(@types/react@18.3.25)(react@18.3.1) - '@types/react-transition-group': 4.4.12(@types/react@18.3.25) + '@mui/material': 7.3.4(@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.3(@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.3(@types/react@18.3.26)(react@18.3.1) + '@mui/x-internals': 8.14.0(@types/react@18.3.26)(react@18.3.1) + '@types/react-transition-group': 4.4.12(@types/react@18.3.26) 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.25)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) + '@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) dayjs: 1.11.18 transitivePeerDependencies: - '@types/react' - '@mui/x-internals@8.12.0(@types/react@18.3.25)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.3(@types/react@18.3.25)(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-internals@8.13.1(@types/react@18.3.25)(react@18.3.1)': + '@mui/x-internals@8.14.0(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.3(@types/react@18.3.25)(react@18.3.1) + '@mui/utils': 7.3.3(@types/react@18.3.26)(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.2(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-virtualizer@0.2.4(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.3(@types/react@18.3.25)(react@18.3.1) - '@mui/x-internals': 8.13.1(@types/react@18.3.25)(react@18.3.1) + '@mui/utils': 7.3.3(@types/react@18.3.26)(react@18.3.1) + '@mui/x-internals': 8.14.0(@types/react@18.3.26)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -1644,28 +1628,28 @@ snapshots: '@types/estree@1.0.8': {} - '@types/node@24.6.2': + '@types/node@24.8.1': dependencies: - undici-types: 7.13.0 + undici-types: 7.14.0 '@types/parse-json@4.0.2': {} '@types/prop-types@15.7.15': {} - '@types/react-dom@18.3.7(@types/react@18.3.25)': + '@types/react-dom@18.3.7(@types/react@18.3.26)': dependencies: - '@types/react': 18.3.25 + '@types/react': 18.3.26 - '@types/react-transition-group@4.4.12(@types/react@18.3.25)': + '@types/react-transition-group@4.4.12(@types/react@18.3.26)': dependencies: - '@types/react': 18.3.25 + '@types/react': 18.3.26 - '@types/react@18.3.25': + '@types/react@18.3.26': dependencies: '@types/prop-types': 15.7.15 csstype: 3.1.3 - '@vitejs/plugin-react@5.0.4(vite@7.1.9(@types/node@24.6.2)(terser@5.44.0))': + '@vitejs/plugin-react@5.0.4(vite@7.1.10(@types/node@24.8.1)(terser@5.44.0))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) @@ -1673,7 +1657,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.38 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.9(@types/node@24.6.2)(terser@5.44.0) + vite: 7.1.10(@types/node@24.8.1)(terser@5.44.0) transitivePeerDependencies: - supports-color @@ -1686,14 +1670,14 @@ snapshots: cosmiconfig: 7.1.0 resolve: 1.22.10 - baseline-browser-mapping@2.8.11: {} + baseline-browser-mapping@2.8.17: {} browserslist@4.26.3: dependencies: - baseline-browser-mapping: 2.8.11 - caniuse-lite: 1.0.30001747 - electron-to-chromium: 1.5.230 - node-releases: 2.0.21 + baseline-browser-mapping: 2.8.17 + caniuse-lite: 1.0.30001751 + electron-to-chromium: 1.5.237 + node-releases: 2.0.25 update-browserslist-db: 1.1.3(browserslist@4.26.3) buffer-from@1.1.2: @@ -1701,7 +1685,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001747: {} + caniuse-lite@1.0.30001751: {} clsx@2.1.1: {} @@ -1735,40 +1719,40 @@ snapshots: '@babel/runtime': 7.28.4 csstype: 3.1.3 - electron-to-chromium@1.5.230: {} + electron-to-chromium@1.5.237: {} error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 - esbuild@0.25.10: + esbuild@0.25.11: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.10 - '@esbuild/android-arm': 0.25.10 - '@esbuild/android-arm64': 0.25.10 - '@esbuild/android-x64': 0.25.10 - '@esbuild/darwin-arm64': 0.25.10 - '@esbuild/darwin-x64': 0.25.10 - '@esbuild/freebsd-arm64': 0.25.10 - '@esbuild/freebsd-x64': 0.25.10 - '@esbuild/linux-arm': 0.25.10 - '@esbuild/linux-arm64': 0.25.10 - '@esbuild/linux-ia32': 0.25.10 - '@esbuild/linux-loong64': 0.25.10 - '@esbuild/linux-mips64el': 0.25.10 - '@esbuild/linux-ppc64': 0.25.10 - '@esbuild/linux-riscv64': 0.25.10 - '@esbuild/linux-s390x': 0.25.10 - '@esbuild/linux-x64': 0.25.10 - '@esbuild/netbsd-arm64': 0.25.10 - '@esbuild/netbsd-x64': 0.25.10 - '@esbuild/openbsd-arm64': 0.25.10 - '@esbuild/openbsd-x64': 0.25.10 - '@esbuild/openharmony-arm64': 0.25.10 - '@esbuild/sunos-x64': 0.25.10 - '@esbuild/win32-arm64': 0.25.10 - '@esbuild/win32-ia32': 0.25.10 - '@esbuild/win32-x64': 0.25.10 + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 escalade@3.2.0: {} @@ -1828,7 +1812,7 @@ snapshots: nanoid@3.3.11: {} - node-releases@2.0.21: {} + node-releases@2.0.25: {} object-assign@4.1.1: {} @@ -1875,13 +1859,13 @@ snapshots: react-refresh@0.17.0: {} - react-router-dom@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router-dom@7.9.4(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.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-router: 7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: cookie: 1.0.2 react: 18.3.1 @@ -1980,7 +1964,7 @@ snapshots: typescript@5.9.3: {} - undici-types@7.13.0: {} + undici-types@7.14.0: {} update-browserslist-db@1.1.3(browserslist@4.26.3): dependencies: @@ -1992,16 +1976,16 @@ snapshots: dependencies: react: 18.3.1 - vite@7.1.9(@types/node@24.6.2)(terser@5.44.0): + vite@7.1.10(@types/node@24.8.1)(terser@5.44.0): dependencies: - esbuild: 0.25.10 + esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 rollup: 4.52.4 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.6.2 + '@types/node': 24.8.1 fsevents: 2.3.3 terser: 5.44.0 diff --git a/package.json b/package.json index dd4106e..eff57d8 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.2.5", + "@biomejs/biome": "2.2.6", "http-server": "^14.1.1", "husky": "^9.1.7", - "lint-staged": "^16.2.3" + "lint-staged": "^16.2.4" }, "lint-staged": { "**/*.{js,jsx,ts,tsx,json,html,css}": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b67ba7..25351f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: devDependencies: '@biomejs/biome': - specifier: 2.2.5 - version: 2.2.5 + specifier: 2.2.6 + version: 2.2.6 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.3 - version: 16.2.3 + specifier: ^16.2.4 + version: 16.2.4 packages: - '@biomejs/biome@2.2.5': - resolution: {integrity: sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw==} + '@biomejs/biome@2.2.6': + resolution: {integrity: sha512-yKTCNGhek0rL5OEW1jbLeZX8LHaM8yk7+3JRGv08my+gkpmtb5dDE+54r2ZjZx0ediFEn1pYBOJSmOdDP9xtFw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.2.5': - resolution: {integrity: sha512-MYT+nZ38wEIWVcL5xLyOhYQQ7nlWD0b/4mgATW2c8dvq7R4OQjt/XGXFkXrmtWmQofaIM14L7V8qIz/M+bx5QQ==} + '@biomejs/cli-darwin-arm64@2.2.6': + resolution: {integrity: sha512-UZPmn3M45CjTYulgcrFJFZv7YmK3pTxTJDrFYlNElT2FNnkkX4fsxjExTSMeWKQYoZjvekpH5cvrYZZlWu3yfA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.2.5': - resolution: {integrity: sha512-FLIEl73fv0R7dI10EnEiZLw+IMz3mWLnF95ASDI0kbx6DDLJjWxE5JxxBfmG+udz1hIDd3fr5wsuP7nwuTRdAg==} + '@biomejs/cli-darwin-x64@2.2.6': + resolution: {integrity: sha512-HOUIquhHVgh/jvxyClpwlpl/oeMqntlteL89YqjuFDiZ091P0vhHccwz+8muu3nTyHWM5FQslt+4Jdcd67+xWQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.2.5': - resolution: {integrity: sha512-5Ov2wgAFwqDvQiESnu7b9ufD1faRa+40uwrohgBopeY84El2TnBDoMNXx6iuQdreoFGjwW8vH6k68G21EpNERw==} + '@biomejs/cli-linux-arm64-musl@2.2.6': + resolution: {integrity: sha512-TjCenQq3N6g1C+5UT3jE1bIiJb5MWQvulpUngTIpFsL4StVAUXucWD0SL9MCW89Tm6awWfeXBbZBAhJwjyFbRQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@2.2.5': - resolution: {integrity: sha512-5DjiiDfHqGgR2MS9D+AZ8kOfrzTGqLKywn8hoXpXXlJXIECGQ32t+gt/uiS2XyGBM2XQhR6ztUvbjZWeccFMoQ==} + '@biomejs/cli-linux-arm64@2.2.6': + resolution: {integrity: sha512-BpGtuMJGN+o8pQjvYsUKZ+4JEErxdSmcRD/JG3mXoWc6zrcA7OkuyGFN1mDggO0Q1n7qXxo/PcupHk8gzijt5g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@2.2.5': - resolution: {integrity: sha512-AVqLCDb/6K7aPNIcxHaTQj01sl1m989CJIQFQEaiQkGr2EQwyOpaATJ473h+nXDUuAcREhccfRpe/tu+0wu0eQ==} + '@biomejs/cli-linux-x64-musl@2.2.6': + resolution: {integrity: sha512-1ZcBux8zVM3JhWN2ZCPaYf0+ogxXG316uaoXJdgoPZcdK/rmRcRY7PqHdAos2ExzvjIdvhQp72UcveI98hgOog==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@2.2.5': - resolution: {integrity: sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew==} + '@biomejs/cli-linux-x64@2.2.6': + resolution: {integrity: sha512-1HaM/dpI/1Z68zp8ZdT6EiBq+/O/z97a2AiHMl+VAdv5/ELckFt9EvRb8hDHpk8hUMoz03gXkC7VPXOVtU7faA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@2.2.5': - resolution: {integrity: sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg==} + '@biomejs/cli-win32-arm64@2.2.6': + resolution: {integrity: sha512-h3A88G8PGM1ryTeZyLlSdfC/gz3e95EJw9BZmA6Po412DRqwqPBa2Y9U+4ZSGUAXCsnSQE00jLV8Pyrh0d+jQw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.2.5': - resolution: {integrity: sha512-F/jhuXCssPFAuciMhHKk00xnCAxJRS/pUzVfXYmOMUp//XW7mO6QeCjsjvnm8L4AO/dG2VOB0O+fJPiJ2uXtIw==} + '@biomejs/cli-win32-x64@2.2.6': + resolution: {integrity: sha512-yx0CqeOhPjYQ5ZXgPfu8QYkgBhVJyvWe36as7jRuPrKPO5ylVDfwVtPQ+K/mooNTADW0IhxOZm3aPu16dP8yNQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -154,8 +154,8 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - emoji-regex@10.5.0: - resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} @@ -257,8 +257,8 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - lint-staged@16.2.3: - resolution: {integrity: sha512-1OnJEESB9zZqsp61XHH2fvpS1es3hRCxMplF/AJUDa8Ho8VrscYDIuxGrj3m8KPXbcWZ8fT9XTMUhEQmOVKpKw==} + lint-staged@16.2.4: + resolution: {integrity: sha512-Pkyr/wd90oAyXk98i/2KwfkIhoYQUMtss769FIT9hFM5ogYZwrk+GRE46yKXSg2ZGhcJ1p38Gf5gmI5Ohjg2yg==} engines: {node: '>=20.17'} hasBin: true @@ -293,8 +293,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nano-spawn@1.0.3: - resolution: {integrity: sha512-jtpsQDetTnvS2Ts1fiRdci5rx0VYws5jGyC+4IYOTnIQ/wwdf6JdomlHBwqC3bJYOvaKu0C2GSZ1A60anrYpaA==} + nano-spawn@2.0.0: + resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} engines: {node: '>=20.17'} object-inspect@1.13.4: @@ -415,39 +415,39 @@ packages: snapshots: - '@biomejs/biome@2.2.5': + '@biomejs/biome@2.2.6': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.2.5 - '@biomejs/cli-darwin-x64': 2.2.5 - '@biomejs/cli-linux-arm64': 2.2.5 - '@biomejs/cli-linux-arm64-musl': 2.2.5 - '@biomejs/cli-linux-x64': 2.2.5 - '@biomejs/cli-linux-x64-musl': 2.2.5 - '@biomejs/cli-win32-arm64': 2.2.5 - '@biomejs/cli-win32-x64': 2.2.5 - - '@biomejs/cli-darwin-arm64@2.2.5': + '@biomejs/cli-darwin-arm64': 2.2.6 + '@biomejs/cli-darwin-x64': 2.2.6 + '@biomejs/cli-linux-arm64': 2.2.6 + '@biomejs/cli-linux-arm64-musl': 2.2.6 + '@biomejs/cli-linux-x64': 2.2.6 + '@biomejs/cli-linux-x64-musl': 2.2.6 + '@biomejs/cli-win32-arm64': 2.2.6 + '@biomejs/cli-win32-x64': 2.2.6 + + '@biomejs/cli-darwin-arm64@2.2.6': optional: true - '@biomejs/cli-darwin-x64@2.2.5': + '@biomejs/cli-darwin-x64@2.2.6': optional: true - '@biomejs/cli-linux-arm64-musl@2.2.5': + '@biomejs/cli-linux-arm64-musl@2.2.6': optional: true - '@biomejs/cli-linux-arm64@2.2.5': + '@biomejs/cli-linux-arm64@2.2.6': optional: true - '@biomejs/cli-linux-x64-musl@2.2.5': + '@biomejs/cli-linux-x64-musl@2.2.6': optional: true - '@biomejs/cli-linux-x64@2.2.5': + '@biomejs/cli-linux-x64@2.2.6': optional: true - '@biomejs/cli-win32-arm64@2.2.5': + '@biomejs/cli-win32-arm64@2.2.6': optional: true - '@biomejs/cli-win32-x64@2.2.5': + '@biomejs/cli-win32-x64@2.2.6': optional: true ansi-escapes@7.1.1: @@ -518,7 +518,7 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - emoji-regex@10.5.0: {} + emoji-regex@10.6.0: {} environment@1.1.0: {} @@ -617,12 +617,12 @@ snapshots: is-number@7.0.0: {} - lint-staged@16.2.3: + lint-staged@16.2.4: dependencies: commander: 14.0.1 listr2: 9.0.4 micromatch: 4.0.8 - nano-spawn: 1.0.3 + nano-spawn: 2.0.0 pidtree: 0.6.0 string-argv: 0.3.2 yaml: 2.8.1 @@ -659,7 +659,7 @@ snapshots: ms@2.1.3: {} - nano-spawn@1.0.3: {} + nano-spawn@2.0.0: {} object-inspect@1.13.4: {} @@ -738,7 +738,7 @@ snapshots: string-width@7.2.0: dependencies: - emoji-regex: 10.5.0 + emoji-regex: 10.6.0 get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 From 6ee33bf2c72494fe4679f69f85c7e267db0b9dd8 Mon Sep 17 00:00:00 2001 From: Rithvik Doshi Date: Fri, 17 Oct 2025 14:46:10 -0400 Subject: [PATCH 17/28] fix(style/chore): moar docs --- .../reactors/examples/CallPythonReactor.java | 57 +++++++++++- java/src/util/Constants.java | 8 +- java/src/util/HelperMethods.java | 4 + java/src/util/ProjectProperties.java | 90 ++++++++++++------- 4 files changed, 122 insertions(+), 37 deletions(-) diff --git a/java/src/reactors/examples/CallPythonReactor.java b/java/src/reactors/examples/CallPythonReactor.java index 9577ab0..ee92be4 100644 --- a/java/src/reactors/examples/CallPythonReactor.java +++ b/java/src/reactors/examples/CallPythonReactor.java @@ -9,13 +9,46 @@ import reactors.AbstractProjectReactor; /** - * Example reactor that calls Python functions from Java. Takes a numeric input and calls - * nthFibonacci Python function. + * 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 @@ -25,6 +58,26 @@ public CallPythonReactor() { 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 diff --git a/java/src/util/Constants.java b/java/src/util/Constants.java index fd889ee..5720f49 100644 --- a/java/src/util/Constants.java +++ b/java/src/util/Constants.java @@ -11,9 +11,15 @@ * *

        As a utility class, this class should not be instantiated and all members should be static and * public for easy access throughout the project. + * + * @see {@link HelperMethods} for complementary reusable helper functions operating on constant + * values. + * @see {@link ProjectProperties} for dynamically loaded configuration properties that augment these + * static constants. */ public class Constants { - // TODO add any constants to be referenced in the project + // TODO add any constants to be referenced in the project (add JavaDoc for each constant when + // created). } diff --git a/java/src/util/HelperMethods.java b/java/src/util/HelperMethods.java index 2903609..ea31e97 100644 --- a/java/src/util/HelperMethods.java +++ b/java/src/util/HelperMethods.java @@ -10,5 +10,9 @@ * *

        As a utility class, this class should not be instantiated and all methods should be static and * public for easy access throughout the project. + * + * @see {@link Constants} for static configuration values that may be manipulated or referenced by + * future helper methods. + * @see {@link ProjectProperties} for dynamic property values that helper methods may consume. */ public class HelperMethods {} diff --git a/java/src/util/ProjectProperties.java b/java/src/util/ProjectProperties.java index cb41150..2aec022 100644 --- a/java/src/util/ProjectProperties.java +++ b/java/src/util/ProjectProperties.java @@ -9,20 +9,32 @@ import prerna.util.Utility; /** - * Loads property values from a project asset at + * Singleton utility class responsible for loading and exposing project-specific configuration + * properties. Properties are sourced from the project asset file located at: * - *

        [proj]/app_root/version/assets/java/project.properties
        + *
        [projectId]/app_root/version/assets/java/project.properties
        * - * into a static instance. The project used to infer the path is an argument at runtime. + *

        Invocation pattern: * - *

        File format conforms to typical java.util.Properties style load patterns: one property per - * line with white space, {@code '='}, or {@code ':'} separating the key and value. + *

          + *
        • Call {@link #getInstance(String)} once with a valid project identifier to lazily initialize + * and load the backing properties file. + *
        • Subsequent calls to {@link #getInstance()} retrieve the same initialized singleton + * instance. + *
        * - *

        Replace the engineId applicable for your project in a format such as: + *

        File format conforms to standard {@link Properties} loading rules: one property per line with + * supported separators (whitespace, '=' or ':'). Custom project keys (e.g., engineId) + * can be defined following that pattern: * *

        engineId=fc6a3fab-2425-4987-be93-58ad2efeee24
        * - * @see java.util.Properties#load(java.io.Reader) + *

        Error handling uses {@link ProjectException} wrapping {@link domain.base.ErrorCode} values to + * provide consistent structured failure semantics when initialization or file IO fails. + * + * @see {@link ProjectException} for structured configuration load error reporting. + * @see {@link #getInstance(String)} for initial lazy load of the singleton. + * @see {@link Properties#load(java.io.InputStream)} for supported file parsing rules. */ public class ProjectProperties { @@ -35,19 +47,23 @@ public class ProjectProperties { // TODO: Add var for each property /** - * Private constructor to prevent direct instantiation. This class follows the Singleton pattern - * and should be accessed through {@link #getInstance()} or {@link #getInstance(String)} methods. + * Private constructor to prevent direct instantiation. + * + *

        This class follows the Singleton pattern and should be accessed exclusively through {@link + * #getInstance()} or the lazy-loading {@link #getInstance(String)} initialization variant. */ private ProjectProperties() {} /** - * Returns the singleton instance of ProjectProperties. This method requires that the instance has - * already been initialized with a project ID using {@link #getInstance(String)}. If the instance - * has not been initialized, it throws a {@link ProjectException}. + * Returns the already-initialized singleton instance of {@link ProjectProperties}. * - * @return The singleton ProjectProperties instance - * @throws ProjectException If the instance has not been initialized with a project ID - * @see {@link #getInstance(String)} for initializing the instance + *

        This accessor requires prior initialization through {@link #getInstance(String)}. If the + * instance is still null, a {@link ProjectException} is thrown indicating an improper lifecycle + * usage. + * + * @return The singleton {@link ProjectProperties} instance. + * @throws ProjectException If the singleton has not yet been initialized. + * @see {@link #getInstance(String)} for first-time initialization semantics. */ public static ProjectProperties getInstance() { if (INSTANCE == null) { @@ -58,14 +74,15 @@ public static ProjectProperties getInstance() { } /** - * Returns the singleton instance of ProjectProperties, initializing it if necessary. If this is - * the first call or the instance is null, this method loads the project properties from the - * specified project's configuration file. + * Lazily initializes and returns the singleton instance of {@link ProjectProperties}. If no prior + * instance exists, this method triggers a properties file load using the supplied project + * identifier. * - * @param projectId The project identifier used to locate the project.properties file - * @return The singleton ProjectProperties instance - * @throws ProjectException If there are issues loading the project configuration - * @see {@link #loadProp(String)} for the actual property loading logic + * @param projectId The project identifier used to locate the project.properties + * file. + * @return The singleton {@link ProjectProperties} instance. + * @throws ProjectException If an IO error occurs during property loading. + * @see {@link #loadProp(String)} for internal file parsing and singleton assignment logic. */ public static ProjectProperties getInstance(String projectId) { if (INSTANCE == null) { @@ -75,21 +92,26 @@ public static ProjectProperties getInstance(String projectId) { } /** - * Loads project properties from the project's configuration file and initializes the singleton - * instance. This method reads the project.properties file from the project's assets folder and - * populates the ProjectProperties instance with the loaded configuration values. + * Internal helper that performs the actual loading of project configuration data into the + * singleton instance. The method constructs the properties file path using the resolved assets + * folder and delegates parsing to {@link Properties#load(java.io.InputStream)}. * - *

        The properties file is expected to be located at: + *

        Location pattern: * *

        [projectId]/app_root/version/assets/java/project.properties
        * - *

        This method uses try-with-resources to ensure proper resource cleanup and handles any IO - * exceptions by converting them to {@link ProjectException} instances. + *

        Lifecycle notes: + * + *

          + *
        • On success, assigns the newly created instance to {@code INSTANCE}. + *
        • On failure (IO issues), resets {@code INSTANCE} to null and throws a {@link + * ProjectException} wrapping {@link domain.base.ErrorCode#INTERNAL_SERVER_ERROR}. + *
        * - * @param projectId The project identifier used to construct the path to the properties file - * @throws ProjectException If there are IO errors reading the properties file - * @see {@link Properties#load(java.io.InputStream)} for property file format requirements - * @see {@link AssetUtility#getProjectAssetsFolder(String)} for asset folder resolution + * @param projectId The project identifier used to build the canonical properties file path. + * @throws ProjectException If an {@link IOException} occurs during file access or parsing. + * @see {@link AssetUtility#getProjectAssetsFolder(String)} for asset folder resolution logic. + * @see {@link Properties#load(java.io.InputStream)} for specification-compliant parsing. */ private static void loadProp(String projectId) { ProjectProperties newInstance = new ProjectProperties(); @@ -101,7 +123,7 @@ private static void loadProp(String projectId) { Properties projectProperties = new Properties(); projectProperties.load(fileIn); - // TODO Add any properties to be read by the properties file and add the corresponding getter + // TODO Add any properties to be read by the properties file and add the corresponding getter. INSTANCE = newInstance; } catch (IOException e) { @@ -111,6 +133,6 @@ private static void loadProp(String projectId) { } } - // TODO: Add getters for properties + // TODO: Add getters for properties with appropriate JavaDoc linking to individual property keys. } From 0e6f50eccb907db348babc4eec95893a7d8fd296 Mon Sep 17 00:00:00 2001 From: Shail Patel Date: Fri, 17 Oct 2025 15:39:10 -0400 Subject: [PATCH 18/28] fix: Changed package.json to have && --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index eff57d8..a886de0 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "private": true, "scripts": { - "fix": "biome format --write && biome lint; pre-commit run --all-files || pre-commit run --all-files", + "fix": "biome format --write && biome lint && pre-commit run --all-files || pre-commit run --all-files", "dev": "pnpm --dir client dev", - "javadoc": "mvn clean javadoc:javadoc; mvn site; pnpm exec http-server target/site/apidocs -p 1227 -a localhost -o" + "javadoc": "mvn clean javadoc:javadoc && mvn site && pnpm exec http-server target/site/apidocs -p 1227 -a localhost -o" }, "devDependencies": { "@biomejs/biome": "2.2.6", From 398c79029c1e71e52fed6077e082276b79cb07ab Mon Sep 17 00:00:00 2001 From: Van Buren Date: Fri, 17 Oct 2025 15:54:54 -0400 Subject: [PATCH 19/28] feat: format --- java/src/reactors/AbstractProjectReactor.java | 3 ++- java/src/util/Constants.java | 3 ++- java/src/util/ProjectProperties.java | 18 +++++++++++++----- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/java/src/reactors/AbstractProjectReactor.java b/java/src/reactors/AbstractProjectReactor.java index 8f58f6e..d6039f0 100644 --- a/java/src/reactors/AbstractProjectReactor.java +++ b/java/src/reactors/AbstractProjectReactor.java @@ -43,7 +43,8 @@ public abstract class AbstractProjectReactor extends AbstractReactor { /** Project-specific properties and configuration settings. */ protected ProjectProperties projectProperties; - // TODO: Initialize additional protected variables (engines, external services, etc.) + // 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; diff --git a/java/src/util/Constants.java b/java/src/util/Constants.java index 5720f49..f50bc5c 100644 --- a/java/src/util/Constants.java +++ b/java/src/util/Constants.java @@ -19,7 +19,8 @@ */ public class Constants { - // TODO add any constants to be referenced in the project (add JavaDoc for each constant when + // TODO add any constants to be referenced in the project (add JavaDoc for each + // constant when // created). } diff --git a/java/src/util/ProjectProperties.java b/java/src/util/ProjectProperties.java index 2aec022..33fe2ea 100644 --- a/java/src/util/ProjectProperties.java +++ b/java/src/util/ProjectProperties.java @@ -12,7 +12,9 @@ * Singleton utility class responsible for loading and exposing project-specific configuration * properties. Properties are sourced from the project asset file located at: * - *
        [projectId]/app_root/version/assets/java/project.properties
        + *
        + * [projectId]/app_root/version/assets/java/project.properties
        + * 
        * *

        Invocation pattern: * @@ -27,7 +29,9 @@ * supported separators (whitespace, '=' or ':'). Custom project keys (e.g., engineId) * can be defined following that pattern: * - *

        engineId=fc6a3fab-2425-4987-be93-58ad2efeee24
        + *
        + * engineId=fc6a3fab-2425-4987-be93-58ad2efeee24
        + * 
        * *

        Error handling uses {@link ProjectException} wrapping {@link domain.base.ErrorCode} values to * provide consistent structured failure semantics when initialization or file IO fails. @@ -98,7 +102,9 @@ public static ProjectProperties getInstance(String projectId) { * *

        Location pattern: * - *

        [projectId]/app_root/version/assets/java/project.properties
        + *
        +   * [projectId]/app_root/version/assets/java/project.properties
        +   * 
        * *

        Lifecycle notes: * @@ -123,7 +129,8 @@ private static void loadProp(String projectId) { Properties projectProperties = new Properties(); projectProperties.load(fileIn); - // TODO Add any properties to be read by the properties file and add the corresponding getter. + // TODO Add any properties to be read by the properties file and add the + // corresponding getter. INSTANCE = newInstance; } catch (IOException e) { @@ -133,6 +140,7 @@ private static void loadProp(String projectId) { } } - // TODO: Add getters for properties with appropriate JavaDoc linking to individual property keys. + // TODO: Add getters for properties with appropriate JavaDoc linking to + // individual property keys. } From db3cbcd538b565b1ad0ab4d3ddf122dd0e1009f5 Mon Sep 17 00:00:00 2001 From: Van Buren Date: Fri, 17 Oct 2025 15:56:47 -0400 Subject: [PATCH 20/28] muahaha --- java/src/util/ProjectProperties.java | 112 +++++++++++++++++---------- 1 file changed, 73 insertions(+), 39 deletions(-) diff --git a/java/src/util/ProjectProperties.java b/java/src/util/ProjectProperties.java index 33fe2ea..d196385 100644 --- a/java/src/util/ProjectProperties.java +++ b/java/src/util/ProjectProperties.java @@ -9,41 +9,54 @@ import prerna.util.Utility; /** - * Singleton utility class responsible for loading and exposing project-specific configuration + * Singleton utility class responsible for loading and exposing project-specific + * configuration * properties. Properties are sourced from the project asset file located at: * *

          * [projectId]/app_root/version/assets/java/project.properties
          * 
        * - *

        Invocation pattern: + *

        + * Invocation pattern: * *

          - *
        • Call {@link #getInstance(String)} once with a valid project identifier to lazily initialize - * and load the backing properties file. - *
        • Subsequent calls to {@link #getInstance()} retrieve the same initialized singleton - * instance. + *
        • Call {@link #getInstance(String)} once with a valid project identifier to + * lazily initialize + * and load the backing properties file. + *
        • Subsequent calls to {@link #getInstance()} retrieve the same initialized + * singleton + * instance. *
        * - *

        File format conforms to standard {@link Properties} loading rules: one property per line with - * supported separators (whitespace, '=' or ':'). Custom project keys (e.g., engineId) + *

        + * File format conforms to standard {@link Properties} loading rules: one + * property per line with + * supported separators (whitespace, '=' or ':'). Custom project keys (e.g., + * engineId) * can be defined following that pattern: * *

          * engineId=fc6a3fab-2425-4987-be93-58ad2efeee24
          * 
        * - *

        Error handling uses {@link ProjectException} wrapping {@link domain.base.ErrorCode} values to - * provide consistent structured failure semantics when initialization or file IO fails. + *

        + * Error handling uses {@link ProjectException} wrapping + * {@link domain.base.ErrorCode} values to + * provide consistent structured failure semantics when initialization or file + * IO fails. * - * @see {@link ProjectException} for structured configuration load error reporting. + * @see {@link ProjectException} for structured configuration load error + * reporting. * @see {@link #getInstance(String)} for initial lazy load of the singleton. - * @see {@link Properties#load(java.io.InputStream)} for supported file parsing rules. + * @see {@link Properties#load(java.io.InputStream)} for supported file parsing + * rules. */ public class ProjectProperties { /** - * The singleton instance of ProjectProperties. This instance is initialized lazily when {@link + * The singleton instance of ProjectProperties. This instance is initialized + * lazily when {@link * #getInstance(String)} is first called. */ private static ProjectProperties INSTANCE = null; @@ -53,16 +66,24 @@ public class ProjectProperties { /** * Private constructor to prevent direct instantiation. * - *

        This class follows the Singleton pattern and should be accessed exclusively through {@link - * #getInstance()} or the lazy-loading {@link #getInstance(String)} initialization variant. + *

        + * This class follows the Singleton pattern and should be accessed exclusively + * through {@link + * #getInstance()} or the lazy-loading {@link #getInstance(String)} + * initialization variant. */ - private ProjectProperties() {} + private ProjectProperties() { + } /** - * Returns the already-initialized singleton instance of {@link ProjectProperties}. + * Returns the already-initialized singleton instance of + * {@link ProjectProperties}. * - *

        This accessor requires prior initialization through {@link #getInstance(String)}. If the - * instance is still null, a {@link ProjectException} is thrown indicating an improper lifecycle + *

        + * This accessor requires prior initialization through + * {@link #getInstance(String)}. If the + * instance is still null, a {@link ProjectException} is thrown indicating an + * improper lifecycle * usage. * * @return The singleton {@link ProjectProperties} instance. @@ -78,15 +99,19 @@ public static ProjectProperties getInstance() { } /** - * Lazily initializes and returns the singleton instance of {@link ProjectProperties}. If no prior - * instance exists, this method triggers a properties file load using the supplied project + * Lazily initializes and returns the singleton instance of + * {@link ProjectProperties}. If no prior + * instance exists, this method triggers a properties file load using the + * supplied project * identifier. * - * @param projectId The project identifier used to locate the project.properties - * file. + * @param projectId The project identifier used to locate the + * project.properties + * file. * @return The singleton {@link ProjectProperties} instance. * @throws ProjectException If an IO error occurs during property loading. - * @see {@link #loadProp(String)} for internal file parsing and singleton assignment logic. + * @see {@link #loadProp(String)} for internal file parsing and singleton + * assignment logic. */ public static ProjectProperties getInstance(String projectId) { if (INSTANCE == null) { @@ -96,36 +121,45 @@ public static ProjectProperties getInstance(String projectId) { } /** - * Internal helper that performs the actual loading of project configuration data into the - * singleton instance. The method constructs the properties file path using the resolved assets + * Internal helper that performs the actual loading of project configuration + * data into the + * singleton instance. The method constructs the properties file path using the + * resolved assets * folder and delegates parsing to {@link Properties#load(java.io.InputStream)}. * - *

        Location pattern: + *

        + * Location pattern: * *

            * [projectId]/app_root/version/assets/java/project.properties
            * 
        * - *

        Lifecycle notes: + *

        + * Lifecycle notes: * *

          - *
        • On success, assigns the newly created instance to {@code INSTANCE}. - *
        • On failure (IO issues), resets {@code INSTANCE} to null and throws a {@link - * ProjectException} wrapping {@link domain.base.ErrorCode#INTERNAL_SERVER_ERROR}. + *
        • On success, assigns the newly created instance to {@code INSTANCE}. + *
        • On failure (IO issues), resets {@code INSTANCE} to null and throws a + * {@link + * ProjectException} wrapping + * {@link domain.base.ErrorCode#INTERNAL_SERVER_ERROR}. *
        * - * @param projectId The project identifier used to build the canonical properties file path. - * @throws ProjectException If an {@link IOException} occurs during file access or parsing. - * @see {@link AssetUtility#getProjectAssetsFolder(String)} for asset folder resolution logic. - * @see {@link Properties#load(java.io.InputStream)} for specification-compliant parsing. + * @param projectId The project identifier used to build the canonical + * properties file path. + * @throws ProjectException If an {@link IOException} occurs during file access + * or parsing. + * @see {@link AssetUtility#getProjectAssetsFolder(String)} for asset folder + * resolution logic. + * @see {@link Properties#load(java.io.InputStream)} for specification-compliant + * parsing. */ private static void loadProp(String projectId) { ProjectProperties newInstance = new ProjectProperties(); - try (final FileInputStream fileIn = - new FileInputStream( - Utility.normalizePath( - AssetUtility.getProjectAssetsFolder(projectId) + "/java/project.properties"))) { + try (final FileInputStream fileIn = new FileInputStream( + Utility.normalizePath( + AssetUtility.getProjectAssetsFolder(projectId) + "/java/project.properties"))) { Properties projectProperties = new Properties(); projectProperties.load(fileIn); From d8190c730773780e0bdcd30d8313a7037c741b4c Mon Sep 17 00:00:00 2001 From: Van Buren Date: Fri, 17 Oct 2025 15:57:07 -0400 Subject: [PATCH 21/28] Revert "muahaha" This reverts commit db3cbcd538b565b1ad0ab4d3ddf122dd0e1009f5. --- java/src/util/ProjectProperties.java | 112 ++++++++++----------------- 1 file changed, 39 insertions(+), 73 deletions(-) diff --git a/java/src/util/ProjectProperties.java b/java/src/util/ProjectProperties.java index d196385..33fe2ea 100644 --- a/java/src/util/ProjectProperties.java +++ b/java/src/util/ProjectProperties.java @@ -9,54 +9,41 @@ import prerna.util.Utility; /** - * Singleton utility class responsible for loading and exposing project-specific - * configuration + * Singleton utility class responsible for loading and exposing project-specific configuration * properties. Properties are sourced from the project asset file located at: * *
          * [projectId]/app_root/version/assets/java/project.properties
          * 
        * - *

        - * Invocation pattern: + *

        Invocation pattern: * *

          - *
        • Call {@link #getInstance(String)} once with a valid project identifier to - * lazily initialize - * and load the backing properties file. - *
        • Subsequent calls to {@link #getInstance()} retrieve the same initialized - * singleton - * instance. + *
        • Call {@link #getInstance(String)} once with a valid project identifier to lazily initialize + * and load the backing properties file. + *
        • Subsequent calls to {@link #getInstance()} retrieve the same initialized singleton + * instance. *
        * - *

        - * File format conforms to standard {@link Properties} loading rules: one - * property per line with - * supported separators (whitespace, '=' or ':'). Custom project keys (e.g., - * engineId) + *

        File format conforms to standard {@link Properties} loading rules: one property per line with + * supported separators (whitespace, '=' or ':'). Custom project keys (e.g., engineId) * can be defined following that pattern: * *

          * engineId=fc6a3fab-2425-4987-be93-58ad2efeee24
          * 
        * - *

        - * Error handling uses {@link ProjectException} wrapping - * {@link domain.base.ErrorCode} values to - * provide consistent structured failure semantics when initialization or file - * IO fails. + *

        Error handling uses {@link ProjectException} wrapping {@link domain.base.ErrorCode} values to + * provide consistent structured failure semantics when initialization or file IO fails. * - * @see {@link ProjectException} for structured configuration load error - * reporting. + * @see {@link ProjectException} for structured configuration load error reporting. * @see {@link #getInstance(String)} for initial lazy load of the singleton. - * @see {@link Properties#load(java.io.InputStream)} for supported file parsing - * rules. + * @see {@link Properties#load(java.io.InputStream)} for supported file parsing rules. */ public class ProjectProperties { /** - * The singleton instance of ProjectProperties. This instance is initialized - * lazily when {@link + * The singleton instance of ProjectProperties. This instance is initialized lazily when {@link * #getInstance(String)} is first called. */ private static ProjectProperties INSTANCE = null; @@ -66,24 +53,16 @@ public class ProjectProperties { /** * Private constructor to prevent direct instantiation. * - *

        - * This class follows the Singleton pattern and should be accessed exclusively - * through {@link - * #getInstance()} or the lazy-loading {@link #getInstance(String)} - * initialization variant. + *

        This class follows the Singleton pattern and should be accessed exclusively through {@link + * #getInstance()} or the lazy-loading {@link #getInstance(String)} initialization variant. */ - private ProjectProperties() { - } + private ProjectProperties() {} /** - * Returns the already-initialized singleton instance of - * {@link ProjectProperties}. + * Returns the already-initialized singleton instance of {@link ProjectProperties}. * - *

        - * This accessor requires prior initialization through - * {@link #getInstance(String)}. If the - * instance is still null, a {@link ProjectException} is thrown indicating an - * improper lifecycle + *

        This accessor requires prior initialization through {@link #getInstance(String)}. If the + * instance is still null, a {@link ProjectException} is thrown indicating an improper lifecycle * usage. * * @return The singleton {@link ProjectProperties} instance. @@ -99,19 +78,15 @@ public static ProjectProperties getInstance() { } /** - * Lazily initializes and returns the singleton instance of - * {@link ProjectProperties}. If no prior - * instance exists, this method triggers a properties file load using the - * supplied project + * Lazily initializes and returns the singleton instance of {@link ProjectProperties}. If no prior + * instance exists, this method triggers a properties file load using the supplied project * identifier. * - * @param projectId The project identifier used to locate the - * project.properties - * file. + * @param projectId The project identifier used to locate the project.properties + * file. * @return The singleton {@link ProjectProperties} instance. * @throws ProjectException If an IO error occurs during property loading. - * @see {@link #loadProp(String)} for internal file parsing and singleton - * assignment logic. + * @see {@link #loadProp(String)} for internal file parsing and singleton assignment logic. */ public static ProjectProperties getInstance(String projectId) { if (INSTANCE == null) { @@ -121,45 +96,36 @@ public static ProjectProperties getInstance(String projectId) { } /** - * Internal helper that performs the actual loading of project configuration - * data into the - * singleton instance. The method constructs the properties file path using the - * resolved assets + * Internal helper that performs the actual loading of project configuration data into the + * singleton instance. The method constructs the properties file path using the resolved assets * folder and delegates parsing to {@link Properties#load(java.io.InputStream)}. * - *

        - * Location pattern: + *

        Location pattern: * *

            * [projectId]/app_root/version/assets/java/project.properties
            * 
        * - *

        - * Lifecycle notes: + *

        Lifecycle notes: * *

          - *
        • On success, assigns the newly created instance to {@code INSTANCE}. - *
        • On failure (IO issues), resets {@code INSTANCE} to null and throws a - * {@link - * ProjectException} wrapping - * {@link domain.base.ErrorCode#INTERNAL_SERVER_ERROR}. + *
        • On success, assigns the newly created instance to {@code INSTANCE}. + *
        • On failure (IO issues), resets {@code INSTANCE} to null and throws a {@link + * ProjectException} wrapping {@link domain.base.ErrorCode#INTERNAL_SERVER_ERROR}. *
        * - * @param projectId The project identifier used to build the canonical - * properties file path. - * @throws ProjectException If an {@link IOException} occurs during file access - * or parsing. - * @see {@link AssetUtility#getProjectAssetsFolder(String)} for asset folder - * resolution logic. - * @see {@link Properties#load(java.io.InputStream)} for specification-compliant - * parsing. + * @param projectId The project identifier used to build the canonical properties file path. + * @throws ProjectException If an {@link IOException} occurs during file access or parsing. + * @see {@link AssetUtility#getProjectAssetsFolder(String)} for asset folder resolution logic. + * @see {@link Properties#load(java.io.InputStream)} for specification-compliant parsing. */ private static void loadProp(String projectId) { ProjectProperties newInstance = new ProjectProperties(); - try (final FileInputStream fileIn = new FileInputStream( - Utility.normalizePath( - AssetUtility.getProjectAssetsFolder(projectId) + "/java/project.properties"))) { + try (final FileInputStream fileIn = + new FileInputStream( + Utility.normalizePath( + AssetUtility.getProjectAssetsFolder(projectId) + "/java/project.properties"))) { Properties projectProperties = new Properties(); projectProperties.load(fileIn); From 35dec0761ceb0426b94918c5fbc4fe0a9c2dd7fd Mon Sep 17 00:00:00 2001 From: Van Buren Date: Fri, 17 Oct 2025 16:02:30 -0400 Subject: [PATCH 22/28] feat: vscode --- .gitignore | 1 - .vscode/settings.json | 13 +++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index 8df9422..8ee6ae4 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,6 @@ target/ java/project.properties .admin/ .DS_Store -.vscode/ # cache py/__pycache__/ diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e618422 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,13 @@ +{ + "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": {} + } +} From fe53c993ad5e466fbf9bd0067edbf6bae84f183f Mon Sep 17 00:00:00 2001 From: rithvik-doshi <81876806+rithvik-doshi@users.noreply.github.com> Date: Wed, 22 Oct 2025 10:14:41 -0400 Subject: [PATCH 23/28] Update .pre-commit-config.yaml --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cf91c35..4bbdd52 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -52,7 +52,7 @@ repos: "--disable-error-code=name-defined", "--disable-error-code=attr-defined" ] - additional_dependencies: [ + additional_dependencies: [ # Continue to add dependencies here that have mypy extensions, such as pydantic "types-requests", "types-toml", "pandas-stubs", @@ -62,4 +62,4 @@ repos: rev: v0.2.8 hooks: - id: xml-formatter - files: '^.*\.xml$' \ No newline at end of file + files: '^.*\.xml$' From 436bdadc165ce2b26dd8b9a9387f51890f1201f9 Mon Sep 17 00:00:00 2001 From: Rithvik Doshi Date: Wed, 22 Oct 2025 16:48:01 -0400 Subject: [PATCH 24/28] ci: frontend lint --- .github/workflows/pre-commit.yml | 19 +++++++++++++++++++ .gitignore | 4 +++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 3fa6b94..a75fcb9 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -9,6 +9,25 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '24' + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 10 + + - name: Install dependencies and run frontend pre-commit hooks + run: | + if [ -d "client" ]; then + pnpm install + pnpm exec lint-staged + else + echo "No client directory found, skipping frontend pre-commit hooks" + fi - name: Set up Python uses: actions/setup-python@v4 diff --git a/.gitignore b/.gitignore index 8ee6ae4..612b62f 100644 --- a/.gitignore +++ b/.gitignore @@ -12,9 +12,11 @@ target/ java/project.properties .admin/ .DS_Store +**/.env +!client/.env # cache py/__pycache__/ .classpath .project -.settings/ +.settings/ \ No newline at end of file From d47c9b4c1ae676141007166eafaaa6f0aa177571 Mon Sep 17 00:00:00 2001 From: Rithvik Doshi Date: Wed, 22 Oct 2025 16:51:05 -0400 Subject: [PATCH 25/28] ci: run instead of lint-staged --- .github/workflows/pre-commit.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index a75fcb9..2c1f758 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -20,13 +20,13 @@ jobs: with: version: 10 - - name: Install dependencies and run frontend pre-commit hooks + - name: Install dependencies and run frontend linting run: | if [ -d "client" ]; then pnpm install - pnpm exec lint-staged + pnpm run lint else - echo "No client directory found, skipping frontend pre-commit hooks" + echo "No client directory found, skipping frontend linting" fi - name: Set up Python From f389926a91f2d12def3b6ceb8f67eaaf585c916f Mon Sep 17 00:00:00 2001 From: Rithvik Doshi Date: Wed, 22 Oct 2025 16:55:49 -0400 Subject: [PATCH 26/28] ci: biome --- .github/workflows/pre-commit.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 2c1f758..e87e13e 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -24,7 +24,8 @@ jobs: run: | if [ -d "client" ]; then pnpm install - pnpm run lint + pnpm exec biome lint . + pnpm exec biome format --check . else echo "No client directory found, skipping frontend linting" fi From 1a6c4158e4b533e4dda33d7806891d1665a351b7 Mon Sep 17 00:00:00 2001 From: Rithvik Doshi Date: Wed, 22 Oct 2025 16:56:56 -0400 Subject: [PATCH 27/28] ci: biome check --- .github/workflows/pre-commit.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index e87e13e..4c5a828 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -24,8 +24,7 @@ jobs: run: | if [ -d "client" ]; then pnpm install - pnpm exec biome lint . - pnpm exec biome format --check . + pnpm exec biome check . else echo "No client directory found, skipping frontend linting" fi From f6b1501a4c88e85eabdae6d6f6e94f9d9a91d5b6 Mon Sep 17 00:00:00 2001 From: Rithvik Doshi Date: Thu, 23 Oct 2025 09:36:23 -0400 Subject: [PATCH 28/28] ci: this should hopefully work plssss --- .github/workflows/pre-commit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 4c5a828..6aa649f 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -24,7 +24,7 @@ jobs: run: | if [ -d "client" ]; then pnpm install - pnpm exec biome check . + pnpm exec biome format --write && pnpm exec biome lint else echo "No client directory found, skipping frontend linting" fi