@smythos/sre 1.6.1 → 1.6.8

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.
Files changed (234) hide show
  1. package/CHANGELOG +111 -111
  2. package/LICENSE +18 -18
  3. package/README.md +135 -135
  4. package/dist/index.js +2 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/types/subsystems/LLMManager/ModelsProvider.service/connectors/SmythModelsProvider.class.d.ts +39 -0
  7. package/package.json +1 -1
  8. package/src/Components/APICall/APICall.class.ts +161 -161
  9. package/src/Components/APICall/AccessTokenManager.ts +166 -166
  10. package/src/Components/APICall/ArrayBufferResponse.helper.ts +58 -58
  11. package/src/Components/APICall/OAuth.helper.ts +447 -447
  12. package/src/Components/APICall/mimeTypeCategories.ts +46 -46
  13. package/src/Components/APICall/parseData.ts +167 -167
  14. package/src/Components/APICall/parseHeaders.ts +41 -41
  15. package/src/Components/APICall/parseProxy.ts +68 -68
  16. package/src/Components/APICall/parseUrl.ts +91 -91
  17. package/src/Components/APIEndpoint.class.ts +234 -234
  18. package/src/Components/APIOutput.class.ts +58 -58
  19. package/src/Components/AgentPlugin.class.ts +102 -102
  20. package/src/Components/Async.class.ts +155 -155
  21. package/src/Components/Await.class.ts +90 -90
  22. package/src/Components/Classifier.class.ts +158 -158
  23. package/src/Components/Component.class.ts +147 -147
  24. package/src/Components/ComponentHost.class.ts +38 -38
  25. package/src/Components/DataSourceCleaner.class.ts +92 -92
  26. package/src/Components/DataSourceIndexer.class.ts +181 -181
  27. package/src/Components/DataSourceLookup.class.ts +161 -161
  28. package/src/Components/ECMASandbox.class.ts +72 -72
  29. package/src/Components/FEncDec.class.ts +29 -29
  30. package/src/Components/FHash.class.ts +33 -33
  31. package/src/Components/FSign.class.ts +80 -80
  32. package/src/Components/FSleep.class.ts +25 -25
  33. package/src/Components/FTimestamp.class.ts +66 -66
  34. package/src/Components/FileStore.class.ts +78 -78
  35. package/src/Components/ForEach.class.ts +97 -97
  36. package/src/Components/GPTPlugin.class.ts +70 -70
  37. package/src/Components/GenAILLM.class.ts +586 -586
  38. package/src/Components/HuggingFace.class.ts +313 -313
  39. package/src/Components/Image/imageSettings.config.ts +70 -70
  40. package/src/Components/ImageGenerator.class.ts +483 -483
  41. package/src/Components/JSONFilter.class.ts +54 -54
  42. package/src/Components/LLMAssistant.class.ts +213 -213
  43. package/src/Components/LogicAND.class.ts +28 -28
  44. package/src/Components/LogicAtLeast.class.ts +85 -85
  45. package/src/Components/LogicAtMost.class.ts +86 -86
  46. package/src/Components/LogicOR.class.ts +29 -29
  47. package/src/Components/LogicXOR.class.ts +34 -34
  48. package/src/Components/MCPClient.class.ts +137 -137
  49. package/src/Components/MemoryDeleteKeyVal.class.ts +70 -70
  50. package/src/Components/MemoryReadKeyVal.class.ts +67 -67
  51. package/src/Components/MemoryWriteKeyVal.class.ts +62 -62
  52. package/src/Components/MemoryWriteObject.class.ts +97 -97
  53. package/src/Components/MultimodalLLM.class.ts +128 -128
  54. package/src/Components/OpenAPI.class.ts +72 -72
  55. package/src/Components/PromptGenerator.class.ts +122 -122
  56. package/src/Components/ScrapflyWebScrape.class.ts +183 -183
  57. package/src/Components/ServerlessCode.class.ts +123 -123
  58. package/src/Components/TavilyWebSearch.class.ts +103 -103
  59. package/src/Components/VisionLLM.class.ts +104 -104
  60. package/src/Components/ZapierAction.class.ts +127 -127
  61. package/src/Components/index.ts +97 -97
  62. package/src/Core/AgentProcess.helper.ts +240 -240
  63. package/src/Core/Connector.class.ts +123 -123
  64. package/src/Core/ConnectorsService.ts +197 -197
  65. package/src/Core/DummyConnector.ts +49 -49
  66. package/src/Core/HookService.ts +105 -105
  67. package/src/Core/SmythRuntime.class.ts +241 -241
  68. package/src/Core/SystemEvents.ts +16 -16
  69. package/src/Core/boot.ts +56 -56
  70. package/src/config.ts +15 -15
  71. package/src/constants.ts +126 -126
  72. package/src/data/hugging-face.params.json +579 -579
  73. package/src/helpers/AWSLambdaCode.helper.ts +624 -599
  74. package/src/helpers/BinaryInput.helper.ts +331 -331
  75. package/src/helpers/Conversation.helper.ts +1157 -1157
  76. package/src/helpers/ECMASandbox.helper.ts +64 -64
  77. package/src/helpers/JsonContent.helper.ts +97 -97
  78. package/src/helpers/LocalCache.helper.ts +97 -97
  79. package/src/helpers/Log.helper.ts +274 -274
  80. package/src/helpers/OpenApiParser.helper.ts +150 -150
  81. package/src/helpers/S3Cache.helper.ts +147 -147
  82. package/src/helpers/SmythURI.helper.ts +5 -5
  83. package/src/helpers/Sysconfig.helper.ts +95 -95
  84. package/src/helpers/TemplateString.helper.ts +243 -243
  85. package/src/helpers/TypeChecker.helper.ts +329 -329
  86. package/src/index.ts +198 -198
  87. package/src/index.ts.bak +198 -198
  88. package/src/subsystems/AgentManager/Agent.class.ts +1114 -1114
  89. package/src/subsystems/AgentManager/Agent.helper.ts +3 -3
  90. package/src/subsystems/AgentManager/AgentData.service/AgentDataConnector.ts +230 -230
  91. package/src/subsystems/AgentManager/AgentData.service/connectors/CLIAgentDataConnector.class.ts +66 -66
  92. package/src/subsystems/AgentManager/AgentData.service/connectors/LocalAgentDataConnector.class.ts +145 -145
  93. package/src/subsystems/AgentManager/AgentData.service/connectors/NullAgentData.class.ts +39 -39
  94. package/src/subsystems/AgentManager/AgentData.service/index.ts +18 -18
  95. package/src/subsystems/AgentManager/AgentLogger.class.ts +301 -301
  96. package/src/subsystems/AgentManager/AgentRequest.class.ts +51 -51
  97. package/src/subsystems/AgentManager/AgentRuntime.class.ts +557 -557
  98. package/src/subsystems/AgentManager/AgentSSE.class.ts +101 -101
  99. package/src/subsystems/AgentManager/AgentSettings.class.ts +52 -52
  100. package/src/subsystems/AgentManager/Component.service/ComponentConnector.ts +32 -32
  101. package/src/subsystems/AgentManager/Component.service/connectors/LocalComponentConnector.class.ts +60 -60
  102. package/src/subsystems/AgentManager/Component.service/index.ts +11 -11
  103. package/src/subsystems/AgentManager/EmbodimentSettings.class.ts +47 -47
  104. package/src/subsystems/AgentManager/ForkedAgent.class.ts +154 -154
  105. package/src/subsystems/AgentManager/OSResourceMonitor.ts +77 -77
  106. package/src/subsystems/ComputeManager/Code.service/CodeConnector.ts +98 -98
  107. package/src/subsystems/ComputeManager/Code.service/connectors/AWSLambdaCode.class.ts +171 -172
  108. package/src/subsystems/ComputeManager/Code.service/connectors/ECMASandbox.class.ts +131 -131
  109. package/src/subsystems/ComputeManager/Code.service/index.ts +13 -13
  110. package/src/subsystems/IO/CLI.service/CLIConnector.ts +47 -47
  111. package/src/subsystems/IO/CLI.service/index.ts +9 -9
  112. package/src/subsystems/IO/Log.service/LogConnector.ts +32 -32
  113. package/src/subsystems/IO/Log.service/connectors/ConsoleLog.class.ts +28 -28
  114. package/src/subsystems/IO/Log.service/index.ts +13 -13
  115. package/src/subsystems/IO/NKV.service/NKVConnector.ts +43 -43
  116. package/src/subsystems/IO/NKV.service/connectors/NKVLocalStorage.class.ts +234 -234
  117. package/src/subsystems/IO/NKV.service/connectors/NKVRAM.class.ts +204 -204
  118. package/src/subsystems/IO/NKV.service/connectors/NKVRedis.class.ts +182 -182
  119. package/src/subsystems/IO/NKV.service/index.ts +14 -14
  120. package/src/subsystems/IO/Router.service/RouterConnector.ts +21 -21
  121. package/src/subsystems/IO/Router.service/connectors/ExpressRouter.class.ts +48 -48
  122. package/src/subsystems/IO/Router.service/connectors/NullRouter.class.ts +40 -40
  123. package/src/subsystems/IO/Router.service/index.ts +11 -11
  124. package/src/subsystems/IO/Storage.service/SmythFS.class.ts +488 -488
  125. package/src/subsystems/IO/Storage.service/StorageConnector.ts +66 -66
  126. package/src/subsystems/IO/Storage.service/connectors/LocalStorage.class.ts +327 -327
  127. package/src/subsystems/IO/Storage.service/connectors/S3Storage.class.ts +482 -482
  128. package/src/subsystems/IO/Storage.service/index.ts +13 -13
  129. package/src/subsystems/IO/VectorDB.service/VectorDBConnector.ts +108 -108
  130. package/src/subsystems/IO/VectorDB.service/connectors/MilvusVectorDB.class.ts +465 -465
  131. package/src/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.ts +387 -387
  132. package/src/subsystems/IO/VectorDB.service/connectors/RAMVecrtorDB.class.ts +408 -408
  133. package/src/subsystems/IO/VectorDB.service/embed/BaseEmbedding.ts +107 -107
  134. package/src/subsystems/IO/VectorDB.service/embed/GoogleEmbedding.ts +118 -118
  135. package/src/subsystems/IO/VectorDB.service/embed/OpenAIEmbedding.ts +109 -109
  136. package/src/subsystems/IO/VectorDB.service/embed/index.ts +26 -26
  137. package/src/subsystems/IO/VectorDB.service/index.ts +14 -14
  138. package/src/subsystems/LLMManager/LLM.helper.ts +251 -251
  139. package/src/subsystems/LLMManager/LLM.inference.ts +345 -345
  140. package/src/subsystems/LLMManager/LLM.service/LLMConnector.ts +492 -492
  141. package/src/subsystems/LLMManager/LLM.service/LLMCredentials.helper.ts +171 -171
  142. package/src/subsystems/LLMManager/LLM.service/connectors/Anthropic.class.ts +666 -666
  143. package/src/subsystems/LLMManager/LLM.service/connectors/Bedrock.class.ts +407 -407
  144. package/src/subsystems/LLMManager/LLM.service/connectors/Echo.class.ts +92 -92
  145. package/src/subsystems/LLMManager/LLM.service/connectors/GoogleAI.class.ts +983 -983
  146. package/src/subsystems/LLMManager/LLM.service/connectors/Groq.class.ts +319 -319
  147. package/src/subsystems/LLMManager/LLM.service/connectors/Ollama.class.ts +361 -361
  148. package/src/subsystems/LLMManager/LLM.service/connectors/Perplexity.class.ts +257 -257
  149. package/src/subsystems/LLMManager/LLM.service/connectors/VertexAI.class.ts +430 -430
  150. package/src/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.ts +503 -503
  151. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ChatCompletionsApiInterface.ts +524 -524
  152. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterface.ts +100 -100
  153. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterfaceFactory.ts +81 -81
  154. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ResponsesApiInterface.ts +1145 -1145
  155. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/constants.ts +13 -13
  156. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/index.ts +4 -4
  157. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/utils.ts +11 -11
  158. package/src/subsystems/LLMManager/LLM.service/connectors/openai/types.ts +32 -32
  159. package/src/subsystems/LLMManager/LLM.service/connectors/xAI.class.ts +478 -478
  160. package/src/subsystems/LLMManager/LLM.service/index.ts +47 -47
  161. package/src/subsystems/LLMManager/ModelsProvider.service/ModelsProviderConnector.ts +303 -303
  162. package/src/subsystems/LLMManager/ModelsProvider.service/connectors/JSONModelsProvider.class.ts +271 -271
  163. package/src/subsystems/LLMManager/ModelsProvider.service/index.ts +11 -11
  164. package/src/subsystems/LLMManager/custom-models.ts +854 -854
  165. package/src/subsystems/LLMManager/models.ts +2540 -2540
  166. package/src/subsystems/LLMManager/paramMappings.ts +69 -69
  167. package/src/subsystems/MemoryManager/Cache.service/CacheConnector.ts +86 -86
  168. package/src/subsystems/MemoryManager/Cache.service/connectors/LocalStorageCache.class.ts +297 -297
  169. package/src/subsystems/MemoryManager/Cache.service/connectors/RAMCache.class.ts +214 -214
  170. package/src/subsystems/MemoryManager/Cache.service/connectors/RedisCache.class.ts +252 -252
  171. package/src/subsystems/MemoryManager/Cache.service/connectors/S3Cache.class.ts +373 -373
  172. package/src/subsystems/MemoryManager/Cache.service/index.ts +15 -15
  173. package/src/subsystems/MemoryManager/LLMCache.ts +72 -72
  174. package/src/subsystems/MemoryManager/LLMContext.ts +124 -124
  175. package/src/subsystems/MemoryManager/LLMMemory.service/LLMMemoryConnector.ts +26 -26
  176. package/src/subsystems/MemoryManager/RuntimeContext.ts +277 -277
  177. package/src/subsystems/Security/AccessControl/ACL.class.ts +208 -208
  178. package/src/subsystems/Security/AccessControl/AccessCandidate.class.ts +82 -82
  179. package/src/subsystems/Security/AccessControl/AccessRequest.class.ts +52 -52
  180. package/src/subsystems/Security/Account.service/AccountConnector.ts +44 -44
  181. package/src/subsystems/Security/Account.service/connectors/DummyAccount.class.ts +130 -130
  182. package/src/subsystems/Security/Account.service/connectors/JSONFileAccount.class.ts +170 -170
  183. package/src/subsystems/Security/Account.service/connectors/MySQLAccount.class.ts +76 -76
  184. package/src/subsystems/Security/Account.service/index.ts +14 -14
  185. package/src/subsystems/Security/Credentials.helper.ts +62 -62
  186. package/src/subsystems/Security/ManagedVault.service/ManagedVaultConnector.ts +38 -38
  187. package/src/subsystems/Security/ManagedVault.service/connectors/NullManagedVault.class.ts +53 -53
  188. package/src/subsystems/Security/ManagedVault.service/connectors/SecretManagerManagedVault.ts +154 -154
  189. package/src/subsystems/Security/ManagedVault.service/index.ts +12 -12
  190. package/src/subsystems/Security/SecureConnector.class.ts +110 -110
  191. package/src/subsystems/Security/Vault.service/Vault.helper.ts +30 -30
  192. package/src/subsystems/Security/Vault.service/VaultConnector.ts +29 -29
  193. package/src/subsystems/Security/Vault.service/connectors/HashicorpVault.class.ts +46 -46
  194. package/src/subsystems/Security/Vault.service/connectors/JSONFileVault.class.ts +221 -221
  195. package/src/subsystems/Security/Vault.service/connectors/NullVault.class.ts +54 -54
  196. package/src/subsystems/Security/Vault.service/connectors/SecretsManager.class.ts +140 -140
  197. package/src/subsystems/Security/Vault.service/index.ts +12 -12
  198. package/src/types/ACL.types.ts +104 -104
  199. package/src/types/AWS.types.ts +10 -10
  200. package/src/types/Agent.types.ts +61 -61
  201. package/src/types/AgentLogger.types.ts +17 -17
  202. package/src/types/Cache.types.ts +1 -1
  203. package/src/types/Common.types.ts +2 -2
  204. package/src/types/LLM.types.ts +520 -520
  205. package/src/types/Redis.types.ts +8 -8
  206. package/src/types/SRE.types.ts +64 -64
  207. package/src/types/Security.types.ts +14 -14
  208. package/src/types/Storage.types.ts +5 -5
  209. package/src/types/VectorDB.types.ts +86 -86
  210. package/src/utils/base64.utils.ts +275 -275
  211. package/src/utils/cli.utils.ts +68 -68
  212. package/src/utils/data.utils.ts +322 -322
  213. package/src/utils/date-time.utils.ts +22 -22
  214. package/src/utils/general.utils.ts +238 -238
  215. package/src/utils/index.ts +12 -12
  216. package/src/utils/lazy-client.ts +261 -261
  217. package/src/utils/numbers.utils.ts +13 -13
  218. package/src/utils/oauth.utils.ts +35 -35
  219. package/src/utils/string.utils.ts +414 -414
  220. package/src/utils/url.utils.ts +19 -19
  221. package/src/utils/validation.utils.ts +74 -74
  222. package/dist/bundle-analysis-lazy.html +0 -4949
  223. package/dist/bundle-analysis.html +0 -4949
  224. package/dist/types/Components/Triggers/GmailTrigger.class.d.ts +0 -13
  225. package/dist/types/Components/Triggers/Trigger.class.d.ts +0 -3
  226. package/dist/types/helpers/AIPerformanceAnalyzer.helper.d.ts +0 -45
  227. package/dist/types/helpers/AIPerformanceCollector.helper.d.ts +0 -111
  228. package/dist/types/subsystems/IO/Storage.service/connectors/AzureBlobStorage.class.d.ts +0 -211
  229. package/dist/types/subsystems/IO/VectorDB.service/connectors/WeaviateVectorDB.class.d.ts +0 -187
  230. package/dist/types/subsystems/PerformanceManager/Performance.service/PerformanceConnector.d.ts +0 -102
  231. package/dist/types/subsystems/PerformanceManager/Performance.service/connectors/LocalPerformanceConnector.class.d.ts +0 -100
  232. package/dist/types/subsystems/PerformanceManager/Performance.service/index.d.ts +0 -22
  233. package/dist/types/types/Performance.types.d.ts +0 -468
  234. package/dist/types/utils/package-manager.utils.d.ts +0 -26
