@smythos/sre 1.6.8 → 1.6.10
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 +111 -111
- 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 +2 -2
- package/dist/index.js.map +1 -1
- package/dist/types/Components/Triggers/Gmail.trigger.d.ts +58 -0
- package/dist/types/Components/Triggers/GmailTrigger.class.d.ts +44 -0
- package/dist/types/Components/Triggers/Trigger.class.d.ts +21 -0
- package/dist/types/Components/Triggers/WhatsApp.trigger.d.ts +22 -0
- package/dist/types/helpers/AIPerformanceAnalyzer.helper.d.ts +45 -0
- package/dist/types/helpers/AIPerformanceCollector.helper.d.ts +111 -0
- package/dist/types/subsystems/IO/Storage.service/connectors/AzureBlobStorage.class.d.ts +211 -0
- package/dist/types/subsystems/IO/VectorDB.service/connectors/WeaviateVectorDB.class.d.ts +187 -0
- package/dist/types/subsystems/PerformanceManager/Performance.service/PerformanceConnector.d.ts +102 -0
- package/dist/types/subsystems/PerformanceManager/Performance.service/connectors/LocalPerformanceConnector.class.d.ts +100 -0
- package/dist/types/subsystems/PerformanceManager/Performance.service/index.d.ts +22 -0
- package/dist/types/subsystems/Security/Credentials/Credentials.class.d.ts +2 -0
- package/dist/types/subsystems/Security/Credentials/ManagedOAuth2Credentials.class.d.ts +18 -0
- package/dist/types/subsystems/Security/Credentials/OAuth2Credentials.class.d.ts +14 -0
- package/dist/types/types/Performance.types.d.ts +468 -0
- package/dist/types/utils/package-manager.utils.d.ts +26 -0
- package/package.json +1 -1
- package/src/Components/APICall/APICall.class.ts +161 -161
- package/src/Components/APICall/AccessTokenManager.ts +166 -166
- package/src/Components/APICall/ArrayBufferResponse.helper.ts +58 -58
- package/src/Components/APICall/OAuth.helper.ts +447 -447
- 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 +147 -147
- 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 +72 -72
- 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 +66 -66
- 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 +313 -313
- package/src/Components/Image/imageSettings.config.ts +70 -70
- package/src/Components/ImageGenerator.class.ts +483 -483
- 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 +137 -137
- package/src/Components/MemoryDeleteKeyVal.class.ts +70 -70
- package/src/Components/MemoryReadKeyVal.class.ts +67 -67
- 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 +183 -183
- package/src/Components/ServerlessCode.class.ts +123 -123
- package/src/Components/TavilyWebSearch.class.ts +103 -103
- 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 +241 -241
- 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 +624 -624
- package/src/helpers/BinaryInput.helper.ts +331 -331
- package/src/helpers/Conversation.helper.ts +1157 -1157
- package/src/helpers/ECMASandbox.helper.ts +64 -64
- 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 +95 -95
- 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 +145 -145
- 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 +301 -301
- package/src/subsystems/AgentManager/AgentRequest.class.ts +51 -51
- package/src/subsystems/AgentManager/AgentRuntime.class.ts +557 -557
- 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 +171 -171
- 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 +488 -488
- 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 +465 -465
- package/src/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.ts +387 -387
- package/src/subsystems/IO/VectorDB.service/connectors/RAMVecrtorDB.class.ts +408 -408
- package/src/subsystems/IO/VectorDB.service/embed/BaseEmbedding.ts +107 -107
- package/src/subsystems/IO/VectorDB.service/embed/GoogleEmbedding.ts +118 -118
- package/src/subsystems/IO/VectorDB.service/embed/OpenAIEmbedding.ts +109 -109
- package/src/subsystems/IO/VectorDB.service/embed/index.ts +26 -26
- 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 +345 -345
- package/src/subsystems/LLMManager/LLM.service/LLMConnector.ts +492 -492
- package/src/subsystems/LLMManager/LLM.service/LLMCredentials.helper.ts +171 -171
- package/src/subsystems/LLMManager/LLM.service/connectors/Anthropic.class.ts +666 -666
- package/src/subsystems/LLMManager/LLM.service/connectors/Bedrock.class.ts +407 -407
- package/src/subsystems/LLMManager/LLM.service/connectors/Echo.class.ts +92 -92
- package/src/subsystems/LLMManager/LLM.service/connectors/GoogleAI.class.ts +983 -983
- package/src/subsystems/LLMManager/LLM.service/connectors/Groq.class.ts +319 -319
- package/src/subsystems/LLMManager/LLM.service/connectors/Ollama.class.ts +361 -361
- package/src/subsystems/LLMManager/LLM.service/connectors/Perplexity.class.ts +257 -257
- package/src/subsystems/LLMManager/LLM.service/connectors/VertexAI.class.ts +430 -430
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.ts +503 -503
- 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 +478 -478
- package/src/subsystems/LLMManager/LLM.service/index.ts +47 -47
- package/src/subsystems/LLMManager/ModelsProvider.service/ModelsProviderConnector.ts +303 -303
- package/src/subsystems/LLMManager/ModelsProvider.service/connectors/JSONModelsProvider.class.ts +280 -271
- 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 +214 -214
- 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 +277 -277
- 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/DummyAccount.class.ts +130 -130
- package/src/subsystems/Security/Account.service/connectors/JSONFileAccount.class.ts +170 -170
- package/src/subsystems/Security/Account.service/connectors/MySQLAccount.class.ts +76 -76
- 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 +520 -520
- 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,277 +1,277 @@
|
|
|
1
|
-
import EventEmitter from 'events';
|
|
2
|
-
import { delay, uid } from '@sre/utils';
|
|
3
|
-
import { AgentRuntime } from '@sre/AgentManager/AgentRuntime.class';
|
|
4
|
-
import { Logger } from '@sre/helpers/Log.helper';
|
|
5
|
-
import { ConnectorService } from '@sre/Core/ConnectorsService';
|
|
6
|
-
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
7
|
-
import { CacheConnector } from './Cache.service/CacheConnector';
|
|
8
|
-
|
|
9
|
-
const console = Logger('RuntimeContext');
|
|
10
|
-
|
|
11
|
-
type TRuntimeData = {
|
|
12
|
-
input?: { [key: string]: any };
|
|
13
|
-
_LoopData?: any;
|
|
14
|
-
_ChildLoopData?: any;
|
|
15
|
-
};
|
|
16
|
-
type TComponentContext = {
|
|
17
|
-
active: boolean;
|
|
18
|
-
name: string;
|
|
19
|
-
runtimeData?: TRuntimeData;
|
|
20
|
-
step: number;
|
|
21
|
-
input?: { [key: string]: any };
|
|
22
|
-
output?: { [key: string]: any };
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export class RuntimeContext extends EventEmitter {
|
|
26
|
-
public circularLimitReached: string | boolean = false;
|
|
27
|
-
public step: number = 0;
|
|
28
|
-
public sessionResult: boolean = false;
|
|
29
|
-
public sessionResults: any;
|
|
30
|
-
public components: { [id: string]: { ctx: TComponentContext } } = {};
|
|
31
|
-
|
|
32
|
-
public checkRuntimeContext: any = null;
|
|
33
|
-
|
|
34
|
-
private ctxFile: string = '';
|
|
35
|
-
private _runtimeFileReady: any;
|
|
36
|
-
private _cacheConnector: CacheConnector;
|
|
37
|
-
|
|
38
|
-
private _readyPromise: Promise<boolean>;
|
|
39
|
-
private _lastCtxLength: number = 0;
|
|
40
|
-
|
|
41
|
-
constructor(private runtime: AgentRuntime) {
|
|
42
|
-
super();
|
|
43
|
-
const agent = runtime.agent;
|
|
44
|
-
|
|
45
|
-
this._cacheConnector = ConnectorService.getCacheConnector();
|
|
46
|
-
|
|
47
|
-
const processRootID = runtime.processID?.split(':')[0] || '';
|
|
48
|
-
const reqId = processRootID == runtime.xDebugId ? '' : '.' + uid() + runtime.reqTag;
|
|
49
|
-
|
|
50
|
-
this.ctxFile = `${runtime.xDebugId}${reqId}${agent.jobID ? `-job-${agent.jobID}` : ''}`;
|
|
51
|
-
|
|
52
|
-
this._readyPromise = new Promise((resolve, reject) => {
|
|
53
|
-
let resolved = false;
|
|
54
|
-
this.on('ready', () => {
|
|
55
|
-
resolved = true;
|
|
56
|
-
resolve(true);
|
|
57
|
-
});
|
|
58
|
-
const timer = setTimeout(() => {
|
|
59
|
-
if (!resolved) {
|
|
60
|
-
reject(new Error('Agent Runtime context initialization timeout'));
|
|
61
|
-
}
|
|
62
|
-
}, 5 * 60 * 1000);
|
|
63
|
-
timer.unref(); //unblock the event loop
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
this.initRuntimeContext();
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
private serialize() {
|
|
70
|
-
const data = {
|
|
71
|
-
step: this.step,
|
|
72
|
-
sessionResult: this.sessionResult,
|
|
73
|
-
sessionResults: this.sessionResults,
|
|
74
|
-
components: this.components,
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
return data;
|
|
78
|
-
}
|
|
79
|
-
private deserialize(data: any) {
|
|
80
|
-
this.step = data.step;
|
|
81
|
-
this.sessionResult = data.sessionResult;
|
|
82
|
-
this.sessionResults = data.sessionResults;
|
|
83
|
-
this.components = data.components;
|
|
84
|
-
}
|
|
85
|
-
private reset() {
|
|
86
|
-
this.step = 0;
|
|
87
|
-
this.sessionResult = false;
|
|
88
|
-
this.sessionResults = null;
|
|
89
|
-
this.components = {};
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
private initRuntimeContext() {
|
|
93
|
-
if (this._runtimeFileReady) return;
|
|
94
|
-
|
|
95
|
-
const endpointDBGCall = this.runtime.xDebugId?.startsWith('dbg-'); //weak check for debug session, we need to improve this
|
|
96
|
-
console.debug('Init Agent Context', this.ctxFile, AccessCandidate.agent(this.runtime.agent.id));
|
|
97
|
-
const agent = this.runtime.agent;
|
|
98
|
-
let method = (agent.agentRequest.method || 'POST').toUpperCase();
|
|
99
|
-
const endpoint = agent.endpoints?.[agent.agentRequest.path]?.[method];
|
|
100
|
-
|
|
101
|
-
let ctxData: any = {};
|
|
102
|
-
|
|
103
|
-
this._cacheConnector
|
|
104
|
-
.requester(AccessCandidate.agent(this.runtime.agent.id))
|
|
105
|
-
.get(this.ctxFile)
|
|
106
|
-
.then(async (data) => {
|
|
107
|
-
if (!data) {
|
|
108
|
-
ctxData = JSON.parse(JSON.stringify({ components: agent.components, connections: agent.connections, timestamp: Date.now() }));
|
|
109
|
-
if (!ctxData.step) ctxData.step = 0;
|
|
110
|
-
for (let cptId in ctxData.components) {
|
|
111
|
-
ctxData.components[cptId] = {
|
|
112
|
-
id: cptId,
|
|
113
|
-
name: ctxData.components[cptId].name,
|
|
114
|
-
//dbg: { active: false, name: ctxData.components[cptId].name },
|
|
115
|
-
ctx: { active: false, name: ctxData.components[cptId].name },
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
const cpt = ctxData.components[cptId];
|
|
119
|
-
//if this debug session was initiated from an endpoint, we mark the endpoint component as active
|
|
120
|
-
if (endpoint && endpoint.id != undefined && cpt.id == endpoint.id && endpointDBGCall) {
|
|
121
|
-
//cpt.dbg.active = true;
|
|
122
|
-
cpt.ctx.active = true;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
await this._cacheConnector
|
|
127
|
-
.requester(AccessCandidate.agent(this.runtime.agent.id))
|
|
128
|
-
.set(this.ctxFile, JSON.stringify(ctxData), null, null, 1 * 60 * 60); //expires in 1 hour
|
|
129
|
-
} else {
|
|
130
|
-
ctxData = JSON.parse(data);
|
|
131
|
-
if (!ctxData.step) ctxData.step = 0;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
this.deserialize(ctxData);
|
|
135
|
-
this._runtimeFileReady = true;
|
|
136
|
-
this.emit('ready');
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
public async ready() {
|
|
141
|
-
if (this._runtimeFileReady) return true;
|
|
142
|
-
return this._readyPromise;
|
|
143
|
-
}
|
|
144
|
-
private async sync() {
|
|
145
|
-
if (!this.ctxFile) return;
|
|
146
|
-
|
|
147
|
-
this.emit('syncing');
|
|
148
|
-
|
|
149
|
-
const deleteSession = this.runtime.sessionClosed;
|
|
150
|
-
|
|
151
|
-
//TODO : Do we need to cache the context if not in debug mode ?
|
|
152
|
-
|
|
153
|
-
const data = this.serialize();
|
|
154
|
-
//if (data) fs.writeFileSync(this.ctxFile, JSON.stringify(data, null, 2));
|
|
155
|
-
if (data) {
|
|
156
|
-
let serializedData = JSON.stringify(data);
|
|
157
|
-
|
|
158
|
-
if (serializedData.length != this._lastCtxLength) {
|
|
159
|
-
//only log if context has changes
|
|
160
|
-
//We use the length as a weak but fast way to detect changes
|
|
161
|
-
console.debug('Agent Context Size', this.ctxFile, serializedData.length, AccessCandidate.agent(this.runtime.agent.id));
|
|
162
|
-
this._lastCtxLength = serializedData.length;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
await this._cacheConnector
|
|
166
|
-
.requester(AccessCandidate.agent(this.runtime.agent.id))
|
|
167
|
-
.set(this.ctxFile, serializedData, null, null, 3 * 60 * 60); //expires in 3 hours max
|
|
168
|
-
|
|
169
|
-
const mb = serializedData.length / 1024 / 1024;
|
|
170
|
-
const cooldown = (mb / 10) * 1000;
|
|
171
|
-
serializedData = null;
|
|
172
|
-
|
|
173
|
-
await delay(cooldown);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
if (deleteSession) {
|
|
177
|
-
const exists = await this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).exists(this.ctxFile);
|
|
178
|
-
|
|
179
|
-
if (exists) {
|
|
180
|
-
console.debug('Agent Context Delete', this.ctxFile, AccessCandidate.agent(this.runtime.agent.id));
|
|
181
|
-
if (this.runtime.debug) this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).updateTTL(this.ctxFile, 5 * 60);
|
|
182
|
-
//expires in 5 minute
|
|
183
|
-
else this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).delete(this.ctxFile);
|
|
184
|
-
//if (this.runtime.debug && fs.existsSync(this.ctxFile)) await delay(1000 * 60); //if we're in debug mode, we keep the file for a while to allow final state read
|
|
185
|
-
//if (fs.existsSync(this.ctxFile)) fs.unlinkSync(this.ctxFile);
|
|
186
|
-
this.ctxFile = null;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
private _syncQueue = Promise.resolve();
|
|
191
|
-
|
|
192
|
-
public enqueueSync() {
|
|
193
|
-
if (!this.ctxFile) return;
|
|
194
|
-
|
|
195
|
-
this._syncQueue = this._syncQueue
|
|
196
|
-
.then(() => this.sync())
|
|
197
|
-
.catch((err) => {
|
|
198
|
-
console.error('Error syncing context', err);
|
|
199
|
-
}); // avoid unhandled rejections
|
|
200
|
-
}
|
|
201
|
-
public incStep() {
|
|
202
|
-
this.step++;
|
|
203
|
-
//this.sync();
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
public updateComponent(componentId: string, data: any) {
|
|
207
|
-
const ctxData = this;
|
|
208
|
-
if (!ctxData) return;
|
|
209
|
-
const component = ctxData.components[componentId];
|
|
210
|
-
|
|
211
|
-
if (!component) {
|
|
212
|
-
console.debug(
|
|
213
|
-
'>>>>>>> updateComponent Component debug data not found',
|
|
214
|
-
componentId,
|
|
215
|
-
component,
|
|
216
|
-
AccessCandidate.agent(this.runtime.agent.id)
|
|
217
|
-
);
|
|
218
|
-
console.debug('>>> ctxFile', this.ctxFile, AccessCandidate.agent(this.runtime.agent.id));
|
|
219
|
-
console.debug('>>> ctxData', ctxData, AccessCandidate.agent(this.runtime.agent.id));
|
|
220
|
-
}
|
|
221
|
-
//component.ctx = { ...component.ctx, ...data, step: this.step };
|
|
222
|
-
// minimal allocations
|
|
223
|
-
|
|
224
|
-
if (!component.ctx) component.ctx = { active: false, name: '', step: 0 };
|
|
225
|
-
Object.assign(component.ctx, data);
|
|
226
|
-
component.ctx.step = this.step;
|
|
227
|
-
|
|
228
|
-
//if (this.debug) component.dbg = { ...component.dbg, ...data };
|
|
229
|
-
|
|
230
|
-
this.enqueueSync();
|
|
231
|
-
}
|
|
232
|
-
public resetComponent(componentId: string) {
|
|
233
|
-
const ctxData = this;
|
|
234
|
-
const component = ctxData.components[componentId];
|
|
235
|
-
if (!component) {
|
|
236
|
-
console.debug(
|
|
237
|
-
'>>>>>>> resetComponent Component debug data not found',
|
|
238
|
-
componentId,
|
|
239
|
-
component,
|
|
240
|
-
AccessCandidate.agent(this.runtime.agent.id)
|
|
241
|
-
);
|
|
242
|
-
console.debug('>>> ctxFile', this.ctxFile, AccessCandidate.agent(this.runtime.agent.id));
|
|
243
|
-
console.debug('>>> ctxData', ctxData, AccessCandidate.agent(this.runtime.agent.id));
|
|
244
|
-
}
|
|
245
|
-
//component.dbg.active = false;
|
|
246
|
-
//component.dbg.runtimeData = {};
|
|
247
|
-
component.ctx.runtimeData = {};
|
|
248
|
-
component.ctx.active = false;
|
|
249
|
-
if (!this.runtime.debug) {
|
|
250
|
-
//console.debug('NOT in debug mode, clearing context input/output');
|
|
251
|
-
component.ctx.input = undefined;
|
|
252
|
-
component.ctx.output = undefined;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
this.enqueueSync();
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
public getComponentData(componentId: string) {
|
|
259
|
-
const ctxData = this;
|
|
260
|
-
if (!ctxData) return null;
|
|
261
|
-
const component = ctxData.components[componentId];
|
|
262
|
-
if (!component) {
|
|
263
|
-
console.debug(
|
|
264
|
-
'>>>>>>> getComponentData Component debug data not found',
|
|
265
|
-
componentId,
|
|
266
|
-
component,
|
|
267
|
-
AccessCandidate.agent(this.runtime.agent.id)
|
|
268
|
-
);
|
|
269
|
-
console.debug('>>> ctxFile', this.ctxFile, AccessCandidate.agent(this.runtime.agent.id));
|
|
270
|
-
console.debug('>>> ctxData', ctxData, AccessCandidate.agent(this.runtime.agent.id));
|
|
271
|
-
}
|
|
272
|
-
//const data = this.debug ? component.dbg : component.ctx;
|
|
273
|
-
const data = component.ctx;
|
|
274
|
-
|
|
275
|
-
return data;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
1
|
+
import EventEmitter from 'events';
|
|
2
|
+
import { delay, uid } from '@sre/utils';
|
|
3
|
+
import { AgentRuntime } from '@sre/AgentManager/AgentRuntime.class';
|
|
4
|
+
import { Logger } from '@sre/helpers/Log.helper';
|
|
5
|
+
import { ConnectorService } from '@sre/Core/ConnectorsService';
|
|
6
|
+
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
7
|
+
import { CacheConnector } from './Cache.service/CacheConnector';
|
|
8
|
+
|
|
9
|
+
const console = Logger('RuntimeContext');
|
|
10
|
+
|
|
11
|
+
type TRuntimeData = {
|
|
12
|
+
input?: { [key: string]: any };
|
|
13
|
+
_LoopData?: any;
|
|
14
|
+
_ChildLoopData?: any;
|
|
15
|
+
};
|
|
16
|
+
type TComponentContext = {
|
|
17
|
+
active: boolean;
|
|
18
|
+
name: string;
|
|
19
|
+
runtimeData?: TRuntimeData;
|
|
20
|
+
step: number;
|
|
21
|
+
input?: { [key: string]: any };
|
|
22
|
+
output?: { [key: string]: any };
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export class RuntimeContext extends EventEmitter {
|
|
26
|
+
public circularLimitReached: string | boolean = false;
|
|
27
|
+
public step: number = 0;
|
|
28
|
+
public sessionResult: boolean = false;
|
|
29
|
+
public sessionResults: any;
|
|
30
|
+
public components: { [id: string]: { ctx: TComponentContext } } = {};
|
|
31
|
+
|
|
32
|
+
public checkRuntimeContext: any = null;
|
|
33
|
+
|
|
34
|
+
private ctxFile: string = '';
|
|
35
|
+
private _runtimeFileReady: any;
|
|
36
|
+
private _cacheConnector: CacheConnector;
|
|
37
|
+
|
|
38
|
+
private _readyPromise: Promise<boolean>;
|
|
39
|
+
private _lastCtxLength: number = 0;
|
|
40
|
+
|
|
41
|
+
constructor(private runtime: AgentRuntime) {
|
|
42
|
+
super();
|
|
43
|
+
const agent = runtime.agent;
|
|
44
|
+
|
|
45
|
+
this._cacheConnector = ConnectorService.getCacheConnector();
|
|
46
|
+
|
|
47
|
+
const processRootID = runtime.processID?.split(':')[0] || '';
|
|
48
|
+
const reqId = processRootID == runtime.xDebugId ? '' : '.' + uid() + runtime.reqTag;
|
|
49
|
+
|
|
50
|
+
this.ctxFile = `${runtime.xDebugId}${reqId}${agent.jobID ? `-job-${agent.jobID}` : ''}`;
|
|
51
|
+
|
|
52
|
+
this._readyPromise = new Promise((resolve, reject) => {
|
|
53
|
+
let resolved = false;
|
|
54
|
+
this.on('ready', () => {
|
|
55
|
+
resolved = true;
|
|
56
|
+
resolve(true);
|
|
57
|
+
});
|
|
58
|
+
const timer = setTimeout(() => {
|
|
59
|
+
if (!resolved) {
|
|
60
|
+
reject(new Error('Agent Runtime context initialization timeout'));
|
|
61
|
+
}
|
|
62
|
+
}, 5 * 60 * 1000);
|
|
63
|
+
timer.unref(); //unblock the event loop
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
this.initRuntimeContext();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private serialize() {
|
|
70
|
+
const data = {
|
|
71
|
+
step: this.step,
|
|
72
|
+
sessionResult: this.sessionResult,
|
|
73
|
+
sessionResults: this.sessionResults,
|
|
74
|
+
components: this.components,
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
return data;
|
|
78
|
+
}
|
|
79
|
+
private deserialize(data: any) {
|
|
80
|
+
this.step = data.step;
|
|
81
|
+
this.sessionResult = data.sessionResult;
|
|
82
|
+
this.sessionResults = data.sessionResults;
|
|
83
|
+
this.components = data.components;
|
|
84
|
+
}
|
|
85
|
+
private reset() {
|
|
86
|
+
this.step = 0;
|
|
87
|
+
this.sessionResult = false;
|
|
88
|
+
this.sessionResults = null;
|
|
89
|
+
this.components = {};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private initRuntimeContext() {
|
|
93
|
+
if (this._runtimeFileReady) return;
|
|
94
|
+
|
|
95
|
+
const endpointDBGCall = this.runtime.xDebugId?.startsWith('dbg-'); //weak check for debug session, we need to improve this
|
|
96
|
+
console.debug('Init Agent Context', this.ctxFile, AccessCandidate.agent(this.runtime.agent.id));
|
|
97
|
+
const agent = this.runtime.agent;
|
|
98
|
+
let method = (agent.agentRequest.method || 'POST').toUpperCase();
|
|
99
|
+
const endpoint = agent.endpoints?.[agent.agentRequest.path]?.[method];
|
|
100
|
+
|
|
101
|
+
let ctxData: any = {};
|
|
102
|
+
|
|
103
|
+
this._cacheConnector
|
|
104
|
+
.requester(AccessCandidate.agent(this.runtime.agent.id))
|
|
105
|
+
.get(this.ctxFile)
|
|
106
|
+
.then(async (data) => {
|
|
107
|
+
if (!data) {
|
|
108
|
+
ctxData = JSON.parse(JSON.stringify({ components: agent.components, connections: agent.connections, timestamp: Date.now() }));
|
|
109
|
+
if (!ctxData.step) ctxData.step = 0;
|
|
110
|
+
for (let cptId in ctxData.components) {
|
|
111
|
+
ctxData.components[cptId] = {
|
|
112
|
+
id: cptId,
|
|
113
|
+
name: ctxData.components[cptId].name,
|
|
114
|
+
//dbg: { active: false, name: ctxData.components[cptId].name },
|
|
115
|
+
ctx: { active: false, name: ctxData.components[cptId].name },
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const cpt = ctxData.components[cptId];
|
|
119
|
+
//if this debug session was initiated from an endpoint, we mark the endpoint component as active
|
|
120
|
+
if (endpoint && endpoint.id != undefined && cpt.id == endpoint.id && endpointDBGCall) {
|
|
121
|
+
//cpt.dbg.active = true;
|
|
122
|
+
cpt.ctx.active = true;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
await this._cacheConnector
|
|
127
|
+
.requester(AccessCandidate.agent(this.runtime.agent.id))
|
|
128
|
+
.set(this.ctxFile, JSON.stringify(ctxData), null, null, 1 * 60 * 60); //expires in 1 hour
|
|
129
|
+
} else {
|
|
130
|
+
ctxData = JSON.parse(data);
|
|
131
|
+
if (!ctxData.step) ctxData.step = 0;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
this.deserialize(ctxData);
|
|
135
|
+
this._runtimeFileReady = true;
|
|
136
|
+
this.emit('ready');
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
public async ready() {
|
|
141
|
+
if (this._runtimeFileReady) return true;
|
|
142
|
+
return this._readyPromise;
|
|
143
|
+
}
|
|
144
|
+
private async sync() {
|
|
145
|
+
if (!this.ctxFile) return;
|
|
146
|
+
|
|
147
|
+
this.emit('syncing');
|
|
148
|
+
|
|
149
|
+
const deleteSession = this.runtime.sessionClosed;
|
|
150
|
+
|
|
151
|
+
//TODO : Do we need to cache the context if not in debug mode ?
|
|
152
|
+
|
|
153
|
+
const data = this.serialize();
|
|
154
|
+
//if (data) fs.writeFileSync(this.ctxFile, JSON.stringify(data, null, 2));
|
|
155
|
+
if (data) {
|
|
156
|
+
let serializedData = JSON.stringify(data);
|
|
157
|
+
|
|
158
|
+
if (serializedData.length != this._lastCtxLength) {
|
|
159
|
+
//only log if context has changes
|
|
160
|
+
//We use the length as a weak but fast way to detect changes
|
|
161
|
+
console.debug('Agent Context Size', this.ctxFile, serializedData.length, AccessCandidate.agent(this.runtime.agent.id));
|
|
162
|
+
this._lastCtxLength = serializedData.length;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
await this._cacheConnector
|
|
166
|
+
.requester(AccessCandidate.agent(this.runtime.agent.id))
|
|
167
|
+
.set(this.ctxFile, serializedData, null, null, 3 * 60 * 60); //expires in 3 hours max
|
|
168
|
+
|
|
169
|
+
const mb = serializedData.length / 1024 / 1024;
|
|
170
|
+
const cooldown = (mb / 10) * 1000;
|
|
171
|
+
serializedData = null;
|
|
172
|
+
|
|
173
|
+
await delay(cooldown);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (deleteSession) {
|
|
177
|
+
const exists = await this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).exists(this.ctxFile);
|
|
178
|
+
|
|
179
|
+
if (exists) {
|
|
180
|
+
console.debug('Agent Context Delete', this.ctxFile, AccessCandidate.agent(this.runtime.agent.id));
|
|
181
|
+
if (this.runtime.debug) this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).updateTTL(this.ctxFile, 5 * 60);
|
|
182
|
+
//expires in 5 minute
|
|
183
|
+
else this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).delete(this.ctxFile);
|
|
184
|
+
//if (this.runtime.debug && fs.existsSync(this.ctxFile)) await delay(1000 * 60); //if we're in debug mode, we keep the file for a while to allow final state read
|
|
185
|
+
//if (fs.existsSync(this.ctxFile)) fs.unlinkSync(this.ctxFile);
|
|
186
|
+
this.ctxFile = null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
private _syncQueue = Promise.resolve();
|
|
191
|
+
|
|
192
|
+
public enqueueSync() {
|
|
193
|
+
if (!this.ctxFile) return;
|
|
194
|
+
|
|
195
|
+
this._syncQueue = this._syncQueue
|
|
196
|
+
.then(() => this.sync())
|
|
197
|
+
.catch((err) => {
|
|
198
|
+
console.error('Error syncing context', err);
|
|
199
|
+
}); // avoid unhandled rejections
|
|
200
|
+
}
|
|
201
|
+
public incStep() {
|
|
202
|
+
this.step++;
|
|
203
|
+
//this.sync();
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
public updateComponent(componentId: string, data: any) {
|
|
207
|
+
const ctxData = this;
|
|
208
|
+
if (!ctxData) return;
|
|
209
|
+
const component = ctxData.components[componentId];
|
|
210
|
+
|
|
211
|
+
if (!component) {
|
|
212
|
+
console.debug(
|
|
213
|
+
'>>>>>>> updateComponent Component debug data not found',
|
|
214
|
+
componentId,
|
|
215
|
+
component,
|
|
216
|
+
AccessCandidate.agent(this.runtime.agent.id)
|
|
217
|
+
);
|
|
218
|
+
console.debug('>>> ctxFile', this.ctxFile, AccessCandidate.agent(this.runtime.agent.id));
|
|
219
|
+
console.debug('>>> ctxData', ctxData, AccessCandidate.agent(this.runtime.agent.id));
|
|
220
|
+
}
|
|
221
|
+
//component.ctx = { ...component.ctx, ...data, step: this.step };
|
|
222
|
+
// minimal allocations
|
|
223
|
+
|
|
224
|
+
if (!component.ctx) component.ctx = { active: false, name: '', step: 0 };
|
|
225
|
+
Object.assign(component.ctx, data);
|
|
226
|
+
component.ctx.step = this.step;
|
|
227
|
+
|
|
228
|
+
//if (this.debug) component.dbg = { ...component.dbg, ...data };
|
|
229
|
+
|
|
230
|
+
this.enqueueSync();
|
|
231
|
+
}
|
|
232
|
+
public resetComponent(componentId: string) {
|
|
233
|
+
const ctxData = this;
|
|
234
|
+
const component = ctxData.components[componentId];
|
|
235
|
+
if (!component) {
|
|
236
|
+
console.debug(
|
|
237
|
+
'>>>>>>> resetComponent Component debug data not found',
|
|
238
|
+
componentId,
|
|
239
|
+
component,
|
|
240
|
+
AccessCandidate.agent(this.runtime.agent.id)
|
|
241
|
+
);
|
|
242
|
+
console.debug('>>> ctxFile', this.ctxFile, AccessCandidate.agent(this.runtime.agent.id));
|
|
243
|
+
console.debug('>>> ctxData', ctxData, AccessCandidate.agent(this.runtime.agent.id));
|
|
244
|
+
}
|
|
245
|
+
//component.dbg.active = false;
|
|
246
|
+
//component.dbg.runtimeData = {};
|
|
247
|
+
component.ctx.runtimeData = {};
|
|
248
|
+
component.ctx.active = false;
|
|
249
|
+
if (!this.runtime.debug) {
|
|
250
|
+
//console.debug('NOT in debug mode, clearing context input/output');
|
|
251
|
+
component.ctx.input = undefined;
|
|
252
|
+
component.ctx.output = undefined;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
this.enqueueSync();
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
public getComponentData(componentId: string) {
|
|
259
|
+
const ctxData = this;
|
|
260
|
+
if (!ctxData) return null;
|
|
261
|
+
const component = ctxData.components[componentId];
|
|
262
|
+
if (!component) {
|
|
263
|
+
console.debug(
|
|
264
|
+
'>>>>>>> getComponentData Component debug data not found',
|
|
265
|
+
componentId,
|
|
266
|
+
component,
|
|
267
|
+
AccessCandidate.agent(this.runtime.agent.id)
|
|
268
|
+
);
|
|
269
|
+
console.debug('>>> ctxFile', this.ctxFile, AccessCandidate.agent(this.runtime.agent.id));
|
|
270
|
+
console.debug('>>> ctxData', ctxData, AccessCandidate.agent(this.runtime.agent.id));
|
|
271
|
+
}
|
|
272
|
+
//const data = this.debug ? component.dbg : component.ctx;
|
|
273
|
+
const data = component.ctx;
|
|
274
|
+
|
|
275
|
+
return data;
|
|
276
|
+
}
|
|
277
|
+
}
|