@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.
Files changed (239) hide show
  1. package/CHANGELOG +111 -111
  2. package/LICENSE +18 -18
  3. package/README.md +135 -135
  4. package/dist/bundle-analysis-lazy.html +4949 -0
  5. package/dist/bundle-analysis.html +4949 -0
  6. package/dist/index.js +2 -2
  7. package/dist/index.js.map +1 -1
  8. package/dist/types/Components/Triggers/Gmail.trigger.d.ts +58 -0
  9. package/dist/types/Components/Triggers/GmailTrigger.class.d.ts +44 -0
  10. package/dist/types/Components/Triggers/Trigger.class.d.ts +21 -0
  11. package/dist/types/Components/Triggers/WhatsApp.trigger.d.ts +22 -0
  12. package/dist/types/helpers/AIPerformanceAnalyzer.helper.d.ts +45 -0
  13. package/dist/types/helpers/AIPerformanceCollector.helper.d.ts +111 -0
  14. package/dist/types/subsystems/IO/Storage.service/connectors/AzureBlobStorage.class.d.ts +211 -0
  15. package/dist/types/subsystems/IO/VectorDB.service/connectors/WeaviateVectorDB.class.d.ts +187 -0
  16. package/dist/types/subsystems/PerformanceManager/Performance.service/PerformanceConnector.d.ts +102 -0
  17. package/dist/types/subsystems/PerformanceManager/Performance.service/connectors/LocalPerformanceConnector.class.d.ts +100 -0
  18. package/dist/types/subsystems/PerformanceManager/Performance.service/index.d.ts +22 -0
  19. package/dist/types/subsystems/Security/Credentials/Credentials.class.d.ts +2 -0
  20. package/dist/types/subsystems/Security/Credentials/ManagedOAuth2Credentials.class.d.ts +18 -0
  21. package/dist/types/subsystems/Security/Credentials/OAuth2Credentials.class.d.ts +14 -0
  22. package/dist/types/types/Performance.types.d.ts +468 -0
  23. package/dist/types/utils/package-manager.utils.d.ts +26 -0
  24. package/package.json +1 -1
  25. package/src/Components/APICall/APICall.class.ts +161 -161
  26. package/src/Components/APICall/AccessTokenManager.ts +166 -166
  27. package/src/Components/APICall/ArrayBufferResponse.helper.ts +58 -58
  28. package/src/Components/APICall/OAuth.helper.ts +447 -447
  29. package/src/Components/APICall/mimeTypeCategories.ts +46 -46
  30. package/src/Components/APICall/parseData.ts +167 -167
  31. package/src/Components/APICall/parseHeaders.ts +41 -41
  32. package/src/Components/APICall/parseProxy.ts +68 -68
  33. package/src/Components/APICall/parseUrl.ts +91 -91
  34. package/src/Components/APIEndpoint.class.ts +234 -234
  35. package/src/Components/APIOutput.class.ts +58 -58
  36. package/src/Components/AgentPlugin.class.ts +102 -102
  37. package/src/Components/Async.class.ts +155 -155
  38. package/src/Components/Await.class.ts +90 -90
  39. package/src/Components/Classifier.class.ts +158 -158
  40. package/src/Components/Component.class.ts +147 -147
  41. package/src/Components/ComponentHost.class.ts +38 -38
  42. package/src/Components/DataSourceCleaner.class.ts +92 -92
  43. package/src/Components/DataSourceIndexer.class.ts +181 -181
  44. package/src/Components/DataSourceLookup.class.ts +161 -161
  45. package/src/Components/ECMASandbox.class.ts +72 -72
  46. package/src/Components/FEncDec.class.ts +29 -29
  47. package/src/Components/FHash.class.ts +33 -33
  48. package/src/Components/FSign.class.ts +80 -80
  49. package/src/Components/FSleep.class.ts +25 -25
  50. package/src/Components/FTimestamp.class.ts +66 -66
  51. package/src/Components/FileStore.class.ts +78 -78
  52. package/src/Components/ForEach.class.ts +97 -97
  53. package/src/Components/GPTPlugin.class.ts +70 -70
  54. package/src/Components/GenAILLM.class.ts +586 -586
  55. package/src/Components/HuggingFace.class.ts +313 -313
  56. package/src/Components/Image/imageSettings.config.ts +70 -70
  57. package/src/Components/ImageGenerator.class.ts +483 -483
  58. package/src/Components/JSONFilter.class.ts +54 -54
  59. package/src/Components/LLMAssistant.class.ts +213 -213
  60. package/src/Components/LogicAND.class.ts +28 -28
  61. package/src/Components/LogicAtLeast.class.ts +85 -85
  62. package/src/Components/LogicAtMost.class.ts +86 -86
  63. package/src/Components/LogicOR.class.ts +29 -29
  64. package/src/Components/LogicXOR.class.ts +34 -34
  65. package/src/Components/MCPClient.class.ts +137 -137
  66. package/src/Components/MemoryDeleteKeyVal.class.ts +70 -70
  67. package/src/Components/MemoryReadKeyVal.class.ts +67 -67
  68. package/src/Components/MemoryWriteKeyVal.class.ts +62 -62
  69. package/src/Components/MemoryWriteObject.class.ts +97 -97
  70. package/src/Components/MultimodalLLM.class.ts +128 -128
  71. package/src/Components/OpenAPI.class.ts +72 -72
  72. package/src/Components/PromptGenerator.class.ts +122 -122
  73. package/src/Components/ScrapflyWebScrape.class.ts +183 -183
  74. package/src/Components/ServerlessCode.class.ts +123 -123
  75. package/src/Components/TavilyWebSearch.class.ts +103 -103
  76. package/src/Components/VisionLLM.class.ts +104 -104
  77. package/src/Components/ZapierAction.class.ts +127 -127
  78. package/src/Components/index.ts +97 -97
  79. package/src/Core/AgentProcess.helper.ts +240 -240
  80. package/src/Core/Connector.class.ts +123 -123
  81. package/src/Core/ConnectorsService.ts +197 -197
  82. package/src/Core/DummyConnector.ts +49 -49
  83. package/src/Core/HookService.ts +105 -105
  84. package/src/Core/SmythRuntime.class.ts +241 -241
  85. package/src/Core/SystemEvents.ts +16 -16
  86. package/src/Core/boot.ts +56 -56
  87. package/src/config.ts +15 -15
  88. package/src/constants.ts +126 -126
  89. package/src/data/hugging-face.params.json +579 -579
  90. package/src/helpers/AWSLambdaCode.helper.ts +624 -624
  91. package/src/helpers/BinaryInput.helper.ts +331 -331
  92. package/src/helpers/Conversation.helper.ts +1157 -1157
  93. package/src/helpers/ECMASandbox.helper.ts +64 -64
  94. package/src/helpers/JsonContent.helper.ts +97 -97
  95. package/src/helpers/LocalCache.helper.ts +97 -97
  96. package/src/helpers/Log.helper.ts +274 -274
  97. package/src/helpers/OpenApiParser.helper.ts +150 -150
  98. package/src/helpers/S3Cache.helper.ts +147 -147
  99. package/src/helpers/SmythURI.helper.ts +5 -5
  100. package/src/helpers/Sysconfig.helper.ts +95 -95
  101. package/src/helpers/TemplateString.helper.ts +243 -243
  102. package/src/helpers/TypeChecker.helper.ts +329 -329
  103. package/src/index.ts +3 -3
  104. package/src/index.ts.bak +3 -3
  105. package/src/subsystems/AgentManager/Agent.class.ts +1114 -1114
  106. package/src/subsystems/AgentManager/Agent.helper.ts +3 -3
  107. package/src/subsystems/AgentManager/AgentData.service/AgentDataConnector.ts +230 -230
  108. package/src/subsystems/AgentManager/AgentData.service/connectors/CLIAgentDataConnector.class.ts +66 -66
  109. package/src/subsystems/AgentManager/AgentData.service/connectors/LocalAgentDataConnector.class.ts +145 -145
  110. package/src/subsystems/AgentManager/AgentData.service/connectors/NullAgentData.class.ts +39 -39
  111. package/src/subsystems/AgentManager/AgentData.service/index.ts +18 -18
  112. package/src/subsystems/AgentManager/AgentLogger.class.ts +301 -301
  113. package/src/subsystems/AgentManager/AgentRequest.class.ts +51 -51
  114. package/src/subsystems/AgentManager/AgentRuntime.class.ts +557 -557
  115. package/src/subsystems/AgentManager/AgentSSE.class.ts +101 -101
  116. package/src/subsystems/AgentManager/AgentSettings.class.ts +52 -52
  117. package/src/subsystems/AgentManager/Component.service/ComponentConnector.ts +32 -32
  118. package/src/subsystems/AgentManager/Component.service/connectors/LocalComponentConnector.class.ts +60 -60
  119. package/src/subsystems/AgentManager/Component.service/index.ts +11 -11
  120. package/src/subsystems/AgentManager/EmbodimentSettings.class.ts +47 -47
  121. package/src/subsystems/AgentManager/ForkedAgent.class.ts +154 -154
  122. package/src/subsystems/AgentManager/OSResourceMonitor.ts +77 -77
  123. package/src/subsystems/ComputeManager/Code.service/CodeConnector.ts +98 -98
  124. package/src/subsystems/ComputeManager/Code.service/connectors/AWSLambdaCode.class.ts +171 -171
  125. package/src/subsystems/ComputeManager/Code.service/connectors/ECMASandbox.class.ts +131 -131
  126. package/src/subsystems/ComputeManager/Code.service/index.ts +13 -13
  127. package/src/subsystems/IO/CLI.service/CLIConnector.ts +47 -47
  128. package/src/subsystems/IO/CLI.service/index.ts +9 -9
  129. package/src/subsystems/IO/Log.service/LogConnector.ts +32 -32
  130. package/src/subsystems/IO/Log.service/connectors/ConsoleLog.class.ts +28 -28
  131. package/src/subsystems/IO/Log.service/index.ts +13 -13
  132. package/src/subsystems/IO/NKV.service/NKVConnector.ts +43 -43
  133. package/src/subsystems/IO/NKV.service/connectors/NKVLocalStorage.class.ts +234 -234
  134. package/src/subsystems/IO/NKV.service/connectors/NKVRAM.class.ts +204 -204
  135. package/src/subsystems/IO/NKV.service/connectors/NKVRedis.class.ts +182 -182
  136. package/src/subsystems/IO/NKV.service/index.ts +14 -14
  137. package/src/subsystems/IO/Router.service/RouterConnector.ts +21 -21
  138. package/src/subsystems/IO/Router.service/connectors/ExpressRouter.class.ts +48 -48
  139. package/src/subsystems/IO/Router.service/connectors/NullRouter.class.ts +40 -40
  140. package/src/subsystems/IO/Router.service/index.ts +11 -11
  141. package/src/subsystems/IO/Storage.service/SmythFS.class.ts +488 -488
  142. package/src/subsystems/IO/Storage.service/StorageConnector.ts +66 -66
  143. package/src/subsystems/IO/Storage.service/connectors/LocalStorage.class.ts +327 -327
  144. package/src/subsystems/IO/Storage.service/connectors/S3Storage.class.ts +482 -482
  145. package/src/subsystems/IO/Storage.service/index.ts +13 -13
  146. package/src/subsystems/IO/VectorDB.service/VectorDBConnector.ts +108 -108
  147. package/src/subsystems/IO/VectorDB.service/connectors/MilvusVectorDB.class.ts +465 -465
  148. package/src/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.ts +387 -387
  149. package/src/subsystems/IO/VectorDB.service/connectors/RAMVecrtorDB.class.ts +408 -408
  150. package/src/subsystems/IO/VectorDB.service/embed/BaseEmbedding.ts +107 -107
  151. package/src/subsystems/IO/VectorDB.service/embed/GoogleEmbedding.ts +118 -118
  152. package/src/subsystems/IO/VectorDB.service/embed/OpenAIEmbedding.ts +109 -109
  153. package/src/subsystems/IO/VectorDB.service/embed/index.ts +26 -26
  154. package/src/subsystems/IO/VectorDB.service/index.ts +14 -14
  155. package/src/subsystems/LLMManager/LLM.helper.ts +251 -251
  156. package/src/subsystems/LLMManager/LLM.inference.ts +345 -345
  157. package/src/subsystems/LLMManager/LLM.service/LLMConnector.ts +492 -492
  158. package/src/subsystems/LLMManager/LLM.service/LLMCredentials.helper.ts +171 -171
  159. package/src/subsystems/LLMManager/LLM.service/connectors/Anthropic.class.ts +666 -666
  160. package/src/subsystems/LLMManager/LLM.service/connectors/Bedrock.class.ts +407 -407
  161. package/src/subsystems/LLMManager/LLM.service/connectors/Echo.class.ts +92 -92
  162. package/src/subsystems/LLMManager/LLM.service/connectors/GoogleAI.class.ts +983 -983
  163. package/src/subsystems/LLMManager/LLM.service/connectors/Groq.class.ts +319 -319
  164. package/src/subsystems/LLMManager/LLM.service/connectors/Ollama.class.ts +361 -361
  165. package/src/subsystems/LLMManager/LLM.service/connectors/Perplexity.class.ts +257 -257
  166. package/src/subsystems/LLMManager/LLM.service/connectors/VertexAI.class.ts +430 -430
  167. package/src/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.ts +503 -503
  168. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ChatCompletionsApiInterface.ts +524 -524
  169. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterface.ts +100 -100
  170. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterfaceFactory.ts +81 -81
  171. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ResponsesApiInterface.ts +1145 -1145
  172. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/constants.ts +13 -13
  173. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/index.ts +4 -4
  174. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/utils.ts +11 -11
  175. package/src/subsystems/LLMManager/LLM.service/connectors/openai/types.ts +32 -32
  176. package/src/subsystems/LLMManager/LLM.service/connectors/xAI.class.ts +478 -478
  177. package/src/subsystems/LLMManager/LLM.service/index.ts +47 -47
  178. package/src/subsystems/LLMManager/ModelsProvider.service/ModelsProviderConnector.ts +303 -303
  179. package/src/subsystems/LLMManager/ModelsProvider.service/connectors/JSONModelsProvider.class.ts +280 -271
  180. package/src/subsystems/LLMManager/ModelsProvider.service/index.ts +11 -11
  181. package/src/subsystems/LLMManager/custom-models.ts +854 -854
  182. package/src/subsystems/LLMManager/models.ts +2540 -2540
  183. package/src/subsystems/LLMManager/paramMappings.ts +69 -69
  184. package/src/subsystems/MemoryManager/Cache.service/CacheConnector.ts +86 -86
  185. package/src/subsystems/MemoryManager/Cache.service/connectors/LocalStorageCache.class.ts +297 -297
  186. package/src/subsystems/MemoryManager/Cache.service/connectors/RAMCache.class.ts +214 -214
  187. package/src/subsystems/MemoryManager/Cache.service/connectors/RedisCache.class.ts +252 -252
  188. package/src/subsystems/MemoryManager/Cache.service/connectors/S3Cache.class.ts +373 -373
  189. package/src/subsystems/MemoryManager/Cache.service/index.ts +15 -15
  190. package/src/subsystems/MemoryManager/LLMCache.ts +72 -72
  191. package/src/subsystems/MemoryManager/LLMContext.ts +124 -124
  192. package/src/subsystems/MemoryManager/LLMMemory.service/LLMMemoryConnector.ts +26 -26
  193. package/src/subsystems/MemoryManager/RuntimeContext.ts +277 -277
  194. package/src/subsystems/Security/AccessControl/ACL.class.ts +208 -208
  195. package/src/subsystems/Security/AccessControl/AccessCandidate.class.ts +82 -82
  196. package/src/subsystems/Security/AccessControl/AccessRequest.class.ts +52 -52
  197. package/src/subsystems/Security/Account.service/AccountConnector.ts +44 -44
  198. package/src/subsystems/Security/Account.service/connectors/DummyAccount.class.ts +130 -130
  199. package/src/subsystems/Security/Account.service/connectors/JSONFileAccount.class.ts +170 -170
  200. package/src/subsystems/Security/Account.service/connectors/MySQLAccount.class.ts +76 -76
  201. package/src/subsystems/Security/Account.service/index.ts +14 -14
  202. package/src/subsystems/Security/Credentials.helper.ts +62 -62
  203. package/src/subsystems/Security/ManagedVault.service/ManagedVaultConnector.ts +38 -38
  204. package/src/subsystems/Security/ManagedVault.service/connectors/NullManagedVault.class.ts +53 -53
  205. package/src/subsystems/Security/ManagedVault.service/connectors/SecretManagerManagedVault.ts +154 -154
  206. package/src/subsystems/Security/ManagedVault.service/index.ts +12 -12
  207. package/src/subsystems/Security/SecureConnector.class.ts +110 -110
  208. package/src/subsystems/Security/Vault.service/Vault.helper.ts +30 -30
  209. package/src/subsystems/Security/Vault.service/VaultConnector.ts +29 -29
  210. package/src/subsystems/Security/Vault.service/connectors/HashicorpVault.class.ts +46 -46
  211. package/src/subsystems/Security/Vault.service/connectors/JSONFileVault.class.ts +221 -221
  212. package/src/subsystems/Security/Vault.service/connectors/NullVault.class.ts +54 -54
  213. package/src/subsystems/Security/Vault.service/connectors/SecretsManager.class.ts +140 -140
  214. package/src/subsystems/Security/Vault.service/index.ts +12 -12
  215. package/src/types/ACL.types.ts +104 -104
  216. package/src/types/AWS.types.ts +10 -10
  217. package/src/types/Agent.types.ts +61 -61
  218. package/src/types/AgentLogger.types.ts +17 -17
  219. package/src/types/Cache.types.ts +1 -1
  220. package/src/types/Common.types.ts +2 -2
  221. package/src/types/LLM.types.ts +520 -520
  222. package/src/types/Redis.types.ts +8 -8
  223. package/src/types/SRE.types.ts +64 -64
  224. package/src/types/Security.types.ts +14 -14
  225. package/src/types/Storage.types.ts +5 -5
  226. package/src/types/VectorDB.types.ts +86 -86
  227. package/src/utils/base64.utils.ts +275 -275
  228. package/src/utils/cli.utils.ts +68 -68
  229. package/src/utils/data.utils.ts +322 -322
  230. package/src/utils/date-time.utils.ts +22 -22
  231. package/src/utils/general.utils.ts +238 -238
  232. package/src/utils/index.ts +12 -12
  233. package/src/utils/lazy-client.ts +261 -261
  234. package/src/utils/numbers.utils.ts +13 -13
  235. package/src/utils/oauth.utils.ts +35 -35
  236. package/src/utils/string.utils.ts +414 -414
  237. package/src/utils/url.utils.ts +19 -19
  238. package/src/utils/validation.utils.ts +74 -74
  239. package/dist/types/subsystems/LLMManager/ModelsProvider.service/connectors/SmythModelsProvider.class.d.ts +0 -39
