@smythos/sre 1.5.46 → 1.5.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG +98 -90
- package/LICENSE +18 -18
- package/README.md +135 -135
- package/dist/bundle-analysis-lazy.html +4949 -0
- package/dist/bundle-analysis.html +4949 -0
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/types/Components/MCPClient.class.d.ts +1 -0
- package/dist/types/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.d.ts +1 -6
- package/dist/types/utils/package-manager.utils.d.ts +26 -0
- package/package.json +1 -1
- package/src/Components/APICall/APICall.class.ts +156 -156
- package/src/Components/APICall/AccessTokenManager.ts +130 -130
- package/src/Components/APICall/ArrayBufferResponse.helper.ts +58 -58
- package/src/Components/APICall/OAuth.helper.ts +294 -294
- package/src/Components/APICall/mimeTypeCategories.ts +46 -46
- package/src/Components/APICall/parseData.ts +167 -167
- package/src/Components/APICall/parseHeaders.ts +41 -41
- package/src/Components/APICall/parseProxy.ts +68 -68
- package/src/Components/APICall/parseUrl.ts +91 -91
- package/src/Components/APIEndpoint.class.ts +234 -234
- package/src/Components/APIOutput.class.ts +58 -58
- package/src/Components/AgentPlugin.class.ts +102 -102
- package/src/Components/Async.class.ts +155 -155
- package/src/Components/Await.class.ts +90 -90
- package/src/Components/Classifier.class.ts +158 -158
- package/src/Components/Component.class.ts +132 -132
- package/src/Components/ComponentHost.class.ts +38 -38
- package/src/Components/DataSourceCleaner.class.ts +92 -92
- package/src/Components/DataSourceIndexer.class.ts +181 -181
- package/src/Components/DataSourceLookup.class.ts +161 -161
- package/src/Components/ECMASandbox.class.ts +71 -71
- package/src/Components/FEncDec.class.ts +29 -29
- package/src/Components/FHash.class.ts +33 -33
- package/src/Components/FSign.class.ts +80 -80
- package/src/Components/FSleep.class.ts +25 -25
- package/src/Components/FTimestamp.class.ts +25 -25
- package/src/Components/FileStore.class.ts +78 -78
- package/src/Components/ForEach.class.ts +97 -97
- package/src/Components/GPTPlugin.class.ts +70 -70
- package/src/Components/GenAILLM.class.ts +586 -586
- package/src/Components/HuggingFace.class.ts +314 -314
- package/src/Components/Image/imageSettings.config.ts +70 -70
- package/src/Components/ImageGenerator.class.ts +502 -502
- package/src/Components/JSONFilter.class.ts +54 -54
- package/src/Components/LLMAssistant.class.ts +213 -213
- package/src/Components/LogicAND.class.ts +28 -28
- package/src/Components/LogicAtLeast.class.ts +85 -85
- package/src/Components/LogicAtMost.class.ts +86 -86
- package/src/Components/LogicOR.class.ts +29 -29
- package/src/Components/LogicXOR.class.ts +34 -34
- package/src/Components/MCPClient.class.ts +138 -112
- package/src/Components/MemoryDeleteKeyVal.class.ts +70 -70
- package/src/Components/MemoryReadKeyVal.class.ts +66 -66
- package/src/Components/MemoryWriteKeyVal.class.ts +62 -62
- package/src/Components/MemoryWriteObject.class.ts +97 -97
- package/src/Components/MultimodalLLM.class.ts +128 -128
- package/src/Components/OpenAPI.class.ts +72 -72
- package/src/Components/PromptGenerator.class.ts +122 -122
- package/src/Components/ScrapflyWebScrape.class.ts +159 -159
- package/src/Components/ServerlessCode.class.ts +123 -123
- package/src/Components/TavilyWebSearch.class.ts +98 -98
- package/src/Components/VisionLLM.class.ts +104 -104
- package/src/Components/ZapierAction.class.ts +127 -127
- package/src/Components/index.ts +97 -97
- package/src/Core/AgentProcess.helper.ts +240 -240
- package/src/Core/Connector.class.ts +123 -123
- package/src/Core/ConnectorsService.ts +197 -197
- package/src/Core/DummyConnector.ts +49 -49
- package/src/Core/HookService.ts +105 -105
- package/src/Core/SmythRuntime.class.ts +235 -235
- package/src/Core/SystemEvents.ts +16 -16
- package/src/Core/boot.ts +56 -56
- package/src/config.ts +15 -15
- package/src/constants.ts +126 -126
- package/src/data/hugging-face.params.json +579 -579
- package/src/helpers/AWSLambdaCode.helper.ts +587 -587
- package/src/helpers/BinaryInput.helper.ts +331 -331
- package/src/helpers/Conversation.helper.ts +1119 -1119
- package/src/helpers/ECMASandbox.helper.ts +54 -54
- package/src/helpers/JsonContent.helper.ts +97 -97
- package/src/helpers/LocalCache.helper.ts +97 -97
- package/src/helpers/Log.helper.ts +274 -274
- package/src/helpers/OpenApiParser.helper.ts +150 -150
- package/src/helpers/S3Cache.helper.ts +147 -147
- package/src/helpers/SmythURI.helper.ts +5 -5
- package/src/helpers/Sysconfig.helper.ts +77 -77
- package/src/helpers/TemplateString.helper.ts +243 -243
- package/src/helpers/TypeChecker.helper.ts +329 -329
- package/src/index.ts +3 -3
- package/src/index.ts.bak +3 -3
- package/src/subsystems/AgentManager/Agent.class.ts +1114 -1114
- package/src/subsystems/AgentManager/Agent.helper.ts +3 -3
- package/src/subsystems/AgentManager/AgentData.service/AgentDataConnector.ts +230 -230
- package/src/subsystems/AgentManager/AgentData.service/connectors/CLIAgentDataConnector.class.ts +66 -66
- package/src/subsystems/AgentManager/AgentData.service/connectors/LocalAgentDataConnector.class.ts +142 -142
- package/src/subsystems/AgentManager/AgentData.service/connectors/NullAgentData.class.ts +39 -39
- package/src/subsystems/AgentManager/AgentData.service/index.ts +18 -18
- package/src/subsystems/AgentManager/AgentLogger.class.ts +297 -297
- package/src/subsystems/AgentManager/AgentRequest.class.ts +51 -51
- package/src/subsystems/AgentManager/AgentRuntime.class.ts +559 -559
- package/src/subsystems/AgentManager/AgentSSE.class.ts +101 -101
- package/src/subsystems/AgentManager/AgentSettings.class.ts +52 -52
- package/src/subsystems/AgentManager/Component.service/ComponentConnector.ts +32 -32
- package/src/subsystems/AgentManager/Component.service/connectors/LocalComponentConnector.class.ts +60 -60
- package/src/subsystems/AgentManager/Component.service/index.ts +11 -11
- package/src/subsystems/AgentManager/EmbodimentSettings.class.ts +47 -47
- package/src/subsystems/AgentManager/ForkedAgent.class.ts +154 -154
- package/src/subsystems/AgentManager/OSResourceMonitor.ts +77 -77
- package/src/subsystems/ComputeManager/Code.service/CodeConnector.ts +98 -98
- package/src/subsystems/ComputeManager/Code.service/connectors/AWSLambdaCode.class.ts +172 -172
- package/src/subsystems/ComputeManager/Code.service/connectors/ECMASandbox.class.ts +131 -131
- package/src/subsystems/ComputeManager/Code.service/index.ts +13 -13
- package/src/subsystems/IO/CLI.service/CLIConnector.ts +47 -47
- package/src/subsystems/IO/CLI.service/index.ts +9 -9
- package/src/subsystems/IO/Log.service/LogConnector.ts +32 -32
- package/src/subsystems/IO/Log.service/connectors/ConsoleLog.class.ts +28 -28
- package/src/subsystems/IO/Log.service/index.ts +13 -13
- package/src/subsystems/IO/NKV.service/NKVConnector.ts +43 -43
- package/src/subsystems/IO/NKV.service/connectors/NKVLocalStorage.class.ts +234 -234
- package/src/subsystems/IO/NKV.service/connectors/NKVRAM.class.ts +204 -204
- package/src/subsystems/IO/NKV.service/connectors/NKVRedis.class.ts +182 -182
- package/src/subsystems/IO/NKV.service/index.ts +14 -14
- package/src/subsystems/IO/Router.service/RouterConnector.ts +21 -21
- package/src/subsystems/IO/Router.service/connectors/ExpressRouter.class.ts +48 -48
- package/src/subsystems/IO/Router.service/connectors/NullRouter.class.ts +40 -40
- package/src/subsystems/IO/Router.service/index.ts +11 -11
- package/src/subsystems/IO/Storage.service/SmythFS.class.ts +489 -489
- package/src/subsystems/IO/Storage.service/StorageConnector.ts +66 -66
- package/src/subsystems/IO/Storage.service/connectors/LocalStorage.class.ts +327 -327
- package/src/subsystems/IO/Storage.service/connectors/S3Storage.class.ts +482 -482
- package/src/subsystems/IO/Storage.service/index.ts +13 -13
- package/src/subsystems/IO/VectorDB.service/VectorDBConnector.ts +108 -108
- package/src/subsystems/IO/VectorDB.service/connectors/MilvusVectorDB.class.ts +454 -454
- package/src/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.ts +384 -384
- package/src/subsystems/IO/VectorDB.service/connectors/RAMVecrtorDB.class.ts +421 -421
- package/src/subsystems/IO/VectorDB.service/embed/BaseEmbedding.ts +107 -107
- package/src/subsystems/IO/VectorDB.service/embed/OpenAIEmbedding.ts +109 -109
- package/src/subsystems/IO/VectorDB.service/embed/index.ts +21 -21
- package/src/subsystems/IO/VectorDB.service/index.ts +14 -14
- package/src/subsystems/LLMManager/LLM.helper.ts +251 -251
- package/src/subsystems/LLMManager/LLM.inference.ts +339 -339
- package/src/subsystems/LLMManager/LLM.service/LLMConnector.ts +489 -489
- package/src/subsystems/LLMManager/LLM.service/LLMCredentials.helper.ts +171 -171
- package/src/subsystems/LLMManager/LLM.service/connectors/Anthropic.class.ts +659 -659
- package/src/subsystems/LLMManager/LLM.service/connectors/Bedrock.class.ts +400 -400
- package/src/subsystems/LLMManager/LLM.service/connectors/Echo.class.ts +77 -77
- package/src/subsystems/LLMManager/LLM.service/connectors/GoogleAI.class.ts +757 -757
- package/src/subsystems/LLMManager/LLM.service/connectors/Groq.class.ts +304 -304
- package/src/subsystems/LLMManager/LLM.service/connectors/Perplexity.class.ts +250 -250
- package/src/subsystems/LLMManager/LLM.service/connectors/VertexAI.class.ts +423 -423
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.ts +488 -488
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ChatCompletionsApiInterface.ts +524 -524
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterface.ts +100 -100
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterfaceFactory.ts +81 -81
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ResponsesApiInterface.ts +1145 -1145
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/constants.ts +13 -13
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/index.ts +4 -4
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/utils.ts +11 -11
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/types.ts +32 -32
- package/src/subsystems/LLMManager/LLM.service/connectors/xAI.class.ts +471 -471
- package/src/subsystems/LLMManager/LLM.service/index.ts +44 -44
- package/src/subsystems/LLMManager/ModelsProvider.service/ModelsProviderConnector.ts +300 -300
- package/src/subsystems/LLMManager/ModelsProvider.service/connectors/JSONModelsProvider.class.ts +252 -252
- package/src/subsystems/LLMManager/ModelsProvider.service/index.ts +11 -11
- package/src/subsystems/LLMManager/custom-models.ts +854 -854
- package/src/subsystems/LLMManager/models.ts +2540 -2540
- package/src/subsystems/LLMManager/paramMappings.ts +69 -69
- package/src/subsystems/MemoryManager/Cache.service/CacheConnector.ts +86 -86
- package/src/subsystems/MemoryManager/Cache.service/connectors/LocalStorageCache.class.ts +297 -297
- package/src/subsystems/MemoryManager/Cache.service/connectors/RAMCache.class.ts +201 -201
- package/src/subsystems/MemoryManager/Cache.service/connectors/RedisCache.class.ts +252 -252
- package/src/subsystems/MemoryManager/Cache.service/connectors/S3Cache.class.ts +373 -373
- package/src/subsystems/MemoryManager/Cache.service/index.ts +15 -15
- package/src/subsystems/MemoryManager/LLMCache.ts +72 -72
- package/src/subsystems/MemoryManager/LLMContext.ts +124 -124
- package/src/subsystems/MemoryManager/LLMMemory.service/LLMMemoryConnector.ts +26 -26
- package/src/subsystems/MemoryManager/RuntimeContext.ts +266 -266
- package/src/subsystems/Security/AccessControl/ACL.class.ts +208 -208
- package/src/subsystems/Security/AccessControl/AccessCandidate.class.ts +82 -82
- package/src/subsystems/Security/AccessControl/AccessRequest.class.ts +52 -52
- package/src/subsystems/Security/Account.service/AccountConnector.ts +44 -44
- package/src/subsystems/Security/Account.service/connectors/AWSAccount.class.ts +76 -76
- package/src/subsystems/Security/Account.service/connectors/DummyAccount.class.ts +130 -130
- package/src/subsystems/Security/Account.service/connectors/JSONFileAccount.class.ts +159 -159
- package/src/subsystems/Security/Account.service/index.ts +14 -14
- package/src/subsystems/Security/Credentials.helper.ts +62 -62
- package/src/subsystems/Security/ManagedVault.service/ManagedVaultConnector.ts +38 -38
- package/src/subsystems/Security/ManagedVault.service/connectors/NullManagedVault.class.ts +53 -53
- package/src/subsystems/Security/ManagedVault.service/connectors/SecretManagerManagedVault.ts +154 -154
- package/src/subsystems/Security/ManagedVault.service/index.ts +12 -12
- package/src/subsystems/Security/SecureConnector.class.ts +110 -110
- package/src/subsystems/Security/Vault.service/Vault.helper.ts +30 -30
- package/src/subsystems/Security/Vault.service/VaultConnector.ts +29 -29
- package/src/subsystems/Security/Vault.service/connectors/HashicorpVault.class.ts +46 -46
- package/src/subsystems/Security/Vault.service/connectors/JSONFileVault.class.ts +221 -221
- package/src/subsystems/Security/Vault.service/connectors/NullVault.class.ts +54 -54
- package/src/subsystems/Security/Vault.service/connectors/SecretsManager.class.ts +140 -140
- package/src/subsystems/Security/Vault.service/index.ts +12 -12
- package/src/types/ACL.types.ts +104 -104
- package/src/types/AWS.types.ts +10 -10
- package/src/types/Agent.types.ts +61 -61
- package/src/types/AgentLogger.types.ts +17 -17
- package/src/types/Cache.types.ts +1 -1
- package/src/types/Common.types.ts +2 -2
- package/src/types/LLM.types.ts +496 -496
- package/src/types/Redis.types.ts +8 -8
- package/src/types/SRE.types.ts +64 -64
- package/src/types/Security.types.ts +14 -14
- package/src/types/Storage.types.ts +5 -5
- package/src/types/VectorDB.types.ts +86 -86
- package/src/utils/base64.utils.ts +275 -275
- package/src/utils/cli.utils.ts +68 -68
- package/src/utils/data.utils.ts +322 -322
- package/src/utils/date-time.utils.ts +22 -22
- package/src/utils/general.utils.ts +238 -238
- package/src/utils/index.ts +12 -12
- package/src/utils/lazy-client.ts +261 -261
- package/src/utils/numbers.utils.ts +13 -13
- package/src/utils/oauth.utils.ts +35 -35
- package/src/utils/string.utils.ts +414 -414
- package/src/utils/url.utils.ts +19 -19
- package/src/utils/validation.utils.ts +74 -74
- package/dist/types/subsystems/LLMManager/ModelsProvider.service/connectors/SmythModelsProvider.class.d.ts +0 -39
|
@@ -1,98 +1,98 @@
|
|
|
1
|
-
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
2
|
-
import { AccessRequest } from '@sre/Security/AccessControl/AccessRequest.class';
|
|
3
|
-
import { ACL } from '@sre/Security/AccessControl/ACL.class';
|
|
4
|
-
import { IAccessCandidate, IACL } from '@sre/types/ACL.types';
|
|
5
|
-
import { SecureConnector } from '@sre/Security/SecureConnector.class';
|
|
6
|
-
|
|
7
|
-
export interface CodeInput {
|
|
8
|
-
code: string; // Main code to execute
|
|
9
|
-
dependencies?: string; // Dependencies/imports/packages
|
|
10
|
-
files?: Record<string, string>; // Additional files (filename -> content)
|
|
11
|
-
inputs?: Record<string, any>; // Runtime input parameters
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface CodeConfig {
|
|
15
|
-
runtime: string; // 'nodejs', 'python', 'java', etc.
|
|
16
|
-
timeout?: number; // Execution timeout in milliseconds
|
|
17
|
-
memoryLimit?: number; // Memory allocation in MB
|
|
18
|
-
environment?: Record<string, string>; // Environment variables
|
|
19
|
-
// Platform-specific settings
|
|
20
|
-
platformConfig?: Record<string, any>;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export interface CodeExecutionResult {
|
|
24
|
-
output: any; // The execution result/return value
|
|
25
|
-
executionTime: number; // Execution time in milliseconds
|
|
26
|
-
logs?: string[]; // Execution logs
|
|
27
|
-
errors?: string[]; // Error messages
|
|
28
|
-
success: boolean; // Whether execution succeeded
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface CodePreparationResult {
|
|
32
|
-
prepared: boolean; // Whether preparation succeeded
|
|
33
|
-
errors?: string[]; // Preparation errors
|
|
34
|
-
warnings?: string[]; // Preparation warnings
|
|
35
|
-
metadata?: Record<string, any>; // Platform-specific preparation data
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export interface CodeDeployment {
|
|
39
|
-
id: string; // Deployment identifier
|
|
40
|
-
status: string;
|
|
41
|
-
runtime: string;
|
|
42
|
-
createdAt: Date;
|
|
43
|
-
lastUsed?: Date;
|
|
44
|
-
lastUpdated?: Date;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export interface ICodeRequest {
|
|
48
|
-
// Core workflow
|
|
49
|
-
prepare(codeUID: string, input: CodeInput, config: CodeConfig): Promise<CodePreparationResult>;
|
|
50
|
-
deploy(codeUID: string, input: CodeInput, config: CodeConfig): Promise<CodeDeployment>;
|
|
51
|
-
execute(codeUID: string, inputs: Record<string, any>, config: CodeConfig): Promise<CodeExecutionResult>;
|
|
52
|
-
|
|
53
|
-
// Execute with existing deployment (for platforms that support it)
|
|
54
|
-
executeDeployment(codeUID: string, deploymentId: string, inputs: Record<string, any>, config: CodeConfig): Promise<CodeExecutionResult>;
|
|
55
|
-
|
|
56
|
-
// Deployment management
|
|
57
|
-
listDeployments(codeUID: string, config: CodeConfig): Promise<CodeDeployment[]>;
|
|
58
|
-
getDeployment(codeUID: string, deploymentId: string, config: CodeConfig): Promise<CodeDeployment | null>;
|
|
59
|
-
deleteDeployment(codeUID: string, deploymentId: string, config: CodeConfig): Promise<void>;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export abstract class CodeConnector extends SecureConnector {
|
|
63
|
-
public abstract getResourceACL(resourceId: string, candidate: IAccessCandidate): Promise<ACL>;
|
|
64
|
-
// Abstract methods that concrete connectors must implement
|
|
65
|
-
protected abstract prepare(acRequest: AccessRequest, codeUID: string, input: CodeInput, config: CodeConfig): Promise<CodePreparationResult>;
|
|
66
|
-
protected abstract deploy(acRequest: AccessRequest, codeUID: string, input: CodeInput, config: CodeConfig): Promise<CodeDeployment>;
|
|
67
|
-
protected abstract execute(acRequest: AccessRequest, codeUID: string, inputs: Record<string, any>, config: CodeConfig): Promise<CodeExecutionResult>;
|
|
68
|
-
protected abstract executeDeployment(acRequest: AccessRequest, codeUID: string, deploymentId: string, inputs: Record<string, any>, config: CodeConfig): Promise<CodeExecutionResult>;
|
|
69
|
-
protected abstract listDeployments(acRequest: AccessRequest, codeUID: string, config: CodeConfig): Promise<CodeDeployment[]>;
|
|
70
|
-
protected abstract getDeployment(acRequest: AccessRequest, codeUID: string, deploymentId: string, config: CodeConfig): Promise<CodeDeployment | null>;
|
|
71
|
-
protected abstract deleteDeployment(acRequest: AccessRequest, codeUID: string, deploymentId: string, config: CodeConfig): Promise<void>;
|
|
72
|
-
|
|
73
|
-
public requester(candidate: AccessCandidate): ICodeRequest {
|
|
74
|
-
return {
|
|
75
|
-
prepare: async (codeUID: string, input: CodeInput, config: CodeConfig) => {
|
|
76
|
-
return await this.prepare(candidate.readRequest, codeUID, input, config);
|
|
77
|
-
},
|
|
78
|
-
deploy: async (codeUID: string, input: CodeInput, config: CodeConfig) => {
|
|
79
|
-
return await this.deploy(candidate.writeRequest, codeUID, input, config);
|
|
80
|
-
},
|
|
81
|
-
execute: async (codeUID: string, inputs: Record<string, any>, config: CodeConfig) => {
|
|
82
|
-
return await this.execute(candidate.readRequest, codeUID, inputs, config);
|
|
83
|
-
},
|
|
84
|
-
executeDeployment: async (codeUID: string, deploymentId: string, inputs: Record<string, any>, config: CodeConfig) => {
|
|
85
|
-
return await this.executeDeployment(candidate.readRequest, codeUID, deploymentId, inputs, config);
|
|
86
|
-
},
|
|
87
|
-
listDeployments: async (codeUID: string, config: CodeConfig) => {
|
|
88
|
-
return await this.listDeployments(candidate.readRequest, codeUID, config);
|
|
89
|
-
},
|
|
90
|
-
getDeployment: async (codeUID: string, deploymentId: string, config: CodeConfig) => {
|
|
91
|
-
return await this.getDeployment(candidate.readRequest, codeUID, deploymentId, config);
|
|
92
|
-
},
|
|
93
|
-
deleteDeployment: async (codeUID: string, deploymentId: string, config: CodeConfig) => {
|
|
94
|
-
await this.deleteDeployment(candidate.writeRequest, codeUID, deploymentId, config);
|
|
95
|
-
},
|
|
96
|
-
} as ICodeRequest;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
1
|
+
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
2
|
+
import { AccessRequest } from '@sre/Security/AccessControl/AccessRequest.class';
|
|
3
|
+
import { ACL } from '@sre/Security/AccessControl/ACL.class';
|
|
4
|
+
import { IAccessCandidate, IACL } from '@sre/types/ACL.types';
|
|
5
|
+
import { SecureConnector } from '@sre/Security/SecureConnector.class';
|
|
6
|
+
|
|
7
|
+
export interface CodeInput {
|
|
8
|
+
code: string; // Main code to execute
|
|
9
|
+
dependencies?: string; // Dependencies/imports/packages
|
|
10
|
+
files?: Record<string, string>; // Additional files (filename -> content)
|
|
11
|
+
inputs?: Record<string, any>; // Runtime input parameters
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface CodeConfig {
|
|
15
|
+
runtime: string; // 'nodejs', 'python', 'java', etc.
|
|
16
|
+
timeout?: number; // Execution timeout in milliseconds
|
|
17
|
+
memoryLimit?: number; // Memory allocation in MB
|
|
18
|
+
environment?: Record<string, string>; // Environment variables
|
|
19
|
+
// Platform-specific settings
|
|
20
|
+
platformConfig?: Record<string, any>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface CodeExecutionResult {
|
|
24
|
+
output: any; // The execution result/return value
|
|
25
|
+
executionTime: number; // Execution time in milliseconds
|
|
26
|
+
logs?: string[]; // Execution logs
|
|
27
|
+
errors?: string[]; // Error messages
|
|
28
|
+
success: boolean; // Whether execution succeeded
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface CodePreparationResult {
|
|
32
|
+
prepared: boolean; // Whether preparation succeeded
|
|
33
|
+
errors?: string[]; // Preparation errors
|
|
34
|
+
warnings?: string[]; // Preparation warnings
|
|
35
|
+
metadata?: Record<string, any>; // Platform-specific preparation data
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface CodeDeployment {
|
|
39
|
+
id: string; // Deployment identifier
|
|
40
|
+
status: string;
|
|
41
|
+
runtime: string;
|
|
42
|
+
createdAt: Date;
|
|
43
|
+
lastUsed?: Date;
|
|
44
|
+
lastUpdated?: Date;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface ICodeRequest {
|
|
48
|
+
// Core workflow
|
|
49
|
+
prepare(codeUID: string, input: CodeInput, config: CodeConfig): Promise<CodePreparationResult>;
|
|
50
|
+
deploy(codeUID: string, input: CodeInput, config: CodeConfig): Promise<CodeDeployment>;
|
|
51
|
+
execute(codeUID: string, inputs: Record<string, any>, config: CodeConfig): Promise<CodeExecutionResult>;
|
|
52
|
+
|
|
53
|
+
// Execute with existing deployment (for platforms that support it)
|
|
54
|
+
executeDeployment(codeUID: string, deploymentId: string, inputs: Record<string, any>, config: CodeConfig): Promise<CodeExecutionResult>;
|
|
55
|
+
|
|
56
|
+
// Deployment management
|
|
57
|
+
listDeployments(codeUID: string, config: CodeConfig): Promise<CodeDeployment[]>;
|
|
58
|
+
getDeployment(codeUID: string, deploymentId: string, config: CodeConfig): Promise<CodeDeployment | null>;
|
|
59
|
+
deleteDeployment(codeUID: string, deploymentId: string, config: CodeConfig): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export abstract class CodeConnector extends SecureConnector {
|
|
63
|
+
public abstract getResourceACL(resourceId: string, candidate: IAccessCandidate): Promise<ACL>;
|
|
64
|
+
// Abstract methods that concrete connectors must implement
|
|
65
|
+
protected abstract prepare(acRequest: AccessRequest, codeUID: string, input: CodeInput, config: CodeConfig): Promise<CodePreparationResult>;
|
|
66
|
+
protected abstract deploy(acRequest: AccessRequest, codeUID: string, input: CodeInput, config: CodeConfig): Promise<CodeDeployment>;
|
|
67
|
+
protected abstract execute(acRequest: AccessRequest, codeUID: string, inputs: Record<string, any>, config: CodeConfig): Promise<CodeExecutionResult>;
|
|
68
|
+
protected abstract executeDeployment(acRequest: AccessRequest, codeUID: string, deploymentId: string, inputs: Record<string, any>, config: CodeConfig): Promise<CodeExecutionResult>;
|
|
69
|
+
protected abstract listDeployments(acRequest: AccessRequest, codeUID: string, config: CodeConfig): Promise<CodeDeployment[]>;
|
|
70
|
+
protected abstract getDeployment(acRequest: AccessRequest, codeUID: string, deploymentId: string, config: CodeConfig): Promise<CodeDeployment | null>;
|
|
71
|
+
protected abstract deleteDeployment(acRequest: AccessRequest, codeUID: string, deploymentId: string, config: CodeConfig): Promise<void>;
|
|
72
|
+
|
|
73
|
+
public requester(candidate: AccessCandidate): ICodeRequest {
|
|
74
|
+
return {
|
|
75
|
+
prepare: async (codeUID: string, input: CodeInput, config: CodeConfig) => {
|
|
76
|
+
return await this.prepare(candidate.readRequest, codeUID, input, config);
|
|
77
|
+
},
|
|
78
|
+
deploy: async (codeUID: string, input: CodeInput, config: CodeConfig) => {
|
|
79
|
+
return await this.deploy(candidate.writeRequest, codeUID, input, config);
|
|
80
|
+
},
|
|
81
|
+
execute: async (codeUID: string, inputs: Record<string, any>, config: CodeConfig) => {
|
|
82
|
+
return await this.execute(candidate.readRequest, codeUID, inputs, config);
|
|
83
|
+
},
|
|
84
|
+
executeDeployment: async (codeUID: string, deploymentId: string, inputs: Record<string, any>, config: CodeConfig) => {
|
|
85
|
+
return await this.executeDeployment(candidate.readRequest, codeUID, deploymentId, inputs, config);
|
|
86
|
+
},
|
|
87
|
+
listDeployments: async (codeUID: string, config: CodeConfig) => {
|
|
88
|
+
return await this.listDeployments(candidate.readRequest, codeUID, config);
|
|
89
|
+
},
|
|
90
|
+
getDeployment: async (codeUID: string, deploymentId: string, config: CodeConfig) => {
|
|
91
|
+
return await this.getDeployment(candidate.readRequest, codeUID, deploymentId, config);
|
|
92
|
+
},
|
|
93
|
+
deleteDeployment: async (codeUID: string, deploymentId: string, config: CodeConfig) => {
|
|
94
|
+
await this.deleteDeployment(candidate.writeRequest, codeUID, deploymentId, config);
|
|
95
|
+
},
|
|
96
|
+
} as ICodeRequest;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -1,172 +1,172 @@
|
|
|
1
|
-
import { IAccessCandidate, TAccessLevel } from '@sre/types/ACL.types';
|
|
2
|
-
import { ACL } from '@sre/Security/AccessControl/ACL.class';
|
|
3
|
-
import { CodeConfig, CodePreparationResult, CodeConnector, CodeInput, CodeDeployment, CodeExecutionResult } from '../CodeConnector';
|
|
4
|
-
import { AccessRequest } from '@sre/Security/AccessControl/AccessRequest.class';
|
|
5
|
-
import fs from 'fs';
|
|
6
|
-
import path from 'path';
|
|
7
|
-
import { execSync } from 'child_process';
|
|
8
|
-
import { cacheTTL, createOrUpdateLambdaFunction, generateCodeHash, generateLambdaCode, getCurrentEnvironmentVariables, getDeployedCodeHash, getDeployedFunction, getLambdaFunctionName, getSortedObjectValues, invokeLambdaFunction, setDeployedCodeHash, updateDeployedCodeTTL, validateAsyncMainFunction, zipCode } from '@sre/helpers/AWSLambdaCode.helper';
|
|
9
|
-
import { AWSCredentials, AWSRegionConfig } from '@sre/types/AWS.types';
|
|
10
|
-
import { Logger } from '@sre/helpers/Log.helper';
|
|
11
|
-
|
|
12
|
-
const console = Logger('AWSLambda');
|
|
13
|
-
|
|
14
|
-
export class AWSLambdaCode extends CodeConnector {
|
|
15
|
-
public name = 'AWSLambda';
|
|
16
|
-
private awsConfigs: AWSCredentials & AWSRegionConfig;
|
|
17
|
-
|
|
18
|
-
constructor(config: { region: string, accessKeyId: string, secretAccessKey: string }) {
|
|
19
|
-
super(config);
|
|
20
|
-
//if (!SmythRuntime.Instance) throw new Error('SRE not initialized');
|
|
21
|
-
this.awsConfigs = config;
|
|
22
|
-
}
|
|
23
|
-
public async prepare(acRequest: AccessRequest, codeUID: string, input: CodeInput, config: CodeConfig): Promise<CodePreparationResult> {
|
|
24
|
-
return {
|
|
25
|
-
prepared: true,
|
|
26
|
-
errors: [],
|
|
27
|
-
warnings: [],
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
public async deploy(acRequest: AccessRequest, codeUID: string, input: CodeInput, config: CodeConfig): Promise<CodeDeployment> {
|
|
32
|
-
const agentId = acRequest.candidate.id;
|
|
33
|
-
const functionName = getLambdaFunctionName(agentId, codeUID);
|
|
34
|
-
const [isLambdaExists, exisitingCodeHash, currentEnvVariables] = await Promise.all([
|
|
35
|
-
getDeployedFunction(functionName, this.awsConfigs),
|
|
36
|
-
getDeployedCodeHash(agentId, codeUID),
|
|
37
|
-
getCurrentEnvironmentVariables(acRequest.candidate.id, input.code),
|
|
38
|
-
]);
|
|
39
|
-
|
|
40
|
-
// sorting values to get the same hash for the same env variables
|
|
41
|
-
const envValues = getSortedObjectValues(currentEnvVariables);
|
|
42
|
-
|
|
43
|
-
const codeHash = generateCodeHash(input.code, Object.keys(input.inputs), envValues);
|
|
44
|
-
if (isLambdaExists && exisitingCodeHash === codeHash) {
|
|
45
|
-
return {
|
|
46
|
-
id: functionName,
|
|
47
|
-
runtime: config.runtime,
|
|
48
|
-
createdAt: new Date(),
|
|
49
|
-
status: 'deployed',
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
const baseFolder = `${process.cwd()}/lambda_archives`;
|
|
53
|
-
if (!fs.existsSync(baseFolder)) {
|
|
54
|
-
fs.mkdirSync(baseFolder);
|
|
55
|
-
}
|
|
56
|
-
const directory = `${baseFolder}/${functionName}__${Date.now()}`;
|
|
57
|
-
try {
|
|
58
|
-
const { isValid, parameters, error, dependencies } = validateAsyncMainFunction(input.code);
|
|
59
|
-
if (!isValid) {
|
|
60
|
-
throw new Error(error || 'Invalid Code')
|
|
61
|
-
}
|
|
62
|
-
const lambdaCode = generateLambdaCode(input.code, parameters, currentEnvVariables);
|
|
63
|
-
// create folder
|
|
64
|
-
fs.mkdirSync(directory);
|
|
65
|
-
// create index.js file
|
|
66
|
-
fs.writeFileSync(path.join(directory, 'index.mjs'), lambdaCode);
|
|
67
|
-
// run command npm init
|
|
68
|
-
execSync('npm init -y', { cwd: directory });
|
|
69
|
-
// run command npm install
|
|
70
|
-
execSync(`npm install ${dependencies.join(' ')}`, { cwd: directory });
|
|
71
|
-
|
|
72
|
-
const zipFilePath = await zipCode(directory);
|
|
73
|
-
await createOrUpdateLambdaFunction(functionName, zipFilePath, this.awsConfigs, currentEnvVariables);
|
|
74
|
-
await setDeployedCodeHash(agentId, codeUID, codeHash);
|
|
75
|
-
console.debug('Lambda function updated successfully!');
|
|
76
|
-
return {
|
|
77
|
-
id: functionName,
|
|
78
|
-
runtime: config.runtime,
|
|
79
|
-
createdAt: new Date(),
|
|
80
|
-
status: 'deploying',
|
|
81
|
-
};
|
|
82
|
-
} catch (error) {
|
|
83
|
-
throw error;
|
|
84
|
-
} finally {
|
|
85
|
-
try {
|
|
86
|
-
fs.rmSync(`${directory}`, { recursive: true, force: true });
|
|
87
|
-
fs.unlinkSync(`${directory}.zip`);
|
|
88
|
-
} catch (error) { }
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
public async execute(acRequest: AccessRequest, codeUID: string, inputs: Record<string, any>, config: CodeConfig): Promise<CodeExecutionResult> {
|
|
94
|
-
try {
|
|
95
|
-
const agentId = acRequest.candidate.id;
|
|
96
|
-
const functionName = getLambdaFunctionName(agentId, codeUID);
|
|
97
|
-
|
|
98
|
-
const lambdaResponse = JSON.parse(await invokeLambdaFunction(functionName, inputs, this.awsConfigs));
|
|
99
|
-
const executionTime = lambdaResponse.executionTime;
|
|
100
|
-
await updateDeployedCodeTTL(agentId, codeUID, cacheTTL);
|
|
101
|
-
console.debug(
|
|
102
|
-
`Code result:\n ${typeof lambdaResponse.result === 'object' ? JSON.stringify(lambdaResponse.result, null, 2) : lambdaResponse.result
|
|
103
|
-
}\n`,
|
|
104
|
-
);
|
|
105
|
-
console.debug(`Execution time: ${executionTime}ms\n`);
|
|
106
|
-
|
|
107
|
-
const Output = lambdaResponse.result;
|
|
108
|
-
return {
|
|
109
|
-
output: Output,
|
|
110
|
-
executionTime: executionTime,
|
|
111
|
-
success: true,
|
|
112
|
-
};
|
|
113
|
-
} catch (error: any) {
|
|
114
|
-
console.error(`Error running code \n${error}\n`);
|
|
115
|
-
const _error = error?.response?.data || error?.message || error.toString();
|
|
116
|
-
const output = undefined; //prevents running next component if the code execution failed
|
|
117
|
-
return { output, executionTime: 0, success: false, errors: [_error] };
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
public async executeDeployment(acRequest: AccessRequest, codeUID: string, deploymentId: string, inputs: Record<string, any>, config: CodeConfig): Promise<CodeExecutionResult> {
|
|
122
|
-
const result = await this.execute(acRequest, codeUID, inputs, config);
|
|
123
|
-
return result;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
public async listDeployments(acRequest: AccessRequest, codeUID: string, config: CodeConfig): Promise<CodeDeployment[]> {
|
|
127
|
-
const agentId = acRequest.candidate.id;
|
|
128
|
-
const lambdaFunction = await getDeployedFunction(getLambdaFunctionName(agentId, codeUID), config.platformConfig as AWSCredentials & AWSRegionConfig);
|
|
129
|
-
if (lambdaFunction) {
|
|
130
|
-
return [
|
|
131
|
-
{
|
|
132
|
-
id: lambdaFunction.functionName,
|
|
133
|
-
runtime: lambdaFunction.runtime,
|
|
134
|
-
createdAt: new Date(lambdaFunction.updatedAt),
|
|
135
|
-
status: lambdaFunction.status,
|
|
136
|
-
lastUpdated: new Date(lambdaFunction.updatedAt),
|
|
137
|
-
}
|
|
138
|
-
]
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
return [];
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
public async getDeployment(acRequest: AccessRequest, codeUID: string, deploymentId: string, config: CodeConfig): Promise<CodeDeployment | null> {
|
|
145
|
-
const agentId = acRequest.candidate.id;
|
|
146
|
-
const lambdaFunction = await getDeployedFunction(getLambdaFunctionName(agentId, codeUID), config.platformConfig as AWSCredentials & AWSRegionConfig);
|
|
147
|
-
if (lambdaFunction) {
|
|
148
|
-
return {
|
|
149
|
-
id: lambdaFunction.functionName,
|
|
150
|
-
runtime: lambdaFunction.runtime,
|
|
151
|
-
createdAt: new Date(lambdaFunction.updatedAt),
|
|
152
|
-
status: lambdaFunction.status,
|
|
153
|
-
lastUpdated: new Date(lambdaFunction.updatedAt),
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
return null;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
public async deleteDeployment(acRequest: AccessRequest, codeUID: string, deploymentId: string): Promise<void> {
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
public async getResourceACL(resourceId: string, candidate: IAccessCandidate): Promise<ACL> {
|
|
164
|
-
const acl = new ACL();
|
|
165
|
-
|
|
166
|
-
//give Read access everytime
|
|
167
|
-
//FIXME: !!!!!! IMPORTANT !!!!!! this implementation have to be changed in order to reflect the security model of AWS Lambda
|
|
168
|
-
acl.addAccess(candidate.role, candidate.id, TAccessLevel.Read);
|
|
169
|
-
|
|
170
|
-
return acl;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
1
|
+
import { IAccessCandidate, TAccessLevel } from '@sre/types/ACL.types';
|
|
2
|
+
import { ACL } from '@sre/Security/AccessControl/ACL.class';
|
|
3
|
+
import { CodeConfig, CodePreparationResult, CodeConnector, CodeInput, CodeDeployment, CodeExecutionResult } from '../CodeConnector';
|
|
4
|
+
import { AccessRequest } from '@sre/Security/AccessControl/AccessRequest.class';
|
|
5
|
+
import fs from 'fs';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { execSync } from 'child_process';
|
|
8
|
+
import { cacheTTL, createOrUpdateLambdaFunction, generateCodeHash, generateLambdaCode, getCurrentEnvironmentVariables, getDeployedCodeHash, getDeployedFunction, getLambdaFunctionName, getSortedObjectValues, invokeLambdaFunction, setDeployedCodeHash, updateDeployedCodeTTL, validateAsyncMainFunction, zipCode } from '@sre/helpers/AWSLambdaCode.helper';
|
|
9
|
+
import { AWSCredentials, AWSRegionConfig } from '@sre/types/AWS.types';
|
|
10
|
+
import { Logger } from '@sre/helpers/Log.helper';
|
|
11
|
+
|
|
12
|
+
const console = Logger('AWSLambda');
|
|
13
|
+
|
|
14
|
+
export class AWSLambdaCode extends CodeConnector {
|
|
15
|
+
public name = 'AWSLambda';
|
|
16
|
+
private awsConfigs: AWSCredentials & AWSRegionConfig;
|
|
17
|
+
|
|
18
|
+
constructor(config: { region: string, accessKeyId: string, secretAccessKey: string }) {
|
|
19
|
+
super(config);
|
|
20
|
+
//if (!SmythRuntime.Instance) throw new Error('SRE not initialized');
|
|
21
|
+
this.awsConfigs = config;
|
|
22
|
+
}
|
|
23
|
+
public async prepare(acRequest: AccessRequest, codeUID: string, input: CodeInput, config: CodeConfig): Promise<CodePreparationResult> {
|
|
24
|
+
return {
|
|
25
|
+
prepared: true,
|
|
26
|
+
errors: [],
|
|
27
|
+
warnings: [],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public async deploy(acRequest: AccessRequest, codeUID: string, input: CodeInput, config: CodeConfig): Promise<CodeDeployment> {
|
|
32
|
+
const agentId = acRequest.candidate.id;
|
|
33
|
+
const functionName = getLambdaFunctionName(agentId, codeUID);
|
|
34
|
+
const [isLambdaExists, exisitingCodeHash, currentEnvVariables] = await Promise.all([
|
|
35
|
+
getDeployedFunction(functionName, this.awsConfigs),
|
|
36
|
+
getDeployedCodeHash(agentId, codeUID),
|
|
37
|
+
getCurrentEnvironmentVariables(acRequest.candidate.id, input.code),
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
// sorting values to get the same hash for the same env variables
|
|
41
|
+
const envValues = getSortedObjectValues(currentEnvVariables);
|
|
42
|
+
|
|
43
|
+
const codeHash = generateCodeHash(input.code, Object.keys(input.inputs), envValues);
|
|
44
|
+
if (isLambdaExists && exisitingCodeHash === codeHash) {
|
|
45
|
+
return {
|
|
46
|
+
id: functionName,
|
|
47
|
+
runtime: config.runtime,
|
|
48
|
+
createdAt: new Date(),
|
|
49
|
+
status: 'deployed',
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const baseFolder = `${process.cwd()}/lambda_archives`;
|
|
53
|
+
if (!fs.existsSync(baseFolder)) {
|
|
54
|
+
fs.mkdirSync(baseFolder);
|
|
55
|
+
}
|
|
56
|
+
const directory = `${baseFolder}/${functionName}__${Date.now()}`;
|
|
57
|
+
try {
|
|
58
|
+
const { isValid, parameters, error, dependencies } = validateAsyncMainFunction(input.code);
|
|
59
|
+
if (!isValid) {
|
|
60
|
+
throw new Error(error || 'Invalid Code')
|
|
61
|
+
}
|
|
62
|
+
const lambdaCode = generateLambdaCode(input.code, parameters, currentEnvVariables);
|
|
63
|
+
// create folder
|
|
64
|
+
fs.mkdirSync(directory);
|
|
65
|
+
// create index.js file
|
|
66
|
+
fs.writeFileSync(path.join(directory, 'index.mjs'), lambdaCode);
|
|
67
|
+
// run command npm init
|
|
68
|
+
execSync('npm init -y', { cwd: directory });
|
|
69
|
+
// run command npm install
|
|
70
|
+
execSync(`npm install ${dependencies.join(' ')}`, { cwd: directory });
|
|
71
|
+
|
|
72
|
+
const zipFilePath = await zipCode(directory);
|
|
73
|
+
await createOrUpdateLambdaFunction(functionName, zipFilePath, this.awsConfigs, currentEnvVariables);
|
|
74
|
+
await setDeployedCodeHash(agentId, codeUID, codeHash);
|
|
75
|
+
console.debug('Lambda function updated successfully!');
|
|
76
|
+
return {
|
|
77
|
+
id: functionName,
|
|
78
|
+
runtime: config.runtime,
|
|
79
|
+
createdAt: new Date(),
|
|
80
|
+
status: 'deploying',
|
|
81
|
+
};
|
|
82
|
+
} catch (error) {
|
|
83
|
+
throw error;
|
|
84
|
+
} finally {
|
|
85
|
+
try {
|
|
86
|
+
fs.rmSync(`${directory}`, { recursive: true, force: true });
|
|
87
|
+
fs.unlinkSync(`${directory}.zip`);
|
|
88
|
+
} catch (error) { }
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
public async execute(acRequest: AccessRequest, codeUID: string, inputs: Record<string, any>, config: CodeConfig): Promise<CodeExecutionResult> {
|
|
94
|
+
try {
|
|
95
|
+
const agentId = acRequest.candidate.id;
|
|
96
|
+
const functionName = getLambdaFunctionName(agentId, codeUID);
|
|
97
|
+
|
|
98
|
+
const lambdaResponse = JSON.parse(await invokeLambdaFunction(functionName, inputs, this.awsConfigs));
|
|
99
|
+
const executionTime = lambdaResponse.executionTime;
|
|
100
|
+
await updateDeployedCodeTTL(agentId, codeUID, cacheTTL);
|
|
101
|
+
console.debug(
|
|
102
|
+
`Code result:\n ${typeof lambdaResponse.result === 'object' ? JSON.stringify(lambdaResponse.result, null, 2) : lambdaResponse.result
|
|
103
|
+
}\n`,
|
|
104
|
+
);
|
|
105
|
+
console.debug(`Execution time: ${executionTime}ms\n`);
|
|
106
|
+
|
|
107
|
+
const Output = lambdaResponse.result;
|
|
108
|
+
return {
|
|
109
|
+
output: Output,
|
|
110
|
+
executionTime: executionTime,
|
|
111
|
+
success: true,
|
|
112
|
+
};
|
|
113
|
+
} catch (error: any) {
|
|
114
|
+
console.error(`Error running code \n${error}\n`);
|
|
115
|
+
const _error = error?.response?.data || error?.message || error.toString();
|
|
116
|
+
const output = undefined; //prevents running next component if the code execution failed
|
|
117
|
+
return { output, executionTime: 0, success: false, errors: [_error] };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
public async executeDeployment(acRequest: AccessRequest, codeUID: string, deploymentId: string, inputs: Record<string, any>, config: CodeConfig): Promise<CodeExecutionResult> {
|
|
122
|
+
const result = await this.execute(acRequest, codeUID, inputs, config);
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
public async listDeployments(acRequest: AccessRequest, codeUID: string, config: CodeConfig): Promise<CodeDeployment[]> {
|
|
127
|
+
const agentId = acRequest.candidate.id;
|
|
128
|
+
const lambdaFunction = await getDeployedFunction(getLambdaFunctionName(agentId, codeUID), config.platformConfig as AWSCredentials & AWSRegionConfig);
|
|
129
|
+
if (lambdaFunction) {
|
|
130
|
+
return [
|
|
131
|
+
{
|
|
132
|
+
id: lambdaFunction.functionName,
|
|
133
|
+
runtime: lambdaFunction.runtime,
|
|
134
|
+
createdAt: new Date(lambdaFunction.updatedAt),
|
|
135
|
+
status: lambdaFunction.status,
|
|
136
|
+
lastUpdated: new Date(lambdaFunction.updatedAt),
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
public async getDeployment(acRequest: AccessRequest, codeUID: string, deploymentId: string, config: CodeConfig): Promise<CodeDeployment | null> {
|
|
145
|
+
const agentId = acRequest.candidate.id;
|
|
146
|
+
const lambdaFunction = await getDeployedFunction(getLambdaFunctionName(agentId, codeUID), config.platformConfig as AWSCredentials & AWSRegionConfig);
|
|
147
|
+
if (lambdaFunction) {
|
|
148
|
+
return {
|
|
149
|
+
id: lambdaFunction.functionName,
|
|
150
|
+
runtime: lambdaFunction.runtime,
|
|
151
|
+
createdAt: new Date(lambdaFunction.updatedAt),
|
|
152
|
+
status: lambdaFunction.status,
|
|
153
|
+
lastUpdated: new Date(lambdaFunction.updatedAt),
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
public async deleteDeployment(acRequest: AccessRequest, codeUID: string, deploymentId: string): Promise<void> {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
public async getResourceACL(resourceId: string, candidate: IAccessCandidate): Promise<ACL> {
|
|
164
|
+
const acl = new ACL();
|
|
165
|
+
|
|
166
|
+
//give Read access everytime
|
|
167
|
+
//FIXME: !!!!!! IMPORTANT !!!!!! this implementation have to be changed in order to reflect the security model of AWS Lambda
|
|
168
|
+
acl.addAccess(candidate.role, candidate.id, TAccessLevel.Read);
|
|
169
|
+
|
|
170
|
+
return acl;
|
|
171
|
+
}
|
|
172
|
+
}
|