@smythos/sre 1.5.53 → 1.5.54
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 -98
- 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/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 +157 -157
- 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 +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 -138
- 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 +590 -590
- 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 +301 -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,138 +1,138 @@
|
|
|
1
|
-
import Joi from 'joi';
|
|
2
|
-
|
|
3
|
-
import { IAgent as Agent } from '@sre/types/Agent.types';
|
|
4
|
-
import { Conversation } from '@sre/helpers/Conversation.helper';
|
|
5
|
-
import { TemplateString } from '@sre/helpers/TemplateString.helper';
|
|
6
|
-
|
|
7
|
-
import { Component } from './Component.class';
|
|
8
|
-
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
9
|
-
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
|
10
|
-
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
11
|
-
|
|
12
|
-
export class MCPClient extends Component {
|
|
13
|
-
protected configSchema = Joi.object({
|
|
14
|
-
model: Joi.string().optional(),
|
|
15
|
-
openAiModel: Joi.string().optional(), // for backward compatibility
|
|
16
|
-
mcpUrl: Joi.string().max(2048).uri().required().description('URL of the MCP'),
|
|
17
|
-
descForModel: Joi.string().max(5000).required().allow('').label('Description for Model'),
|
|
18
|
-
name: Joi.string().max(500).required().allow(''),
|
|
19
|
-
desc: Joi.string().max(5000).required().allow('').label('Description'),
|
|
20
|
-
logoUrl: Joi.string().max(8192).allow(''),
|
|
21
|
-
id: Joi.string().max(200),
|
|
22
|
-
version: Joi.string().max(100).allow(''),
|
|
23
|
-
domain: Joi.string().max(253).allow(''),
|
|
24
|
-
prompt: Joi.string().max(5000).optional().allow('').label('Prompt'),
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
constructor() {
|
|
28
|
-
super();
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
init() {}
|
|
32
|
-
|
|
33
|
-
async process(input, config, agent: Agent) {
|
|
34
|
-
await super.process(input, config, agent);
|
|
35
|
-
const logger = this.createComponentLogger(agent, config);
|
|
36
|
-
|
|
37
|
-
logger.debug(`=== MCP Client Log ===`);
|
|
38
|
-
|
|
39
|
-
try {
|
|
40
|
-
const mcpUrl = config?.data?.mcpUrl;
|
|
41
|
-
if (!mcpUrl) {
|
|
42
|
-
return { _error: 'Please provide a MCP URL!', _debug: logger.output };
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const model = config?.data?.model || config?.data?.openAiModel;
|
|
46
|
-
const descForModel = TemplateString(config?.data?.descForModel).parse(input).result;
|
|
47
|
-
let prompt = TemplateString(config?.data?.prompt).parse(input).result;
|
|
48
|
-
|
|
49
|
-
if (!prompt) {
|
|
50
|
-
return { _error: 'Please provide a prompt', _debug: logger.output };
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// TODO [Forhad]: Need to check and validate input prompt token
|
|
54
|
-
const { client } = await this.connectMCP(mcpUrl);
|
|
55
|
-
|
|
56
|
-
const toolsData = await client.listTools();
|
|
57
|
-
const conv = new Conversation(
|
|
58
|
-
model,
|
|
59
|
-
{
|
|
60
|
-
openapi: '3.0.1',
|
|
61
|
-
info: {
|
|
62
|
-
title: `${agent?.name}`,
|
|
63
|
-
version: `${agent?.version}`,
|
|
64
|
-
description: descForModel,
|
|
65
|
-
},
|
|
66
|
-
servers: [
|
|
67
|
-
{
|
|
68
|
-
url: agent?.domain,
|
|
69
|
-
},
|
|
70
|
-
],
|
|
71
|
-
paths: {},
|
|
72
|
-
},
|
|
73
|
-
{ agentId: agent?.id },
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
for (const tool of toolsData.tools) {
|
|
77
|
-
let toolArgs = {};
|
|
78
|
-
Object.entries(tool.inputSchema.properties).forEach(([propName, propDetails]) => {
|
|
79
|
-
toolArgs[propName] = {
|
|
80
|
-
description: '',
|
|
81
|
-
required: ((tool.inputSchema.required as string[]) || []).includes(propName) || false,
|
|
82
|
-
type: (propDetails as any).type,
|
|
83
|
-
...((propDetails as any).type === 'array' ? { items: { type: 'string' } } : {}),
|
|
84
|
-
};
|
|
85
|
-
});
|
|
86
|
-
await conv.addTool({
|
|
87
|
-
name: tool.name,
|
|
88
|
-
description: tool.description,
|
|
89
|
-
arguments: toolArgs,
|
|
90
|
-
handler: async (input) => {
|
|
91
|
-
const result = await client.callTool({
|
|
92
|
-
name: tool.name,
|
|
93
|
-
arguments: input,
|
|
94
|
-
});
|
|
95
|
-
return result;
|
|
96
|
-
},
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
const result = await conv.prompt(prompt);
|
|
100
|
-
|
|
101
|
-
logger.debug(`Response:\n`, result, '\n');
|
|
102
|
-
|
|
103
|
-
return { Output: result, _debug: logger.output };
|
|
104
|
-
} catch (error: any) {
|
|
105
|
-
return { _error: `Error on running MCP Client!\n${error?.message || JSON.stringify(error)}`, _debug: logger.output };
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
private async connectMCP(mcpUrl: string) {
|
|
109
|
-
const client = new Client({ name: 'auto-client', version: '1.0.0' });
|
|
110
|
-
|
|
111
|
-
// 1) Try Streamable HTTP first
|
|
112
|
-
try {
|
|
113
|
-
const st = new StreamableHTTPClientTransport(new URL(mcpUrl));
|
|
114
|
-
await client.connect(st);
|
|
115
|
-
console.debug('Connected to MCP using Streamable HTTP');
|
|
116
|
-
return { client, transport: 'streamable' as const };
|
|
117
|
-
} catch (e: any) {
|
|
118
|
-
console.debug('Failed to connect to MCP using Streamable HTTP, falling back to SSE');
|
|
119
|
-
// 2) If clearly unsupported, fall back to SSE
|
|
120
|
-
const msg = String(e?.message || e);
|
|
121
|
-
const isUnsupported =
|
|
122
|
-
/404|405|ENOTFOUND|ECONNREFUSED|CORS/i.test(msg);
|
|
123
|
-
|
|
124
|
-
// 406 means wrong/missing Accept for Streamable → retry Streamable with proper header
|
|
125
|
-
const isAcceptProblem = /406|Not Acceptable|text\/event-stream/i.test(msg);
|
|
126
|
-
if (isAcceptProblem) {
|
|
127
|
-
throw new Error('Server is Streamable; include Accept: application/json, text/event-stream');
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
if (!isUnsupported) throw e;
|
|
131
|
-
|
|
132
|
-
// SSE fallback
|
|
133
|
-
const sse = new SSEClientTransport(new URL(mcpUrl));
|
|
134
|
-
await client.connect(sse);
|
|
135
|
-
return { client, transport: 'sse' as const };
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
1
|
+
import Joi from 'joi';
|
|
2
|
+
|
|
3
|
+
import { IAgent as Agent } from '@sre/types/Agent.types';
|
|
4
|
+
import { Conversation } from '@sre/helpers/Conversation.helper';
|
|
5
|
+
import { TemplateString } from '@sre/helpers/TemplateString.helper';
|
|
6
|
+
|
|
7
|
+
import { Component } from './Component.class';
|
|
8
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
9
|
+
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
|
10
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
11
|
+
|
|
12
|
+
export class MCPClient extends Component {
|
|
13
|
+
protected configSchema = Joi.object({
|
|
14
|
+
model: Joi.string().optional(),
|
|
15
|
+
openAiModel: Joi.string().optional(), // for backward compatibility
|
|
16
|
+
mcpUrl: Joi.string().max(2048).uri().required().description('URL of the MCP'),
|
|
17
|
+
descForModel: Joi.string().max(5000).required().allow('').label('Description for Model'),
|
|
18
|
+
name: Joi.string().max(500).required().allow(''),
|
|
19
|
+
desc: Joi.string().max(5000).required().allow('').label('Description'),
|
|
20
|
+
logoUrl: Joi.string().max(8192).allow(''),
|
|
21
|
+
id: Joi.string().max(200),
|
|
22
|
+
version: Joi.string().max(100).allow(''),
|
|
23
|
+
domain: Joi.string().max(253).allow(''),
|
|
24
|
+
prompt: Joi.string().max(5000).optional().allow('').label('Prompt'),
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
constructor() {
|
|
28
|
+
super();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
init() {}
|
|
32
|
+
|
|
33
|
+
async process(input, config, agent: Agent) {
|
|
34
|
+
await super.process(input, config, agent);
|
|
35
|
+
const logger = this.createComponentLogger(agent, config);
|
|
36
|
+
|
|
37
|
+
logger.debug(`=== MCP Client Log ===`);
|
|
38
|
+
|
|
39
|
+
try {
|
|
40
|
+
const mcpUrl = config?.data?.mcpUrl;
|
|
41
|
+
if (!mcpUrl) {
|
|
42
|
+
return { _error: 'Please provide a MCP URL!', _debug: logger.output };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const model = config?.data?.model || config?.data?.openAiModel;
|
|
46
|
+
const descForModel = TemplateString(config?.data?.descForModel).parse(input).result;
|
|
47
|
+
let prompt = TemplateString(config?.data?.prompt).parse(input).result;
|
|
48
|
+
|
|
49
|
+
if (!prompt) {
|
|
50
|
+
return { _error: 'Please provide a prompt', _debug: logger.output };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// TODO [Forhad]: Need to check and validate input prompt token
|
|
54
|
+
const { client } = await this.connectMCP(mcpUrl);
|
|
55
|
+
|
|
56
|
+
const toolsData = await client.listTools();
|
|
57
|
+
const conv = new Conversation(
|
|
58
|
+
model,
|
|
59
|
+
{
|
|
60
|
+
openapi: '3.0.1',
|
|
61
|
+
info: {
|
|
62
|
+
title: `${agent?.name}`,
|
|
63
|
+
version: `${agent?.version}`,
|
|
64
|
+
description: descForModel,
|
|
65
|
+
},
|
|
66
|
+
servers: [
|
|
67
|
+
{
|
|
68
|
+
url: agent?.domain,
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
paths: {},
|
|
72
|
+
},
|
|
73
|
+
{ agentId: agent?.id },
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
for (const tool of toolsData.tools) {
|
|
77
|
+
let toolArgs = {};
|
|
78
|
+
Object.entries(tool.inputSchema.properties).forEach(([propName, propDetails]) => {
|
|
79
|
+
toolArgs[propName] = {
|
|
80
|
+
description: '',
|
|
81
|
+
required: ((tool.inputSchema.required as string[]) || []).includes(propName) || false,
|
|
82
|
+
type: (propDetails as any).type,
|
|
83
|
+
...((propDetails as any).type === 'array' ? { items: { type: 'string' } } : {}),
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
await conv.addTool({
|
|
87
|
+
name: tool.name,
|
|
88
|
+
description: tool.description,
|
|
89
|
+
arguments: toolArgs,
|
|
90
|
+
handler: async (input) => {
|
|
91
|
+
const result = await client.callTool({
|
|
92
|
+
name: tool.name,
|
|
93
|
+
arguments: input,
|
|
94
|
+
});
|
|
95
|
+
return result;
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
const result = await conv.prompt(prompt);
|
|
100
|
+
|
|
101
|
+
logger.debug(`Response:\n`, result, '\n');
|
|
102
|
+
|
|
103
|
+
return { Output: result, _debug: logger.output };
|
|
104
|
+
} catch (error: any) {
|
|
105
|
+
return { _error: `Error on running MCP Client!\n${error?.message || JSON.stringify(error)}`, _debug: logger.output };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
private async connectMCP(mcpUrl: string) {
|
|
109
|
+
const client = new Client({ name: 'auto-client', version: '1.0.0' });
|
|
110
|
+
|
|
111
|
+
// 1) Try Streamable HTTP first
|
|
112
|
+
try {
|
|
113
|
+
const st = new StreamableHTTPClientTransport(new URL(mcpUrl));
|
|
114
|
+
await client.connect(st);
|
|
115
|
+
console.debug('Connected to MCP using Streamable HTTP');
|
|
116
|
+
return { client, transport: 'streamable' as const };
|
|
117
|
+
} catch (e: any) {
|
|
118
|
+
console.debug('Failed to connect to MCP using Streamable HTTP, falling back to SSE');
|
|
119
|
+
// 2) If clearly unsupported, fall back to SSE
|
|
120
|
+
const msg = String(e?.message || e);
|
|
121
|
+
const isUnsupported =
|
|
122
|
+
/404|405|ENOTFOUND|ECONNREFUSED|CORS/i.test(msg);
|
|
123
|
+
|
|
124
|
+
// 406 means wrong/missing Accept for Streamable → retry Streamable with proper header
|
|
125
|
+
const isAcceptProblem = /406|Not Acceptable|text\/event-stream/i.test(msg);
|
|
126
|
+
if (isAcceptProblem) {
|
|
127
|
+
throw new Error('Server is Streamable; include Accept: application/json, text/event-stream');
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (!isUnsupported) throw e;
|
|
131
|
+
|
|
132
|
+
// SSE fallback
|
|
133
|
+
const sse = new SSEClientTransport(new URL(mcpUrl));
|
|
134
|
+
await client.connect(sse);
|
|
135
|
+
return { client, transport: 'sse' as const };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
import Joi from 'joi';
|
|
2
|
-
|
|
3
|
-
import { IAgent as Agent } from '@sre/types/Agent.types';
|
|
4
|
-
import { Component } from './Component.class';
|
|
5
|
-
import { ConnectorService } from '@sre/Core/ConnectorsService';
|
|
6
|
-
import { TemplateString } from '@sre/helpers/TemplateString.helper';
|
|
7
|
-
import { ICacheRequest } from '@sre/MemoryManager/Cache.service/CacheConnector';
|
|
8
|
-
|
|
9
|
-
export class MemoryDeleteKeyVal extends Component {
|
|
10
|
-
protected configSchema = Joi.object({
|
|
11
|
-
memoryName: Joi.string().max(255).allow('').label('Memory Name'),
|
|
12
|
-
key: Joi.string().max(255).allow('').label('Key'),
|
|
13
|
-
});
|
|
14
|
-
constructor() {
|
|
15
|
-
super();
|
|
16
|
-
}
|
|
17
|
-
init() {}
|
|
18
|
-
async process(input, config, agent: Agent) {
|
|
19
|
-
await super.process(input, config, agent);
|
|
20
|
-
|
|
21
|
-
const logger = this.createComponentLogger(agent, config);
|
|
22
|
-
|
|
23
|
-
try {
|
|
24
|
-
const cacheConnector = ConnectorService.getCacheConnector();
|
|
25
|
-
const connectorRequester: ICacheRequest = cacheConnector.agent(agent.id);
|
|
26
|
-
const teamId = agent.teamId;
|
|
27
|
-
const agentId = agent.id;
|
|
28
|
-
|
|
29
|
-
const memoryName = config.data.memoryName;
|
|
30
|
-
const key = TemplateString(config.data.key).parse(input).result;
|
|
31
|
-
|
|
32
|
-
const sessionId = agent.sessionId;
|
|
33
|
-
const workflowId = agent.agentRuntime.workflowReqId;
|
|
34
|
-
|
|
35
|
-
logger.debug(`Reading Scope Data for deletion`);
|
|
36
|
-
const scopeKeyId = `${agentId}:${memoryName}:${key}_scope`;
|
|
37
|
-
const scopeStrData = await connectorRequester.get(scopeKeyId);
|
|
38
|
-
|
|
39
|
-
if (!scopeStrData) {
|
|
40
|
-
return { _error: 'key not found', _debug: logger.output };
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
logger.debug(`Checking Scope for deletion`);
|
|
44
|
-
const scopeData = JSON.parse(scopeStrData);
|
|
45
|
-
const scopeKey = scopeData.value;
|
|
46
|
-
|
|
47
|
-
// Validate scope access like in MemoryReadKeyVal
|
|
48
|
-
if (scopeData.scope === 'session' && scopeKey !== sessionId) {
|
|
49
|
-
return { _error: 'key not found', _debug: logger.output };
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (scopeData.scope === 'request' && scopeKey !== workflowId) {
|
|
53
|
-
return { _error: 'key not found', _debug: logger.output };
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
logger.debug(`Deleting memory value and scope data`);
|
|
57
|
-
|
|
58
|
-
// Delete the actual value
|
|
59
|
-
const fullKey = `${agentId}:${scopeKey}:${memoryName}:${key}`;
|
|
60
|
-
await connectorRequester.delete(fullKey);
|
|
61
|
-
|
|
62
|
-
// Delete the scope metadata
|
|
63
|
-
await connectorRequester.delete(scopeKeyId);
|
|
64
|
-
|
|
65
|
-
return { Key: key, deleted: true, _debug: logger.output };
|
|
66
|
-
} catch (error: any) {
|
|
67
|
-
return { _error: error.message, _debug: logger.output };
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
1
|
+
import Joi from 'joi';
|
|
2
|
+
|
|
3
|
+
import { IAgent as Agent } from '@sre/types/Agent.types';
|
|
4
|
+
import { Component } from './Component.class';
|
|
5
|
+
import { ConnectorService } from '@sre/Core/ConnectorsService';
|
|
6
|
+
import { TemplateString } from '@sre/helpers/TemplateString.helper';
|
|
7
|
+
import { ICacheRequest } from '@sre/MemoryManager/Cache.service/CacheConnector';
|
|
8
|
+
|
|
9
|
+
export class MemoryDeleteKeyVal extends Component {
|
|
10
|
+
protected configSchema = Joi.object({
|
|
11
|
+
memoryName: Joi.string().max(255).allow('').label('Memory Name'),
|
|
12
|
+
key: Joi.string().max(255).allow('').label('Key'),
|
|
13
|
+
});
|
|
14
|
+
constructor() {
|
|
15
|
+
super();
|
|
16
|
+
}
|
|
17
|
+
init() {}
|
|
18
|
+
async process(input, config, agent: Agent) {
|
|
19
|
+
await super.process(input, config, agent);
|
|
20
|
+
|
|
21
|
+
const logger = this.createComponentLogger(agent, config);
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
const cacheConnector = ConnectorService.getCacheConnector();
|
|
25
|
+
const connectorRequester: ICacheRequest = cacheConnector.agent(agent.id);
|
|
26
|
+
const teamId = agent.teamId;
|
|
27
|
+
const agentId = agent.id;
|
|
28
|
+
|
|
29
|
+
const memoryName = config.data.memoryName;
|
|
30
|
+
const key = TemplateString(config.data.key).parse(input).result;
|
|
31
|
+
|
|
32
|
+
const sessionId = agent.sessionId;
|
|
33
|
+
const workflowId = agent.agentRuntime.workflowReqId;
|
|
34
|
+
|
|
35
|
+
logger.debug(`Reading Scope Data for deletion`);
|
|
36
|
+
const scopeKeyId = `${agentId}:${memoryName}:${key}_scope`;
|
|
37
|
+
const scopeStrData = await connectorRequester.get(scopeKeyId);
|
|
38
|
+
|
|
39
|
+
if (!scopeStrData) {
|
|
40
|
+
return { _error: 'key not found', _debug: logger.output };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
logger.debug(`Checking Scope for deletion`);
|
|
44
|
+
const scopeData = JSON.parse(scopeStrData);
|
|
45
|
+
const scopeKey = scopeData.value;
|
|
46
|
+
|
|
47
|
+
// Validate scope access like in MemoryReadKeyVal
|
|
48
|
+
if (scopeData.scope === 'session' && scopeKey !== sessionId) {
|
|
49
|
+
return { _error: 'key not found', _debug: logger.output };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (scopeData.scope === 'request' && scopeKey !== workflowId) {
|
|
53
|
+
return { _error: 'key not found', _debug: logger.output };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
logger.debug(`Deleting memory value and scope data`);
|
|
57
|
+
|
|
58
|
+
// Delete the actual value
|
|
59
|
+
const fullKey = `${agentId}:${scopeKey}:${memoryName}:${key}`;
|
|
60
|
+
await connectorRequester.delete(fullKey);
|
|
61
|
+
|
|
62
|
+
// Delete the scope metadata
|
|
63
|
+
await connectorRequester.delete(scopeKeyId);
|
|
64
|
+
|
|
65
|
+
return { Key: key, deleted: true, _debug: logger.output };
|
|
66
|
+
} catch (error: any) {
|
|
67
|
+
return { _error: error.message, _debug: logger.output };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
import Joi from 'joi';
|
|
2
|
-
|
|
3
|
-
import { IAgent as Agent } from '@sre/types/Agent.types';
|
|
4
|
-
import { Component } from './Component.class';
|
|
5
|
-
import { ConnectorService } from '@sre/Core/ConnectorsService';
|
|
6
|
-
import { TemplateString } from '@sre/helpers/TemplateString.helper';
|
|
7
|
-
import { ICacheRequest } from '@sre/MemoryManager/Cache.service/CacheConnector';
|
|
8
|
-
|
|
9
|
-
const memory = {};
|
|
10
|
-
export class MemoryReadKeyVal extends Component {
|
|
11
|
-
protected configSchema = Joi.object({
|
|
12
|
-
memoryName: Joi.string().max(255).allow('').label('Memory Name'),
|
|
13
|
-
});
|
|
14
|
-
constructor() {
|
|
15
|
-
super();
|
|
16
|
-
}
|
|
17
|
-
init() {}
|
|
18
|
-
async process(input, config, agent: Agent) {
|
|
19
|
-
await super.process(input, config, agent);
|
|
20
|
-
|
|
21
|
-
const logger = this.createComponentLogger(agent, config);
|
|
22
|
-
|
|
23
|
-
try {
|
|
24
|
-
const cacheConnector = ConnectorService.getCacheConnector();
|
|
25
|
-
const connectorRequester: ICacheRequest = cacheConnector.agent(agent.id);
|
|
26
|
-
const teamId = agent.teamId;
|
|
27
|
-
const agentId = agent.id;
|
|
28
|
-
|
|
29
|
-
const memoryName = config.data.memoryName;
|
|
30
|
-
|
|
31
|
-
const key = input.Key;
|
|
32
|
-
|
|
33
|
-
const sessionId = agent.sessionId;
|
|
34
|
-
const workflowId = agent.agentRuntime.workflowReqId;
|
|
35
|
-
|
|
36
|
-
logger.debug(`Reading Scope Data`);
|
|
37
|
-
const scopeKeyId = `${agentId}:${memoryName}:${key}_scope`;
|
|
38
|
-
const scopeStrData = await connectorRequester.get(scopeKeyId);
|
|
39
|
-
|
|
40
|
-
if (!scopeStrData) {
|
|
41
|
-
return { _error: 'key not found', _debug: logger.output };
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
logger.debug(`Checking Scope`);
|
|
45
|
-
const scopeData = JSON.parse(scopeStrData);
|
|
46
|
-
const scopeKey = scopeData.value;
|
|
47
|
-
if (scopeData.scope === 'session' && scopeKey !== sessionId) {
|
|
48
|
-
return { _error: 'key not found', _debug: logger.output };
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (scopeData.scope === 'request' && scopeKey !== workflowId) {
|
|
52
|
-
return { _error: 'key not found', _debug: logger.output };
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
logger.debug(`Reading Value`);
|
|
56
|
-
|
|
57
|
-
const fullKey = `${agentId}:${scopeKey}:${memoryName}:${key}`;
|
|
58
|
-
|
|
59
|
-
const value = await connectorRequester.get(fullKey);
|
|
60
|
-
|
|
61
|
-
return { Value: value, _debug: logger.output };
|
|
62
|
-
} catch (error: any) {
|
|
63
|
-
return { _error: error.message, _debug: logger.output };
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
1
|
+
import Joi from 'joi';
|
|
2
|
+
|
|
3
|
+
import { IAgent as Agent } from '@sre/types/Agent.types';
|
|
4
|
+
import { Component } from './Component.class';
|
|
5
|
+
import { ConnectorService } from '@sre/Core/ConnectorsService';
|
|
6
|
+
import { TemplateString } from '@sre/helpers/TemplateString.helper';
|
|
7
|
+
import { ICacheRequest } from '@sre/MemoryManager/Cache.service/CacheConnector';
|
|
8
|
+
|
|
9
|
+
const memory = {};
|
|
10
|
+
export class MemoryReadKeyVal extends Component {
|
|
11
|
+
protected configSchema = Joi.object({
|
|
12
|
+
memoryName: Joi.string().max(255).allow('').label('Memory Name'),
|
|
13
|
+
});
|
|
14
|
+
constructor() {
|
|
15
|
+
super();
|
|
16
|
+
}
|
|
17
|
+
init() {}
|
|
18
|
+
async process(input, config, agent: Agent) {
|
|
19
|
+
await super.process(input, config, agent);
|
|
20
|
+
|
|
21
|
+
const logger = this.createComponentLogger(agent, config);
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
const cacheConnector = ConnectorService.getCacheConnector();
|
|
25
|
+
const connectorRequester: ICacheRequest = cacheConnector.agent(agent.id);
|
|
26
|
+
const teamId = agent.teamId;
|
|
27
|
+
const agentId = agent.id;
|
|
28
|
+
|
|
29
|
+
const memoryName = config.data.memoryName;
|
|
30
|
+
|
|
31
|
+
const key = input.Key;
|
|
32
|
+
|
|
33
|
+
const sessionId = agent.sessionId;
|
|
34
|
+
const workflowId = agent.agentRuntime.workflowReqId;
|
|
35
|
+
|
|
36
|
+
logger.debug(`Reading Scope Data`);
|
|
37
|
+
const scopeKeyId = `${agentId}:${memoryName}:${key}_scope`;
|
|
38
|
+
const scopeStrData = await connectorRequester.get(scopeKeyId);
|
|
39
|
+
|
|
40
|
+
if (!scopeStrData) {
|
|
41
|
+
return { _error: 'key not found', _debug: logger.output };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
logger.debug(`Checking Scope`);
|
|
45
|
+
const scopeData = JSON.parse(scopeStrData);
|
|
46
|
+
const scopeKey = scopeData.value;
|
|
47
|
+
if (scopeData.scope === 'session' && scopeKey !== sessionId) {
|
|
48
|
+
return { _error: 'key not found', _debug: logger.output };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (scopeData.scope === 'request' && scopeKey !== workflowId) {
|
|
52
|
+
return { _error: 'key not found', _debug: logger.output };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
logger.debug(`Reading Value`);
|
|
56
|
+
|
|
57
|
+
const fullKey = `${agentId}:${scopeKey}:${memoryName}:${key}`;
|
|
58
|
+
|
|
59
|
+
const value = await connectorRequester.get(fullKey);
|
|
60
|
+
|
|
61
|
+
return { Value: value, _debug: logger.output };
|
|
62
|
+
} catch (error: any) {
|
|
63
|
+
return { _error: error.message, _debug: logger.output };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|