@@ -1,91 +1,91 @@
1
- import { Agent } from '@sre/AgentManager/Agent.class';
2
- import { TemplateString } from '@sre/helpers/TemplateString.helper';
3
- import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
4
- import { SmythFS } from '@sre/IO/Storage.service/SmythFS.class';
5
-
6
- function decodeUriParts(url: string): string {
7
- try {
8
- const urlObj = new URL(url);
9
- urlObj.pathname = decodeURIComponent(urlObj.pathname);
10
-
11
- // Handle search params individually
12
- const searchParams = new URLSearchParams(urlObj.search);
13
- for (const [key, value] of searchParams.entries()) {
14
- try {
15
- const decodedKey = decodeURIComponent(key);
16
- const decodedValue = decodeURIComponent(value);
17
- searchParams.delete(key);
18
- searchParams.append(decodedKey, decodedValue);
19
- } catch (paramError) {
20
- console.warn(`Failed to decode search parameter: ${key}=${value}`, paramError);
21
- // Keep the original key-value pair
22
- }
23
- }
24
- urlObj.search = searchParams.toString();
25
-
26
- urlObj.hash = decodeURIComponent(urlObj.hash);
27
- return urlObj.toString();
28
- } catch (error) {
29
- console.warn('Failed to decode URL parts, proceeding with original value:', error);
30
- return url;
31
- }
32
- }
33
-
34
- export async function parseUrl(input, config, agent: Agent) {
35
- const teamId = agent ? agent.teamId : null;
36
- const templateSettings = config?.template?.settings || {};
37
-
38
- let url = config?.data?.url.replace(/\+/g, '%20'); // replace + with %20 from query params to make it a valid url
39
-
40
- // Decode URL parts
41
- //url = decodeURIComponent(url);
42
-
43
- //parse component template vars
44
- if (config.data._templateVars && templateSettings) {
45
- url = await TemplateString(url).parseComponentTemplateVarsAsync(templateSettings).asyncResult; // replaces component template vars with their IDs (this turns the string parses into an async parser) // replaces IDs with actual values then returns parser promise
46
-
47
- url = await TemplateString(url).parse(config.data._templateVars).result;
48
- }
49
-
50
- //parse vault keys
51
- url = await TemplateString(url).parseTeamKeysAsync(teamId).asyncResult;
52
-
53
- //parse input variables and clean up the remaining unparsed values
54
- url = TemplateString(url).parse(input).clean().result;
55
-
56
- // Decode URL parts again after all parsing is done
57
- //url = decodeURIComponent(url); //This seems to be causing issues with some variables being encoded while they should not be
58
-
59
- //URL will take care of encoding the url properly
60
- const urlObj = new URL(url);
61
-
62
- //urlObj.href will return the encoded url
63
- return urlObj.href;
64
- }
65
-
66
- export async function parseSmythFsUrl(url: string, agent: Agent) {
67
- const urlObj = new URL(url);
68
- const searchParams = urlObj.searchParams;
69
- const publicUrls: string[] = [];
70
-
71
- for (const [key, value] of searchParams.entries()) {
72
- if (value.startsWith('smythfs://')) {
73
- const pubUrl = await SmythFS.Instance.genTempUrl(value, AccessCandidate.agent(agent.id));
74
- publicUrls.push(pubUrl);
75
- searchParams.set(key, pubUrl);
76
- }
77
- }
78
-
79
- return { url: urlObj.href, publicUrls };
80
- }
81
-
82
- export async function destroyPublicUrls(publicUrls: string[]): Promise<boolean> {
83
- try {
84
- await Promise.all(publicUrls.map((url) => SmythFS.Instance.destroyTempUrl(url)));
85
- console.log('Successfully cleaned up all temp urls for API Call Component');
86
- } catch (error) {
87
- console.warn('Failed to clean up temp urls for API Call Component:', error);
88
- }
89
-
90
- return true;
91
- }
1
+ import { Agent } from '@sre/AgentManager/Agent.class';
2
+ import { TemplateString } from '@sre/helpers/TemplateString.helper';
3
+ import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
4
+ import { SmythFS } from '@sre/IO/Storage.service/SmythFS.class';
5
+
6
+ function decodeUriParts(url: string): string {
7
+ try {
8
+ const urlObj = new URL(url);
9
+ urlObj.pathname = decodeURIComponent(urlObj.pathname);
10
+
11
+ // Handle search params individually
12
+ const searchParams = new URLSearchParams(urlObj.search);
13
+ for (const [key, value] of searchParams.entries()) {
14
+ try {
15
+ const decodedKey = decodeURIComponent(key);
16
+ const decodedValue = decodeURIComponent(value);
17
+ searchParams.delete(key);
18
+ searchParams.append(decodedKey, decodedValue);
19
+ } catch (paramError) {
20
+ console.warn(`Failed to decode search parameter: ${key}=${value}`, paramError);
21
+ // Keep the original key-value pair
22
+ }
23
+ }
24
+ urlObj.search = searchParams.toString();
25
+
26
+ urlObj.hash = decodeURIComponent(urlObj.hash);
27
+ return urlObj.toString();
28
+ } catch (error) {
29
+ console.warn('Failed to decode URL parts, proceeding with original value:', error);
30
+ return url;
31
+ }
32
+ }
33
+
34
+ export async function parseUrl(input, config, agent: Agent) {
35
+ const teamId = agent ? agent.teamId : null;
36
+ const templateSettings = config?.template?.settings || {};
37
+
38
+ let url = config?.data?.url.replace(/\+/g, '%20'); // replace + with %20 from query params to make it a valid url
39
+
40
+ // Decode URL parts
41
+ //url = decodeURIComponent(url);
42
+
43
+ //parse component template vars
44
+ if (config.data._templateVars && templateSettings) {
45
+ url = await TemplateString(url).parseComponentTemplateVarsAsync(templateSettings).asyncResult; // replaces component template vars with their IDs (this turns the string parses into an async parser) // replaces IDs with actual values then returns parser promise
46
+
47
+ url = await TemplateString(url).parse(config.data._templateVars).result;
48
+ }
49
+
50
+ //parse vault keys
51
+ url = await TemplateString(url).parseTeamKeysAsync(teamId).asyncResult;
52
+
53
+ //parse input variables and clean up the remaining unparsed values
54
+ url = TemplateString(url).parse(input).clean().result;
55
+
56
+ // Decode URL parts again after all parsing is done
57
+ //url = decodeURIComponent(url); //This seems to be causing issues with some variables being encoded while they should not be
58
+
59
+ //URL will take care of encoding the url properly
60
+ const urlObj = new URL(url);
61
+
62
+ //urlObj.href will return the encoded url
63
+ return urlObj.href;
64
+ }
65
+
66
+ export async function parseSmythFsUrl(url: string, agent: Agent) {
67
+ const urlObj = new URL(url);
68
+ const searchParams = urlObj.searchParams;
69
+ const publicUrls: string[] = [];
70
+
71
+ for (const [key, value] of searchParams.entries()) {
72
+ if (value.startsWith('smythfs://')) {
73
+ const pubUrl = await SmythFS.Instance.genTempUrl(value, AccessCandidate.agent(agent.id));
74
+ publicUrls.push(pubUrl);
75
+ searchParams.set(key, pubUrl);
76
+ }
77
+ }
78
+
79
+ return { url: urlObj.href, publicUrls };
80
+ }
81
+
82
+ export async function destroyPublicUrls(publicUrls: string[]): Promise<boolean> {
83
+ try {
84
+ await Promise.all(publicUrls.map((url) => SmythFS.Instance.destroyTempUrl(url)));
85
+ console.log('Successfully cleaned up all temp urls for API Call Component');
86
+ } catch (error) {
87
+ console.warn('Failed to clean up temp urls for API Call Component:', error);
88
+ }
89
+
90
+ return true;
91
+ }
@@ -1,234 +1,234 @@
1
- import Joi from 'joi';
2
-
3
- import { IAgent as Agent } from '@sre/types/Agent.types';
4
- import { Component } from './Component.class';
5
-
6
- import { jsonrepair } from 'jsonrepair';
7
- import { AgentRequest } from '@sre/AgentManager/AgentRequest.class';
8
- import { performTypeInference } from '@sre/helpers/TypeChecker.helper';
9
- import { BinaryInput } from '@sre/helpers/BinaryInput.helper';
10
- import { uid } from '../utils';
11
- import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
12
- import { TemplateString } from '@sre/helpers/TemplateString.helper';
13
-
14
- // Utility function to check for empty values
15
- function isEmpty(value: any): boolean {
16
- return (
17
- value === undefined ||
18
- value === null ||
19
- (typeof value === 'string' && value.trim() === '') ||
20
- (Array.isArray(value) && value.length === 0) ||
21
- (typeof value === 'object' && value !== null && Object.keys(value).length === 0)
22
- );
23
- }
24
- function isTemplateVar(str: string = ''): boolean {
25
- if (!str || typeof str !== 'string') return false;
26
- return (str?.match(/{{(.*?)}}/g) ?? []).length > 0;
27
- }
28
- function isKeyTemplateVar(str: string = ''): boolean {
29
- if (!str || typeof str !== 'string') return false;
30
- return (str?.match(/{{KEY\((.*?)\)}}/g) ?? []).length > 0;
31
- }
32
-
33
- function parseKey(str: string = '', teamId: string): string {
34
- return str.replace(/{{KEY\((.*?)\)}}/g, (match, key) => {
35
- return key === 'teamid' ? teamId : '';
36
- });
37
- }
38
-
39
- export class APIEndpoint extends Component {
40
- protected configSchema = Joi.object({
41
- endpoint: Joi.string()
42
- .pattern(/^[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*$/)
43
- .max(50)
44
- .required(),
45
- method: Joi.string().valid('POST', 'GET').allow(''), //we're accepting empty value because we consider it POST by default.
46
- description: Joi.string().max(5000).allow(''),
47
- summary: Joi.string().max(1000).allow(''),
48
- doc: Joi.string().max(1000).allow(''),
49
- ai_exposed: Joi.boolean().default(true),
50
- advancedModeEnabled: Joi.boolean().optional(),
51
- endpointLabel: Joi.string().max(100).allow('').optional(),
52
- });
53
- constructor() {
54
- super();
55
- }
56
- init() {}
57
- async process(input, config, agent: Agent) {
58
- await super.process(input, config, agent);
59
-
60
- const req: AgentRequest = agent.agentRequest;
61
- const logger = this.createComponentLogger(agent, config);
62
-
63
- const headers = req ? req.headers : {};
64
- let body = req ? req.body : input; //handle debugger injection
65
- const params = req ? req.params : {};
66
- let query = req ? req.query : {};
67
- const _authInfo = req ? req._agent_authinfo : undefined;
68
-
69
- // parse template variables
70
- for (const [key, value] of Object.entries(body)) {
71
- if (isKeyTemplateVar(value as string)) {
72
- body[key] = await parseKey(value as string, agent?.teamId);
73
- } else if (isTemplateVar(value as string)) {
74
- //body[key] = parseTemplate(value as string, input, { escapeString: false });
75
- body[key] = TemplateString(value as string).parse(input).result;
76
- }
77
- }
78
-
79
- for (const [key, value] of Object.entries(query)) {
80
- if (isKeyTemplateVar(value as string)) {
81
- query[key] = await parseKey(value as string, agent?.teamId);
82
- } else if (isTemplateVar(value as string)) {
83
- //query[key] = parseTemplate(value as string, input, { escapeString: false });
84
- query[key] = TemplateString(value as string).parse(input).result;
85
- }
86
- }
87
-
88
- // set default value and agent variables
89
- const inputsWithDefaultValue = config.inputs.filter(
90
- (input) => input.defaultVal !== undefined && input.defaultVal !== '' && input.defaultVal !== null,
91
- );
92
-
93
- const bodyInputNames: string[] = [];
94
- const queryInputNames: string[] = [];
95
-
96
- for (const output of config.outputs) {
97
- const outputName = output?.expression || output?.name;
98
- const inputName = outputName?.split('.')[1];
99
-
100
- if (inputName) {
101
- if (outputName?.includes('body')) {
102
- bodyInputNames.push(inputName);
103
- }
104
-
105
- if (outputName?.includes('query')) {
106
- queryInputNames.push(inputName);
107
- }
108
- }
109
- }
110
-
111
- for (const _inputWithDefaultValue of inputsWithDefaultValue) {
112
- const inputName = _inputWithDefaultValue?.name;
113
-
114
- let inputValue = input[inputName];
115
-
116
- // We provide a default value for the OpenAPI Schema, which can detected by Anthropic. So we need to check if the default value is an Agent Variable. This is necessary for interactions with the Chatbot.
117
-
118
- if (bodyInputNames.includes(inputName) && isEmpty(body[inputName])) {
119
- body[inputName] = inputValue;
120
- }
121
-
122
- if (queryInputNames.includes(inputName) && isEmpty(query[inputName])) {
123
- query[inputName] = inputValue;
124
- }
125
- }
126
-
127
- //override debugger injection
128
- // if (agent.agentRuntime.debug && body?.[0]?.dbg) { // ! 'dbg' is DEPRECATED
129
- const isDbgInjection = req.header('X-Debug-Inj') !== undefined;
130
- if (isDbgInjection && agent.agentRuntime.debug && Object.values(input).length > 0) {
131
- switch (config.data.method) {
132
- case 'GET':
133
- for (const [key, value] of Object.entries(input)) {
134
- if (value instanceof BinaryInput) {
135
- logger.debug('[WARNING] Binary files are not supported for GET requests. Key:', key);
136
- } else {
137
- query[key] = value as string;
138
- }
139
- }
140
- break;
141
- case 'POST':
142
- default:
143
- body = input;
144
- break;
145
- }
146
- //body = input;
147
- }
148
-
149
- // ensure strong data type
150
- body = await performTypeInference(body, config.inputs, agent);
151
- query = await performTypeInference(query, config.inputs, agent);
152
-
153
- logger.debug('Parsing inputs');
154
- logger.debug(' Headers', headers);
155
- logger.debug(' Body', body);
156
- logger.debug(' Params', params);
157
- logger.debug(' Query', query);
158
-
159
- //Handle JSON Data
160
- //FIXME : this is a workaround that parses any json string in the body, we should only parse the json string in the body if the data type is explicitely set to JSON
161
- //TODO : Add data types to APIEndpoint inputs
162
- logger.debug('Parsing body json input');
163
- for (let key in body) {
164
- const value = body[key];
165
- if (typeof value === 'string' && value.trim().startsWith('{') && value.trim().endsWith('}')) {
166
- try {
167
- const obj = JSON.parse(jsonrepair(body[key]));
168
- body[key] = obj;
169
- } catch {
170
- //skip it if it's not a valid json
171
- }
172
- }
173
- }
174
- logger.debug('Parsed body json input', body);
175
-
176
- logger.debug('Parsing query json input');
177
- for (let key in query) {
178
- const value = query[key];
179
- if (typeof value === 'string' && value.trim().startsWith('{') && value.trim().endsWith('}')) {
180
- try {
181
- const obj = JSON.parse(jsonrepair(query[key] as string));
182
- query[key] = obj;
183
- } catch {
184
- //skip it if it's not a valid json
185
- }
186
- }
187
- }
188
- logger.debug('Parsed query json input', query);
189
-
190
- //Handle binary data
191
- for (let input of config.inputs) {
192
- if (!input.isFile && !['image', 'audio', 'video', 'binary'].includes(input?.type?.toLowerCase())) continue;
193
-
194
- const fieldname = input.name;
195
-
196
- logger.debug('Parsing file input ', fieldname);
197
-
198
- let binaryInputs = body[fieldname];
199
-
200
- // Ensure we're working with an array
201
- if (!Array.isArray(binaryInputs)) {
202
- binaryInputs = [binaryInputs];
203
- }
204
-
205
- // Process each binary input
206
- const processedInputs = await Promise.all(
207
- binaryInputs.map(async (binaryInput) => {
208
- if (!(binaryInput instanceof BinaryInput)) {
209
- // * when data sent with 'multipart/form-data' content type, we expect the files to be in req.files
210
- if (req.files?.length > 0) {
211
- const file = req.files.find((file) => file.fieldname === fieldname);
212
- if (!file) return null;
213
- binaryInput = new BinaryInput(file.buffer, uid() + '-' + file.originalname, file.mimetype);
214
- }
215
- }
216
-
217
- if (binaryInput instanceof BinaryInput) {
218
- return await binaryInput.getJsonData(AccessCandidate.agent(agent.id));
219
- }
220
- return null;
221
- }),
222
- );
223
-
224
- // Filter out null values and handle single/multiple results
225
- const validResults = processedInputs.filter((result) => result !== null);
226
- if (validResults.length > 0) {
227
- body[fieldname] = validResults.length === 1 ? validResults[0] : validResults;
228
- }
229
- //console.log('file', fieldname, body[fieldname]);
230
- }
231
-
232
- return { headers, body, query, params, _authInfo, _debug: logger.output };
233
- }
234
- }
1
+ import Joi from 'joi';
2
+
3
+ import { IAgent as Agent } from '@sre/types/Agent.types';
4
+ import { Component } from './Component.class';
5
+
6
+ import { jsonrepair } from 'jsonrepair';
7
+ import { AgentRequest } from '@sre/AgentManager/AgentRequest.class';
8
+ import { performTypeInference } from '@sre/helpers/TypeChecker.helper';
9
+ import { BinaryInput } from '@sre/helpers/BinaryInput.helper';
10
+ import { uid } from '../utils';
11
+ import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
12
+ import { TemplateString } from '@sre/helpers/TemplateString.helper';
13
+
14
+ // Utility function to check for empty values
15
+ function isEmpty(value: any): boolean {
16
+ return (
17
+ value === undefined ||
18
+ value === null ||
19
+ (typeof value === 'string' && value.trim() === '') ||
20
+ (Array.isArray(value) && value.length === 0) ||
21
+ (typeof value === 'object' && value !== null && Object.keys(value).length === 0)
22
+ );
23
+ }
24
+ function isTemplateVar(str: string = ''): boolean {
25
+ if (!str || typeof str !== 'string') return false;
26
+ return (str?.match(/{{(.*?)}}/g) ?? []).length > 0;
27
+ }
28
+ function isKeyTemplateVar(str: string = ''): boolean {
29
+ if (!str || typeof str !== 'string') return false;
30
+ return (str?.match(/{{KEY\((.*?)\)}}/g) ?? []).length > 0;
31
+ }
32
+
33
+ function parseKey(str: string = '', teamId: string): string {
34
+ return str.replace(/{{KEY\((.*?)\)}}/g, (match, key) => {
35
+ return key === 'teamid' ? teamId : '';
36
+ });
37
+ }
38
+
39
+ export class APIEndpoint extends Component {
40
+ protected configSchema = Joi.object({
41
+ endpoint: Joi.string()
42
+ .pattern(/^[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*$/)
43
+ .max(50)
44
+ .required(),
45
+ method: Joi.string().valid('POST', 'GET').allow(''), //we're accepting empty value because we consider it POST by default.
46
+ description: Joi.string().max(5000).allow(''),
47
+ summary: Joi.string().max(1000).allow(''),
48
+ doc: Joi.string().max(1000).allow(''),
49
+ ai_exposed: Joi.boolean().default(true),
50
+ advancedModeEnabled: Joi.boolean().optional(),
51
+ endpointLabel: Joi.string().max(100).allow('').optional(),
52
+ });
53
+ constructor() {
54
+ super();
55
+ }
56
+ init() {}
57
+ async process(input, config, agent: Agent) {
58
+ await super.process(input, config, agent);
59
+
60
+ const req: AgentRequest = agent.agentRequest;
61
+ const logger = this.createComponentLogger(agent, config);
62
+
63
+ const headers = req ? req.headers : {};
64
+ let body = req ? req.body : input; //handle debugger injection
65
+ const params = req ? req.params : {};
66
+ let query = req ? req.query : {};
67
+ const _authInfo = req ? req._agent_authinfo : undefined;
68
+
69
+ // parse template variables
70
+ for (const [key, value] of Object.entries(body)) {
71
+ if (isKeyTemplateVar(value as string)) {
72
+ body[key] = await parseKey(value as string, agent?.teamId);
73
+ } else if (isTemplateVar(value as string)) {
74
+ //body[key] = parseTemplate(value as string, input, { escapeString: false });
75
+ body[key] = TemplateString(value as string).parse(input).result;
76
+ }
77
+ }
78
+
79
+ for (const [key, value] of Object.entries(query)) {
80
+ if (isKeyTemplateVar(value as string)) {
81
+ query[key] = await parseKey(value as string, agent?.teamId);
82
+ } else if (isTemplateVar(value as string)) {
83
+ //query[key] = parseTemplate(value as string, input, { escapeString: false });
84
+ query[key] = TemplateString(value as string).parse(input).result;
85
+ }
86
+ }
87
+
88
+ // set default value and agent variables
89
+ const inputsWithDefaultValue = config.inputs.filter(
90
+ (input) => input.defaultVal !== undefined && input.defaultVal !== '' && input.defaultVal !== null,
91
+ );
92
+
93
+ const bodyInputNames: string[] = [];
94
+ const queryInputNames: string[] = [];
95
+
96
+ for (const output of config.outputs) {
97
+ const outputName = output?.expression || output?.name;
98
+ const inputName = outputName?.split('.')[1];
99
+
100
+ if (inputName) {
101
+ if (outputName?.includes('body')) {
102
+ bodyInputNames.push(inputName);
103
+ }
104
+
105
+ if (outputName?.includes('query')) {
106
+ queryInputNames.push(inputName);
107
+ }
108
+ }
109
+ }
110
+
111
+ for (const _inputWithDefaultValue of inputsWithDefaultValue) {
112
+ const inputName = _inputWithDefaultValue?.name;
113
+
114
+ let inputValue = input[inputName];
115
+
116
+ // We provide a default value for the OpenAPI Schema, which can detected by Anthropic. So we need to check if the default value is an Agent Variable. This is necessary for interactions with the Chatbot.
117
+
118
+ if (bodyInputNames.includes(inputName) && isEmpty(body[inputName])) {
119
+ body[inputName] = inputValue;
120
+ }
121
+
122
+ if (queryInputNames.includes(inputName) && isEmpty(query[inputName])) {
123
+ query[inputName] = inputValue;
124
+ }
125
+ }
126
+
127
+ //override debugger injection
128
+ // if (agent.agentRuntime.debug && body?.[0]?.dbg) { // ! 'dbg' is DEPRECATED
129
+ const isDbgInjection = req.header('X-Debug-Inj') !== undefined;
130
+ if (isDbgInjection && agent.agentRuntime.debug && Object.values(input).length > 0) {
131
+ switch (config.data.method) {
132
+ case 'GET':
133
+ for (const [key, value] of Object.entries(input)) {
134
+ if (value instanceof BinaryInput) {
135
+ logger.debug('[WARNING] Binary files are not supported for GET requests. Key:', key);
136
+ } else {
137
+ query[key] = value as string;
138
+ }
139
+ }
140
+ break;
141
+ case 'POST':
142
+ default:
143
+ body = input;
144
+ break;
145
+ }
146
+ //body = input;
147
+ }
148
+
149
+ // ensure strong data type
150
+ body = await performTypeInference(body, config.inputs, agent);
151
+ query = await performTypeInference(query, config.inputs, agent);
152
+
153
+ logger.debug('Parsing inputs');
154
+ logger.debug(' Headers', headers);
155
+ logger.debug(' Body', body);
156
+ logger.debug(' Params', params);
157
+ logger.debug(' Query', query);
158
+
159
+ //Handle JSON Data
160
+ //FIXME : this is a workaround that parses any json string in the body, we should only parse the json string in the body if the data type is explicitely set to JSON
161
+ //TODO : Add data types to APIEndpoint inputs
162
+ logger.debug('Parsing body json input');
163
+ for (let key in body) {
164
+ const value = body[key];
165
+ if (typeof value === 'string' && value.trim().startsWith('{') && value.trim().endsWith('}')) {
166
+ try {
167
+ const obj = JSON.parse(jsonrepair(body[key]));
168
+ body[key] = obj;
169
+ } catch {
170
+ //skip it if it's not a valid json
171
+ }
172
+ }
173
+ }
174
+ logger.debug('Parsed body json input', body);
175
+
176
+ logger.debug('Parsing query json input');
177
+ for (let key in query) {
178
+ const value = query[key];
179
+ if (typeof value === 'string' && value.trim().startsWith('{') && value.trim().endsWith('}')) {
180
+ try {
181
+ const obj = JSON.parse(jsonrepair(query[key] as string));
182
+ query[key] = obj;
183
+ } catch {
184
+ //skip it if it's not a valid json
185
+ }
186
+ }
187
+ }
188
+ logger.debug('Parsed query json input', query);
189
+
190
+ //Handle binary data
191
+ for (let input of config.inputs) {
192
+ if (!input.isFile && !['image', 'audio', 'video', 'binary'].includes(input?.type?.toLowerCase())) continue;
193
+
194
+ const fieldname = input.name;
195
+
196
+ logger.debug('Parsing file input ', fieldname);
197
+
198
+ let binaryInputs = body[fieldname];
199
+
200
+ // Ensure we're working with an array
201
+ if (!Array.isArray(binaryInputs)) {
202
+ binaryInputs = [binaryInputs];
203
+ }
204
+
205
+ // Process each binary input
206
+ const processedInputs = await Promise.all(
207
+ binaryInputs.map(async (binaryInput) => {
208
+ if (!(binaryInput instanceof BinaryInput)) {
209
+ // * when data sent with 'multipart/form-data' content type, we expect the files to be in req.files
210
+ if (req.files?.length > 0) {
211
+ const file = req.files.find((file) => file.fieldname === fieldname);
212
+ if (!file) return null;
213
+ binaryInput = new BinaryInput(file.buffer, uid() + '-' + file.originalname, file.mimetype);
214
+ }
215
+ }
216
+
217
+ if (binaryInput instanceof BinaryInput) {
218
+ return await binaryInput.getJsonData(AccessCandidate.agent(agent.id));
219
+ }
220
+ return null;
221
+ }),
222
+ );
223
+
224
+ // Filter out null values and handle single/multiple results
225
+ const validResults = processedInputs.filter((result) => result !== null);
226
+ if (validResults.length > 0) {
227
+ body[fieldname] = validResults.length === 1 ? validResults[0] : validResults;
228
+ }
229
+ //console.log('file', fieldname, body[fieldname]);
230
+ }
231
+
232
+ return { headers, body, query, params, _authInfo, _debug: logger.output };
233
+ }
234
+ }