Api Fetcher bot Task Installation Process Implemented and tested

This commit is contained in:
Luis Fernando Molina committed 2021-05-13 15:02:05 +02:00
1 parent cd72460f46
commit 32a898d7c7
8 files changed
+58 -29

No files matched your search

@@ -50,7 +50,7 @@ function newEthereumBlockchainSpace() {
try {
if (UI.projects.superalgos.spaces.designSpace.workspace === undefined) { return }
let blockchain = UI.projects.superalgos.spaces.designSpace.workspace.getHierarchyHeadsByType('Ethereum Blockchain')
let blockchain = UI.projects.superalgos.spaces.designSpace.workspace.getHierarchyHeadByNodeType('Ethereum Blockchain')
if (blockchain === undefined) { return }
for (let i = 0; i < blockchain.blockchainNetworks.length; i++) {
let blockchainNetwork = blockchain.blockchainNetworks[i]
@@ -1 +1 @@
{"type":"Workspace","name":"API Fetcher Demo","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"ecc383c5-3e31-4f80-b2c5-1c966b9d77f4","savedPayload":{"position":{"x":23544.138017922,"y":29821.660447464918},"targetPosition":{"x":23756.270052277963,"y":29609.528413108954},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"624f61cb-a76a-4059-b46d-c81975d88a9b","savedPayload":{"position":{"x":23756.270052277963,"y":29609.528413108954},"targetPosition":{"x":24047.813522775024,"y":29538.800732456126},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"94b155fe-1012-4c24-9830-2e4adfe4a614","savedPayload":{"position":{"x":24047.813522775024,"y":29538.800732456126},"targetPosition":{"x":24339.356993272086,"y":29468.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},{"type":"Task","name":"Webhooks","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Webhooks","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Webhooks Check-Webhook","project":"Superalgos","id":"cea8f612-7533-4bc8-9df9-2e14f2c6eabd","savedPayload":{"position":{"x":23527.90455540632,"y":29651.655936665014},"targetPosition":{"x":23740.036589762283,"y":29439.52390230905},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Check-Webhook","id":"69f37820-ab16-4e19-bfd8-386dd6e249a3"}}}],"id":"124d68e8-969b-4426-b736-d8a3f9fd730f","savedPayload":{"position":{"x":23740.036589762283,"y":29439.52390230905},"targetPosition":{"x":24039.696791517184,"y":29453.798477056174},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"77f3b15e-546d-4259-82bd-96a56781dd69","savedPayload":{"position":{"x":24039.696791517184,"y":29453.798477056174},"targetPosition":{"x":24339.356993272086,"y":29468.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"abfaac8d-2eb6-452d-872f-2146e394d6a4","savedPayload":{"position":{"x":23560.224467687323,"y":29483.96430816881},"targetPosition":{"x":23772.356502043287,"y":29271.832273812845},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"f5f4dfd5-4d14-49fa-8cb3-8989f157d5cb","savedPayload":{"position":{"x":23472.356502043287,"y":29271.832273812845},"targetPosition":{"x":23772.356502043287,"y":29271.832273812845},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Line truncated
{"type":"Workspace","name":"API Fetcher Demo","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"407b3902-312f-4074-a7b2-f4e9ce72db07","savedPayload":{"position":{"x":25257.356993272086,"y":30595.11115747996},"targetPosition":{"x":25233.356993272086,"y":30679.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"4b5fb696-c41e-4cf0-92e2-e5a64a3871e4","savedPayload":{"position":{"x":25233.356993272086,"y":30679.11115747996},"targetPosition":{"x":25311.356993272086,"y":30585.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"a5933e2f-5aa8-45dd-8f13-e50a42b795b2","savedPayload":{"position":{"x":25311.356993272086,"y":30585.11115747996},"targetPosition":{"x":25217.356993272086,"y":30681.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Webhooks","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Webhooks","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Webhooks Check-Webhook","project":"Superalgos","id":"c5bc3847-e5b9-4345-92a7-319b3248a40e","savedPayload":{"position":{"x":25139.356993272086,"y":30657.11115747996},"targetPosition":{"x":25226.356993272086,"y":30745.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Check-Webhook","id":"69f37820-ab16-4e19-bfd8-386dd6e249a3"}}}],"id":"64cef381-ea35-4f33-bb53-8e06ea009225","savedPayload":{"position":{"x":25226.356993272086,"y":30745.11115747996},"targetPosition":{"x":25188.356993272086,"y":30686.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"d3837a8f-361a-4a28-9691-e0afac2fb8f0","savedPayload":{"position":{"x":25188.356993272086,"y":30686.11115747996},"targetPosition":{"x":25217.356993272086,"y":30681.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"1e1ea090-43a5-457e-ac5a-d8c23e242b03","savedPayload":{"position":{"x":25045.356993272086,"y":30709.11115747996},"targetPosition":{"x":25134.356993272086,"y":30790.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"3bb72ff9-6ce3-42ac-86c5-33f6a3e980c3","savedPayload":{"position":{"x":25046.356993272086,"y":30835.11115747996},"targetPosition":{"x":25134.356993272086,"y":30790.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0}Line truncated
@@ -44,7 +44,7 @@
},
{
"style": "List",
"text": "getHierarchyHeadsByType",
"text": "getHierarchyHeadByNodeType",
"updated": 1614931380751
},
{
@@ -136,9 +136,9 @@ function newSuperalgosFunctionLibraryTaskFunctions() {
'Data Dependency Folder->Data Dependency Folder->Data Dependency Folder->Data Dependency Folder->Data Dependency Folder->' +
'Data Dependency->Dataset Definition->Product Definition->' +
'Record Definition->Record Property->Record Formula->' +
'API Response Field Reference->' +
'API Response Field Reference->' +
'API Response Field->API Response Field->API Response Field->API Response Field->API Response Field->API Response Field->API Response Field->API Response Field->API Response Field->' +
'API Response Schema->API Query Response->API Query Responses->API Endpoint->' +
'API Response Schema->API Query Response->API Query Responses->API Endpoint->' +
'Data Building Procedure->' +
'Procedure Initialization->Procedure Javascript Code->' +
'Procedure Loop->Procedure Javascript Code->' +
@@ -154,9 +154,9 @@ function newSuperalgosFunctionLibraryTaskFunctions() {
'Trading Bot->' +
'Learning Bot->' +
'Product Definition Folder->Product Definition Folder->Product Definition Folder->Product Definition Folder->Product Definition Folder->' +
'Data Mine->Trading Mine->Learning Mine->'+
'API Map Reference->' +
'API Map->API Version->API Endpoint->API Query Parameters->API Query Parameter->API Query Responses->API Query Response->API Response Schema->' +
'Data Mine->Trading Mine->Learning Mine->' +
'API Map Reference->' +
'API Map->API Version->API Endpoint->API Query Parameters->API Query Parameter->API Query Responses->API Query Response->API Response Schema->' +
'API Response Field->API Response Field->API Response Field->API Response Field->API Response Field->API Response Field->API Response Field->API Response Field->API Response Field->'
let taskDefinition = UI.projects.superalgos.functionLibraries.protocolNode.getProtocolNode(node, false, true, true, false, false, taskLightingPath)
@@ -167,7 +167,7 @@ function newSuperalgosFunctionLibraryTaskFunctions() {
'Project Data Products->Project Trading Products->Project Learning Products->' +
'Exchange Data Products->Exchange Trading Products->Exchange Learning Products->' +
'Market Data Products->Market Trading Products->Market Learning Products->' +
'Market->Market Base Asset->Market Quoted Asset->Asset->' +
'Market->Market Base Asset->Market Quoted Asset->Asset->' +
'Exchange Markets->Crypto Exchange->' +
'Data Mine Products->Bot Products->' +
'Data Product Folder->Data Product Folder->Data Product Folder->Data Product Folder->Data Product Folder->' +
@@ -181,7 +181,7 @@ function newSuperalgosFunctionLibraryTaskFunctions() {
'Indicator Bot Instance->Sensor Bot Instance->API Data Fetcher Bot Instance->Trading Bot Instance->Learning Bot Instance->' +
'Indicator Process Instance->Sensor Process Instance->API Data Fetcher Process Instance->Trading Process Instance->Learning Process Instance->' +
'Paper Trading Session->Forward Testing Session->Backtesting Session->Live Trading Session->Back Learning Session->Live Learning Session->' +
'API Map Reference->' +
'API Map Reference->' +
'Market->' +
'Process Definition->'
@@ -196,7 +196,7 @@ function newSuperalgosFunctionLibraryTaskFunctions() {
let project = {
name: projectDefinition.name,
schema: SCHEMAS_BY_PROJECT.get(projectDefinition.name).array.appSchema
}
}
projectSchemas.push(project)
}
let event = {
@@ -804,13 +804,13 @@ function newSuperalgosFunctionLibraryTaskFunctions() {
break
}
case 'Learning Bot': {
let task
let task
/*
For Learning Bots we will add two Tasks, each one with a different
Session Type.
*/
task = addTask(taskManager)
task.name = 'Back ' + task.name
task.name = 'Back ' + task.name
botInstance = UI.projects.superalgos.functionLibraries.uiObjectsFromNodes.addUIObject(task, 'Learning Bot Instance')
botInstance.name = 'Back ' + bot.name
@@ -818,7 +818,7 @@ function newSuperalgosFunctionLibraryTaskFunctions() {
addProcessInstance(task, bot, botInstance, 'Back Learning Session')
task = addTask(taskManager)
task.name = 'Live ' + task.name
task.name = 'Live ' + task.name
botInstance = UI.projects.superalgos.functionLibraries.uiObjectsFromNodes.addUIObject(task, 'Learning Bot Instance')
botInstance.name = 'Live ' + bot.name
@@ -828,7 +828,7 @@ function newSuperalgosFunctionLibraryTaskFunctions() {
}
}
function addTask(taskManager){
function addTask(taskManager) {
let task = UI.projects.superalgos.functionLibraries.uiObjectsFromNodes.addUIObject(taskManager, 'Task')
if (systemNode !== undefined) {
@@ -852,6 +852,21 @@ function newSuperalgosFunctionLibraryTaskFunctions() {
case 'API Data Fetcher Bot': {
processInstance = UI.projects.superalgos.functionLibraries.uiObjectsFromNodes.addUIObject(botInstance, 'API Data Fetcher Process Instance')
processInstance.payload.referenceParent = process
/*
We will locate and reference the API MAP that has the same codeName than the data mine.
*/
let apiMaps = UI.projects.superalgos.spaces.designSpace.workspace.getHierarchyHeadsByNodeType('API Map')
for (let i = 0; i < apiMaps.length; i++) {
let apiMap = apiMaps[i]
let apiMapCodeName = UI.projects.superalgos.utilities.nodeConfig.loadPropertyFromNodeConfig(apiMap.payload, 'codeName')
let mineCodeName = UI.projects.superalgos.utilities.nodeConfig.loadPropertyFromNodeConfig(mine.payload, 'codeName')
if (apiMapCodeName === mineCodeName) {
processInstance.apiMapReference.payload.referenceParent = apiMap
break
}
}
break
}
case 'Indicator Bot': {
@@ -862,17 +877,17 @@ function newSuperalgosFunctionLibraryTaskFunctions() {
case 'Trading Bot': {
processInstance = UI.projects.superalgos.functionLibraries.uiObjectsFromNodes.addUIObject(botInstance, 'Trading Process Instance')
processInstance.payload.referenceParent = process
if (node.payload.parentNode === undefined) { return }
if (node.payload.parentNode.payload === undefined) { return }
if (node.payload.parentNode.payload.parentNode === undefined) { return }
if (node.payload.parentNode.payload.parentNode.payload === undefined) { return }
if (node.payload.parentNode.payload.parentNode.payload.parentNode === undefined) { return }
if (node.payload.parentNode.payload.parentNode.payload.parentNode.payload.parentNode === undefined) { return }
let environment = node.payload.parentNode.payload.parentNode.payload.parentNode.payload.parentNode
let session
switch (environment.type) {
case 'Testing Trading Tasks': {
addSession('Backtesting Session')
@@ -884,14 +899,14 @@ function newSuperalgosFunctionLibraryTaskFunctions() {
}
}
break
function addSession(sessionType) {
session = UI.projects.superalgos.functionLibraries.uiObjectsFromNodes.addUIObject(processInstance, sessionType)
session.name = task.name
let config = JSON.parse(session.config)
config.folderName = session.name.split(" ").join("-")
session.config = JSON.stringify(config)
for (let m = 0; m < rootNodes.length; m++) {
let rootNode = rootNodes[m]
if (rootNode.type === 'Trading Engine' && rootNode.isPlugin === true) {
@@ -905,18 +920,18 @@ function newSuperalgosFunctionLibraryTaskFunctions() {
case 'Learning Bot': {
processInstance = UI.projects.superalgos.functionLibraries.uiObjectsFromNodes.addUIObject(botInstance, 'Learning Process Instance')
processInstance.payload.referenceParent = process
let session
addSession(sessionType)
break
function addSession(sessionType) {
session = UI.projects.superalgos.functionLibraries.uiObjectsFromNodes.addUIObject(processInstance, sessionType)
session.name = task.name
let config = JSON.parse(session.config)
config.folderName = session.name.split(" ").join("-")
session.config = JSON.stringify(config)
for (let m = 0; m < rootNodes.length; m++) {
let rootNode = rootNodes[m]
if (rootNode.type === 'Learning Engine' && rootNode.isPlugin === true) {
@@ -19,7 +19,8 @@ function newWorkspace() {
getProjectsHeads: getProjectsHeads,
getHierarchyHeads: getHierarchyHeads,
getHierarchyHeadsById: getHierarchyHeadsById,
getHierarchyHeadsByType: getHierarchyHeadsByType,
getHierarchyHeadByNodeType: getHierarchyHeadByNodeType,
getHierarchyHeadsByNodeType: getHierarchyHeadsByNodeType,
getNodeThatIsOnFocus: getNodeThatIsOnFocus,
getNodeByShortcutKey: getNodeByShortcutKey,
getNodeById: getNodeById,
@@ -512,7 +513,7 @@ function newWorkspace() {
}
}
function getHierarchyHeadsByType(nodeType) {
function getHierarchyHeadByNodeType(nodeType) {
let hierarchyHeads = getHierarchyHeads()
if (hierarchyHeads === undefined) { return }
for (let i = 0; i < hierarchyHeads.length; i++) {
@@ -523,6 +524,19 @@ function newWorkspace() {
}
}
function getHierarchyHeadsByNodeType(nodeType) {
let hierarchyHeads = getHierarchyHeads()
let resultArray = []
if (hierarchyHeads === undefined) { return }
for (let i = 0; i < hierarchyHeads.length; i++) {
let hierarchyHead = hierarchyHeads[i]
if (hierarchyHead.type === nodeType) {
resultArray.push(hierarchyHead)
}
}
return resultArray
}
function replaceWorkspaceByLoadingOne(project, name) {
let webCommand
@@ -42,7 +42,7 @@ function newSuperalgosDocsCommmandInterface() {
}
/* Find the Username and Password */
let apisNode = UI.projects.superalgos.spaces.designSpace.workspace.getHierarchyHeadsByType('APIs')
let apisNode = UI.projects.superalgos.spaces.designSpace.workspace.getHierarchyHeadByNodeType('APIs')
if (apisNode === undefined) {
UI.projects.superalgos.spaces.docsSpace.navigateTo('Superalgos', 'Topic', 'App Error - Github Credentials Missing', 'Anchor Github Credentials Missing')
return
@@ -21,7 +21,7 @@ function newSuperalgosDocsSearchEngine() {
/*
This is a way to avoid indexing the docs, if the user does not want to.
*/
let docsSpaceNode = UI.projects.superalgos.spaces.designSpace.workspace.getHierarchyHeadsByType('Docs Space')
let docsSpaceNode = UI.projects.superalgos.spaces.designSpace.workspace.getHierarchyHeadByNodeType('Docs Space')
if (docsSpaceNode !== undefined) {
if (docsSpaceNode.spaceSettings !== undefined) {
let indexContent = UI.projects.superalgos.utilities.nodeConfig.loadPropertyFromNodeConfig(docsSpaceNode.spaceSettings.payload, 'indexContent')
@@ -444,7 +444,7 @@ function newSuperalgosFloatingSpace() {
function syncStylePhysics() {
if (UI.projects.superalgos.spaces.designSpace === undefined) { return }
if (UI.projects.superalgos.spaces.designSpace.workspace === undefined) { return }
let designSpaceNode = UI.projects.superalgos.spaces.designSpace.workspace.getHierarchyHeadsByType('Design Space')
let designSpaceNode = UI.projects.superalgos.spaces.designSpace.workspace.getHierarchyHeadByNodeType('Design Space')
if (designSpaceNode === undefined) { return }
if (designSpaceNode.spaceStyle === undefined) { return }
let configStyle
@@ -496,7 +496,7 @@ function newSuperalgosFloatingSpace() {
function syncSettingsPhysics() {
if (UI.projects.superalgos.spaces.designSpace === undefined) { return }
if (UI.projects.superalgos.spaces.designSpace.workspace === undefined) { return }
let designSpaceNode = UI.projects.superalgos.spaces.designSpace.workspace.getHierarchyHeadsByType('Design Space')
let designSpaceNode = UI.projects.superalgos.spaces.designSpace.workspace.getHierarchyHeadByNodeType('Design Space')
if (designSpaceNode === undefined) { return }
if (designSpaceNode.spaceSettings === undefined) { return }
let configSettings