@@ -1,329 +1,329 @@
1
- import { isBase64, isBase64DataUrl } from '@sre/utils/base64.utils';
2
- import dayjs from 'dayjs';
3
- import { isPlainObject, isSmythFileObject, isSmythFsUrl, isUrl, uid } from '../utils';
4
- import { IAgent as Agent } from '@sre/types/Agent.types';
5
- import { IAccessCandidate, TAccessRole } from '@sre/types/ACL.types';
6
- import { BinaryInput } from './BinaryInput.helper';
7
- import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
8
- import { JSONContent } from './JsonContent.helper';
9
- import { Logger } from './Log.helper';
10
-
11
- export const inputErrMsg = (type, name) => `Invalid ${type} value for Input: ${name}`;
12
- const logger = Logger('TypeChecker.helper');
13
-
14
- const InferenceStrategies = {
15
- any: inferAnyType,
16
- string: inferStringType,
17
- number: inferNumberType,
18
- integer: inferIntegerType,
19
- boolean: inferBooleanType,
20
- array: inferArrayType,
21
- object: inferObjectType,
22
- date: inferDateType,
23
- binary: inferBinaryType,
24
- text: inferStringType,
25
- image: inferBinaryType,
26
- audio: inferBinaryType,
27
- video: inferBinaryType,
28
- };
29
-
30
- /**
31
- * Performs type inference on the inputs based on the input config
32
- * @param inputs - The inputs to perform type inference on
33
- * @param inputConfig - The input config to perform type inference on
34
- * @param agent - The agent to perform type inference on
35
- * @returns The inputs with the inferred types
36
- */
37
- export async function performTypeInference(
38
- inputs: Record<string, any>,
39
- inputConfig: Record<string, any>[],
40
- agent: Agent,
41
- ): Promise<Record<string, any>> {
42
- try {
43
- if (!inputConfig || Object.keys(inputConfig)?.length === 0) return inputs;
44
-
45
- // Clone the input object to avoid modifying the original object
46
- const _inputs = { ...inputs };
47
- const _inputConfig = {};
48
-
49
- for (const input of inputConfig) {
50
- if (input?.name) {
51
- _inputConfig[input.name] = { ...input };
52
- }
53
- }
54
-
55
- for (const [key, config] of Object.entries(_inputConfig)) {
56
- let value = inputs?.[key] || '';
57
-
58
- if (!value) continue;
59
-
60
- const type = (config as any)?.type?.toLowerCase() || 'any';
61
-
62
- if (!InferenceStrategies[type]) {
63
- //* For backward compatibility, we don't throw an error if the type is not supported. instead, we return the value as it is.
64
- // throw new Error(`Invalid type: ${type} for Input: ${key}`);
65
- logger.warn(`Unsupported type: ${type} for Input: ${key} for agent: ${agent?.id} input: ${key}`);
66
- continue;
67
- }
68
-
69
- _inputs[key] = await InferenceStrategies[type](value, key, agent);
70
- }
71
-
72
- return _inputs;
73
- } catch (error) {
74
- throw error;
75
- }
76
- }
77
-
78
- async function inferStringType(value: any, key?: string, agent?: Agent) {
79
- if (value === null || value === undefined || value === 'null' || value === 'undefined') {
80
- return '';
81
- } else if (isBase64(value) || isBase64DataUrl(value)) {
82
- // If the value is a base64 string then return the value as it is
83
- return value;
84
- } else if (isSmythFileObject(value)) {
85
- const file = await _createBinaryInput(value, key, agent);
86
- const buffer = await file.getBuffer();
87
- const base64 = buffer.toString('base64');
88
- return file.mimetype ? `data:${file.mimetype};base64,${base64}` : base64;
89
- } else if (typeof value === 'object' || Array.isArray(value)) {
90
- return JSON.stringify(value);
91
- } else {
92
- return String(value);
93
- }
94
- }
95
-
96
- async function inferNumberType(value: any, key?: string, agent?: Agent) {
97
- const floatVal = parseFloat(value);
98
-
99
- if (isNaN(floatVal)) {
100
- throw new Error('Invalid Number value');
101
- }
102
-
103
- return floatVal;
104
- }
105
-
106
- async function inferIntegerType(value: any, key?: string, agent?: Agent) {
107
- const intVal = parseInt(value);
108
-
109
- if (isNaN(intVal)) throw new Error('Invalid Integer value');
110
-
111
- return intVal;
112
- }
113
-
114
- async function inferBooleanType(value: any, key?: string, agent?: Agent) {
115
- if (typeof value === 'boolean') {
116
- return value;
117
- } else if (typeof value === 'string' || typeof value === 'number') {
118
- const lowerCaseValue = String(value).toLowerCase();
119
- if (['true', '1'].includes(lowerCaseValue)) {
120
- return true;
121
- } else if (['false', '0'].includes(lowerCaseValue)) {
122
- return false;
123
- } else {
124
- throw new Error('Invalid Boolean value');
125
- }
126
- } else {
127
- throw new Error('Invalid Boolean value');
128
- }
129
- }
130
-
131
- async function inferArrayType(value: any, key?: string, agent?: Agent) {
132
- try {
133
- if (Array.isArray(value)) return value;
134
-
135
- if (typeof value !== 'string') throw new Error('Invalid Array value');
136
-
137
- try {
138
- // We need to consider array with comma separated values like "item1, item2, item3", as it's provided by Swagger UI
139
- return value.trim().startsWith('[') ? JSONContent(value).tryParse() : value.split(',');
140
- } catch {
141
- throw new Error('Invalid Array value');
142
- }
143
- } catch (error) {
144
- throw new Error('Invalid Array value');
145
- }
146
- }
147
-
148
- async function inferObjectType(value: any, key?: string, agent?: Agent) {
149
- try {
150
- // use parseJson instead of JSON.parse because the data may come from LLM responses
151
- const obj = isPlainObject(value) ? value : JSONContent(value).tryParse();
152
- if (!isPlainObject(obj)) throw new Error('Invalid Object value');
153
- return obj;
154
- } catch (error) {
155
- throw new Error('Invalid Object value');
156
- }
157
- }
158
-
159
- /**
160
- * Extracts the agent ID from a SmythFS URL
161
- * @param url - The SmythFS URL (e.g., smythfs://team.id/agent.id/_temp/filename.ext)
162
- * @returns The agent ID or null if the URL is invalid
163
- */
164
- function extractSmythFsAgentId(url: string): string | null {
165
- if (!url?.startsWith('smythfs://')) return null;
166
-
167
- try {
168
- // Split by '/' and get the agent ID (third segment)
169
- const segments = url.split('/');
170
- if (segments.length < 4) return null;
171
-
172
- return segments[3];
173
- } catch {
174
- return null;
175
- }
176
- }
177
-
178
- async function _createBinaryInput(value: any, key?: string, agent?: Agent) {
179
- // If the value is already a BinaryInput, just return it
180
- if (value instanceof BinaryInput) {
181
- return value;
182
- }
183
-
184
- let candidate: IAccessCandidate | undefined;
185
- let agentId: string = '';
186
- let data: unknown;
187
- let mimetype: string = '';
188
- let fileName = `${uid()}-${key}`;
189
-
190
- if (value && typeof value === 'object' && value?.url && value?.mimetype) {
191
- const url = value?.url;
192
- mimetype = value?.mimetype;
193
-
194
- if (value?.name) {
195
- fileName = value?.name;
196
- }
197
-
198
- if (url?.startsWith('smythfs://')) {
199
- // If the URL uses the smythfs:// protocol, we can use the binary object directly since it's already in our internal file system
200
- data = value;
201
-
202
- // Extract agent ID from smythfs:// URLs to create an access candidate to read the file
203
- agentId = extractSmythFsAgentId(url);
204
- } else {
205
- data = url;
206
- }
207
- } else {
208
- if (typeof value === 'string' && value.startsWith('smythfs://')) {
209
- // Extract agent ID from smythfs:// URLs to create an access candidate to read the file
210
- agentId = extractSmythFsAgentId(value);
211
- }
212
- data = value;
213
- }
214
-
215
- if (agentId) {
216
- candidate = AccessCandidate.agent(agentId);
217
- }
218
-
219
- const binaryInput = BinaryInput.from(data, fileName, mimetype, candidate);
220
- await binaryInput.ready();
221
- return binaryInput;
222
- }
223
-
224
- async function inferBinaryType(value: string | string[], key?: string, agent?: Agent): Promise<BinaryInput | BinaryInput[]> {
225
- try {
226
- let binarySource: string | string[] = value;
227
-
228
- //#region Process string input
229
- if (typeof value === 'string') {
230
- const normalizedValue = value.trim();
231
-
232
- if (isUrl(normalizedValue) || isSmythFsUrl(normalizedValue) || isBase64(value) || isBase64DataUrl(value)) {
233
- // No transformation needed for a url, smythfs url, base64 or base64 data url
234
- binarySource = normalizedValue;
235
- } else {
236
- // Extract URLs from text content
237
- const extractedUrls = _extractUrls(value);
238
- if (extractedUrls.length > 0) {
239
- binarySource = extractedUrls;
240
- }
241
- }
242
- }
243
- //#endregion
244
- // Handle any array (original or created from extraction)
245
- if (Array.isArray(binarySource)) {
246
- return await Promise.all(binarySource.map((item) => _createBinaryInput(item, key, agent)));
247
- }
248
-
249
- // Handle single value case
250
- return await _createBinaryInput(binarySource, key, agent);
251
- } catch (error) {
252
- logger.warn('Error processing binary input', { key, error: error.message });
253
- return null;
254
- }
255
- }
256
-
257
- async function inferDateType(value: any, key?: string, agent?: Agent) {
258
- const errMsg = `Invalid Date value\nThe date string is expected to be in a format commonly used in English-speaking countries.`;
259
-
260
- // Make sure we only accept string or number to parse as date
261
- if (typeof value !== 'string' && typeof value !== 'number') throw new Error(errMsg);
262
-
263
- let date;
264
- if (typeof value === 'string' && isNaN(Number(value))) {
265
- date = dayjs(value).locale('en'); // parse as date string
266
- } else {
267
- // parse as Unix timestamp
268
- const timestamp = typeof value === 'number' ? value : Number(value);
269
- date = dayjs.unix(timestamp / 1000);
270
- }
271
-
272
- if (!date.isValid()) throw new Error(errMsg);
273
-
274
- return date.toISOString();
275
- }
276
-
277
- async function inferAnyType(value: any) {
278
- return value;
279
- }
280
-
281
- /**
282
- * Extracts URLs from various string formats that may be returned by AI/LLM outputs.
283
- * The underscore prefix indicates this is an internal utility function.
284
- *
285
- * Handles the following formats:
286
- * - JSON stringified arrays or objects containing URLs
287
- * - Comma-separated URLs
288
- * - Newline-separated URLs
289
- * - Mixed formats (both comma and newline separators)
290
- * - Single URL strings
291
- *
292
- * @param value - String potentially containing one or more URLs (typically from AI/LLM outputs)
293
- * @returns Array of extracted URLs (empty array if none found)
294
- * @private
295
- */
296
- function _extractUrls(value: string): string[] {
297
- // Return empty array for non-string inputs
298
- if (typeof value !== 'string') return [];
299
-
300
- try {
301
- // Try parsing as JSON first
302
- const parsedValue = JSONContent(value).tryParse();
303
- if (typeof parsedValue === 'object') {
304
- return Object.values(parsedValue)
305
- .map((val) => String(val).trim())
306
- .filter((val) => isUrl(val) || isSmythFsUrl(val));
307
- }
308
-
309
- // Split by both delimiters and flatten the results
310
- const urls = new Set([
311
- // Split by commas
312
- ...value
313
- .split(',')
314
- .map((val) => val.trim())
315
- .filter((val) => val && (isUrl(val) || isSmythFsUrl(val))),
316
-
317
- // Split by newlines
318
- ...value
319
- .split('\n')
320
- .map((val) => val.trim())
321
- .filter((val) => val && (isUrl(val) || isSmythFsUrl(val))),
322
- ]);
323
-
324
- return Array.from(urls);
325
- } catch (error) {
326
- logger.warn('Error extracting URLs from value', { error });
327
- return [];
328
- }
329
- }
1
+ import { isBase64, isBase64DataUrl } from '@sre/utils/base64.utils';
2
+ import dayjs from 'dayjs';
3
+ import { isPlainObject, isSmythFileObject, isSmythFsUrl, isUrl, uid } from '../utils';
4
+ import { IAgent as Agent } from '@sre/types/Agent.types';
5
+ import { IAccessCandidate, TAccessRole } from '@sre/types/ACL.types';
6
+ import { BinaryInput } from './BinaryInput.helper';
7
+ import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
8
+ import { JSONContent } from './JsonContent.helper';
9
+ import { Logger } from './Log.helper';
10
+
11
+ export const inputErrMsg = (type, name) => `Invalid ${type} value for Input: ${name}`;
12
+ const logger = Logger('TypeChecker.helper');
13
+
14
+ const InferenceStrategies = {
15
+ any: inferAnyType,
16
+ string: inferStringType,
17
+ number: inferNumberType,
18
+ integer: inferIntegerType,
19
+ boolean: inferBooleanType,
20
+ array: inferArrayType,
21
+ object: inferObjectType,
22
+ date: inferDateType,
23
+ binary: inferBinaryType,
24
+ text: inferStringType,
25
+ image: inferBinaryType,
26
+ audio: inferBinaryType,
27
+ video: inferBinaryType,
28
+ };
29
+
30
+ /**
31
+ * Performs type inference on the inputs based on the input config
32
+ * @param inputs - The inputs to perform type inference on
33
+ * @param inputConfig - The input config to perform type inference on
34
+ * @param agent - The agent to perform type inference on
35
+ * @returns The inputs with the inferred types
36
+ */
37
+ export async function performTypeInference(
38
+ inputs: Record<string, any>,
39
+ inputConfig: Record<string, any>[],
40
+ agent: Agent,
41
+ ): Promise<Record<string, any>> {
42
+ try {
43
+ if (!inputConfig || Object.keys(inputConfig)?.length === 0) return inputs;
44
+
45
+ // Clone the input object to avoid modifying the original object
46
+ const _inputs = { ...inputs };
47
+ const _inputConfig = {};
48
+
49
+ for (const input of inputConfig) {
50
+ if (input?.name) {
51
+ _inputConfig[input.name] = { ...input };
52
+ }
53
+ }
54
+
55
+ for (const [key, config] of Object.entries(_inputConfig)) {
56
+ let value = inputs?.[key] || '';
57
+
58
+ if (!value) continue;
59
+
60
+ const type = (config as any)?.type?.toLowerCase() || 'any';
61
+
62
+ if (!InferenceStrategies[type]) {
63
+ //* For backward compatibility, we don't throw an error if the type is not supported. instead, we return the value as it is.
64
+ // throw new Error(`Invalid type: ${type} for Input: ${key}`);
65
+ logger.warn(`Unsupported type: ${type} for Input: ${key} for agent: ${agent?.id} input: ${key}`);
66
+ continue;
67
+ }
68
+
69
+ _inputs[key] = await InferenceStrategies[type](value, key, agent);
70
+ }
71
+
72
+ return _inputs;
73
+ } catch (error) {
74
+ throw error;
75
+ }
76
+ }
77
+
78
+ async function inferStringType(value: any, key?: string, agent?: Agent) {
79
+ if (value === null || value === undefined || value === 'null' || value === 'undefined') {
80
+ return '';
81
+ } else if (isBase64(value) || isBase64DataUrl(value)) {
82
+ // If the value is a base64 string then return the value as it is
83
+ return value;
84
+ } else if (isSmythFileObject(value)) {
85
+ const file = await _createBinaryInput(value, key, agent);
86
+ const buffer = await file.getBuffer();
87
+ const base64 = buffer.toString('base64');
88
+ return file.mimetype ? `data:${file.mimetype};base64,${base64}` : base64;
89
+ } else if (typeof value === 'object' || Array.isArray(value)) {
90
+ return JSON.stringify(value);
91
+ } else {
92
+ return String(value);
93
+ }
94
+ }
95
+
96
+ async function inferNumberType(value: any, key?: string, agent?: Agent) {
97
+ const floatVal = parseFloat(value);
98
+
99
+ if (isNaN(floatVal)) {
100
+ throw new Error('Invalid Number value');
101
+ }
102
+
103
+ return floatVal;
104
+ }
105
+
106
+ async function inferIntegerType(value: any, key?: string, agent?: Agent) {
107
+ const intVal = parseInt(value);
108
+
109
+ if (isNaN(intVal)) throw new Error('Invalid Integer value');
110
+
111
+ return intVal;
112
+ }
113
+
114
+ async function inferBooleanType(value: any, key?: string, agent?: Agent) {
115
+ if (typeof value === 'boolean') {
116
+ return value;
117
+ } else if (typeof value === 'string' || typeof value === 'number') {
118
+ const lowerCaseValue = String(value).toLowerCase();
119
+ if (['true', '1'].includes(lowerCaseValue)) {
120
+ return true;
121
+ } else if (['false', '0'].includes(lowerCaseValue)) {
122
+ return false;
123
+ } else {
124
+ throw new Error('Invalid Boolean value');
125
+ }
126
+ } else {
127
+ throw new Error('Invalid Boolean value');
128
+ }
129
+ }
130
+
131
+ async function inferArrayType(value: any, key?: string, agent?: Agent) {
132
+ try {
133
+ if (Array.isArray(value)) return value;
134
+
135
+ if (typeof value !== 'string') throw new Error('Invalid Array value');
136
+
137
+ try {
138
+ // We need to consider array with comma separated values like "item1, item2, item3", as it's provided by Swagger UI
139
+ return value.trim().startsWith('[') ? JSONContent(value).tryParse() : value.split(',');
140
+ } catch {
141
+ throw new Error('Invalid Array value');
142
+ }
143
+ } catch (error) {
144
+ throw new Error('Invalid Array value');
145
+ }
146
+ }
147
+
148
+ async function inferObjectType(value: any, key?: string, agent?: Agent) {
149
+ try {
150
+ // use parseJson instead of JSON.parse because the data may come from LLM responses
151
+ const obj = isPlainObject(value) ? value : JSONContent(value).tryParse();
152
+ if (!isPlainObject(obj)) throw new Error('Invalid Object value');
153
+ return obj;
154
+ } catch (error) {
155
+ throw new Error('Invalid Object value');
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Extracts the agent ID from a SmythFS URL
161
+ * @param url - The SmythFS URL (e.g., smythfs://team.id/agent.id/_temp/filename.ext)
162
+ * @returns The agent ID or null if the URL is invalid
163
+ */
164
+ function extractSmythFsAgentId(url: string): string | null {
165
+ if (!url?.startsWith('smythfs://')) return null;
166
+
167
+ try {
168
+ // Split by '/' and get the agent ID (third segment)
169
+ const segments = url.split('/');
170
+ if (segments.length < 4) return null;
171
+
172
+ return segments[3];
173
+ } catch {
174
+ return null;
175
+ }
176
+ }
177
+
178
+ async function _createBinaryInput(value: any, key?: string, agent?: Agent) {
179
+ // If the value is already a BinaryInput, just return it
180
+ if (value instanceof BinaryInput) {
181
+ return value;
182
+ }
183
+
184
+ let candidate: IAccessCandidate | undefined;
185
+ let agentId: string = '';
186
+ let data: unknown;
187
+ let mimetype: string = '';
188
+ let fileName = `${uid()}-${key}`;
189
+
190
+ if (value && typeof value === 'object' && value?.url && value?.mimetype) {
191
+ const url = value?.url;
192
+ mimetype = value?.mimetype;
193
+
194
+ if (value?.name) {
195
+ fileName = value?.name;
196
+ }
197
+
198
+ if (url?.startsWith('smythfs://')) {
199
+ // If the URL uses the smythfs:// protocol, we can use the binary object directly since it's already in our internal file system
200
+ data = value;
201
+
202
+ // Extract agent ID from smythfs:// URLs to create an access candidate to read the file
203
+ agentId = extractSmythFsAgentId(url);
204
+ } else {
205
+ data = url;
206
+ }
207
+ } else {
208
+ if (typeof value === 'string' && value.startsWith('smythfs://')) {
209
+ // Extract agent ID from smythfs:// URLs to create an access candidate to read the file
210
+ agentId = extractSmythFsAgentId(value);
211
+ }
212
+ data = value;
213
+ }
214
+
215
+ if (agentId) {
216
+ candidate = AccessCandidate.agent(agentId);
217
+ }
218
+
219
+ const binaryInput = BinaryInput.from(data, fileName, mimetype, candidate);
220
+ await binaryInput.ready();
221
+ return binaryInput;
222
+ }
223
+
224
+ async function inferBinaryType(value: string | string[], key?: string, agent?: Agent): Promise<BinaryInput | BinaryInput[]> {
225
+ try {
226
+ let binarySource: string | string[] = value;
227
+
228
+ //#region Process string input
229
+ if (typeof value === 'string') {
230
+ const normalizedValue = value.trim();
231
+
232
+ if (isUrl(normalizedValue) || isSmythFsUrl(normalizedValue) || isBase64(value) || isBase64DataUrl(value)) {
233
+ // No transformation needed for a url, smythfs url, base64 or base64 data url
234
+ binarySource = normalizedValue;
235
+ } else {
236
+ // Extract URLs from text content
237
+ const extractedUrls = _extractUrls(value);
238
+ if (extractedUrls.length > 0) {
239
+ binarySource = extractedUrls;
240
+ }
241
+ }
242
+ }
243
+ //#endregion
244
+ // Handle any array (original or created from extraction)
245
+ if (Array.isArray(binarySource)) {
246
+ return await Promise.all(binarySource.map((item) => _createBinaryInput(item, key, agent)));
247
+ }
248
+
249
+ // Handle single value case
250
+ return await _createBinaryInput(binarySource, key, agent);
251
+ } catch (error) {
252
+ logger.warn('Error processing binary input', { key, error: error.message });
253
+ return null;
254
+ }
255
+ }
256
+
257
+ async function inferDateType(value: any, key?: string, agent?: Agent) {
258
+ const errMsg = `Invalid Date value\nThe date string is expected to be in a format commonly used in English-speaking countries.`;
259
+
260
+ // Make sure we only accept string or number to parse as date
261
+ if (typeof value !== 'string' && typeof value !== 'number') throw new Error(errMsg);
262
+
263
+ let date;
264
+ if (typeof value === 'string' && isNaN(Number(value))) {
265
+ date = dayjs(value).locale('en'); // parse as date string
266
+ } else {
267
+ // parse as Unix timestamp
268
+ const timestamp = typeof value === 'number' ? value : Number(value);
269
+ date = dayjs.unix(timestamp / 1000);
270
+ }
271
+
272
+ if (!date.isValid()) throw new Error(errMsg);
273
+
274
+ return date.toISOString();
275
+ }
276
+
277
+ async function inferAnyType(value: any) {
278
+ return value;
279
+ }
280
+
281
+ /**
282
+ * Extracts URLs from various string formats that may be returned by AI/LLM outputs.
283
+ * The underscore prefix indicates this is an internal utility function.
284
+ *
285
+ * Handles the following formats:
286
+ * - JSON stringified arrays or objects containing URLs
287
+ * - Comma-separated URLs
288
+ * - Newline-separated URLs
289
+ * - Mixed formats (both comma and newline separators)
290
+ * - Single URL strings
291
+ *
292
+ * @param value - String potentially containing one or more URLs (typically from AI/LLM outputs)
293
+ * @returns Array of extracted URLs (empty array if none found)
294
+ * @private
295
+ */
296
+ function _extractUrls(value: string): string[] {
297
+ // Return empty array for non-string inputs
298
+ if (typeof value !== 'string') return [];
299
+
300
+ try {
301
+ // Try parsing as JSON first
302
+ const parsedValue = JSONContent(value).tryParse();
303
+ if (typeof parsedValue === 'object') {
304
+ return Object.values(parsedValue)
305
+ .map((val) => String(val).trim())
306
+ .filter((val) => isUrl(val) || isSmythFsUrl(val));
307
+ }
308
+
309
+ // Split by both delimiters and flatten the results
310
+ const urls = new Set([
311
+ // Split by commas
312
+ ...value
313
+ .split(',')
314
+ .map((val) => val.trim())
315
+ .filter((val) => val && (isUrl(val) || isSmythFsUrl(val))),
316
+
317
+ // Split by newlines
318
+ ...value
319
+ .split('\n')
320
+ .map((val) => val.trim())
321
+ .filter((val) => val && (isUrl(val) || isSmythFsUrl(val))),
322
+ ]);
323
+
324
+ return Array.from(urls);
325
+ } catch (error) {
326
+ logger.warn('Error extracting URLs from value', { error });
327
+ return [];
328
+ }
329
+ }