@framers/agentos 0.1.0

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 (601) hide show
  1. package/LICENSE +98 -0
  2. package/README.md +576 -0
  3. package/dist/api/AgentOS.d.ts +451 -0
  4. package/dist/api/AgentOS.d.ts.map +1 -0
  5. package/dist/api/AgentOS.js +1157 -0
  6. package/dist/api/AgentOS.js.map +1 -0
  7. package/dist/api/AgentOSOrchestrator.d.ts +157 -0
  8. package/dist/api/AgentOSOrchestrator.d.ts.map +1 -0
  9. package/dist/api/AgentOSOrchestrator.js +679 -0
  10. package/dist/api/AgentOSOrchestrator.js.map +1 -0
  11. package/dist/api/interfaces/IAgentOS.d.ts +138 -0
  12. package/dist/api/interfaces/IAgentOS.d.ts.map +1 -0
  13. package/dist/api/interfaces/IAgentOS.js +11 -0
  14. package/dist/api/interfaces/IAgentOS.js.map +1 -0
  15. package/dist/api/interfaces/IUnifiedAgent.d.ts +126 -0
  16. package/dist/api/interfaces/IUnifiedAgent.d.ts.map +1 -0
  17. package/dist/api/interfaces/IUnifiedAgent.js +3 -0
  18. package/dist/api/interfaces/IUnifiedAgent.js.map +1 -0
  19. package/dist/api/types/AgentOSInput.d.ts +114 -0
  20. package/dist/api/types/AgentOSInput.d.ts.map +1 -0
  21. package/dist/api/types/AgentOSInput.js +13 -0
  22. package/dist/api/types/AgentOSInput.js.map +1 -0
  23. package/dist/api/types/AgentOSResponse.d.ts +170 -0
  24. package/dist/api/types/AgentOSResponse.d.ts.map +1 -0
  25. package/dist/api/types/AgentOSResponse.js +25 -0
  26. package/dist/api/types/AgentOSResponse.js.map +1 -0
  27. package/dist/cognitive_substrate/GMI.d.ts +148 -0
  28. package/dist/cognitive_substrate/GMI.d.ts.map +1 -0
  29. package/dist/cognitive_substrate/GMI.js +1003 -0
  30. package/dist/cognitive_substrate/GMI.js.map +1 -0
  31. package/dist/cognitive_substrate/GMIManager.d.ts +98 -0
  32. package/dist/cognitive_substrate/GMIManager.d.ts.map +1 -0
  33. package/dist/cognitive_substrate/GMIManager.js +517 -0
  34. package/dist/cognitive_substrate/GMIManager.js.map +1 -0
  35. package/dist/cognitive_substrate/IGMI.d.ts +469 -0
  36. package/dist/cognitive_substrate/IGMI.d.ts.map +1 -0
  37. package/dist/cognitive_substrate/IGMI.js +111 -0
  38. package/dist/cognitive_substrate/IGMI.js.map +1 -0
  39. package/dist/cognitive_substrate/memory/IWorkingMemory.d.ts +139 -0
  40. package/dist/cognitive_substrate/memory/IWorkingMemory.d.ts.map +1 -0
  41. package/dist/cognitive_substrate/memory/IWorkingMemory.js +14 -0
  42. package/dist/cognitive_substrate/memory/IWorkingMemory.js.map +1 -0
  43. package/dist/cognitive_substrate/memory/InMemoryWorkingMemory.d.ts +143 -0
  44. package/dist/cognitive_substrate/memory/InMemoryWorkingMemory.d.ts.map +1 -0
  45. package/dist/cognitive_substrate/memory/InMemoryWorkingMemory.js +186 -0
  46. package/dist/cognitive_substrate/memory/InMemoryWorkingMemory.js.map +1 -0
  47. package/dist/cognitive_substrate/persona_overlays/PersonaOverlayManager.d.ts +33 -0
  48. package/dist/cognitive_substrate/persona_overlays/PersonaOverlayManager.d.ts.map +1 -0
  49. package/dist/cognitive_substrate/persona_overlays/PersonaOverlayManager.js +138 -0
  50. package/dist/cognitive_substrate/persona_overlays/PersonaOverlayManager.js.map +1 -0
  51. package/dist/cognitive_substrate/persona_overlays/PersonaOverlayTypes.d.ts +32 -0
  52. package/dist/cognitive_substrate/persona_overlays/PersonaOverlayTypes.d.ts.map +1 -0
  53. package/dist/cognitive_substrate/persona_overlays/PersonaOverlayTypes.js +2 -0
  54. package/dist/cognitive_substrate/persona_overlays/PersonaOverlayTypes.js.map +1 -0
  55. package/dist/cognitive_substrate/personas/IPersonaDefinition.d.ts +336 -0
  56. package/dist/cognitive_substrate/personas/IPersonaDefinition.d.ts.map +1 -0
  57. package/dist/cognitive_substrate/personas/IPersonaDefinition.js +8 -0
  58. package/dist/cognitive_substrate/personas/IPersonaDefinition.js.map +1 -0
  59. package/dist/cognitive_substrate/personas/IPersonaLoader.d.ts +78 -0
  60. package/dist/cognitive_substrate/personas/IPersonaLoader.d.ts.map +1 -0
  61. package/dist/cognitive_substrate/personas/IPersonaLoader.js +9 -0
  62. package/dist/cognitive_substrate/personas/IPersonaLoader.js.map +1 -0
  63. package/dist/cognitive_substrate/personas/PersonaLoader.d.ts +60 -0
  64. package/dist/cognitive_substrate/personas/PersonaLoader.d.ts.map +1 -0
  65. package/dist/cognitive_substrate/personas/PersonaLoader.js +138 -0
  66. package/dist/cognitive_substrate/personas/PersonaLoader.js.map +1 -0
  67. package/dist/cognitive_substrate/personas/PersonaValidation.d.ts +139 -0
  68. package/dist/cognitive_substrate/personas/PersonaValidation.d.ts.map +1 -0
  69. package/dist/cognitive_substrate/personas/PersonaValidation.js +277 -0
  70. package/dist/cognitive_substrate/personas/PersonaValidation.js.map +1 -0
  71. package/dist/cognitive_substrate/personas/definitions/atlas_systems_architect.json +29 -0
  72. package/dist/cognitive_substrate/personas/definitions/default_assistant_persona.json +346 -0
  73. package/dist/cognitive_substrate/personas/definitions/default_free_assistant.json +13 -0
  74. package/dist/cognitive_substrate/personas/definitions/index.d.ts +14 -0
  75. package/dist/cognitive_substrate/personas/definitions/index.d.ts.map +1 -0
  76. package/dist/cognitive_substrate/personas/definitions/index.js +35 -0
  77. package/dist/cognitive_substrate/personas/definitions/index.js.map +1 -0
  78. package/dist/cognitive_substrate/personas/definitions/nerf_generalist.json +11 -0
  79. package/dist/cognitive_substrate/personas/definitions/v_researcher.json +11 -0
  80. package/dist/config/AgentOSConfig.d.ts +74 -0
  81. package/dist/config/AgentOSConfig.d.ts.map +1 -0
  82. package/dist/config/AgentOSConfig.js +399 -0
  83. package/dist/config/AgentOSConfig.js.map +1 -0
  84. package/dist/config/EmbeddingManagerConfiguration.d.ts +190 -0
  85. package/dist/config/EmbeddingManagerConfiguration.d.ts.map +1 -0
  86. package/dist/config/EmbeddingManagerConfiguration.js +16 -0
  87. package/dist/config/EmbeddingManagerConfiguration.js.map +1 -0
  88. package/dist/config/MemoryLifecycleManagerConfiguration.d.ts +165 -0
  89. package/dist/config/MemoryLifecycleManagerConfiguration.d.ts.map +1 -0
  90. package/dist/config/MemoryLifecycleManagerConfiguration.js +69 -0
  91. package/dist/config/MemoryLifecycleManagerConfiguration.js.map +1 -0
  92. package/dist/config/RetrievalAugmentorConfiguration.d.ts +98 -0
  93. package/dist/config/RetrievalAugmentorConfiguration.d.ts.map +1 -0
  94. package/dist/config/RetrievalAugmentorConfiguration.js +47 -0
  95. package/dist/config/RetrievalAugmentorConfiguration.js.map +1 -0
  96. package/dist/config/ToolOrchestratorConfig.d.ts +69 -0
  97. package/dist/config/ToolOrchestratorConfig.d.ts.map +1 -0
  98. package/dist/config/ToolOrchestratorConfig.js +11 -0
  99. package/dist/config/ToolOrchestratorConfig.js.map +1 -0
  100. package/dist/config/VectorStoreConfiguration.d.ts +223 -0
  101. package/dist/config/VectorStoreConfiguration.d.ts.map +1 -0
  102. package/dist/config/VectorStoreConfiguration.js +59 -0
  103. package/dist/config/VectorStoreConfiguration.js.map +1 -0
  104. package/dist/config/extension-secrets.json +38 -0
  105. package/dist/config/extensionSecrets.d.ts +13 -0
  106. package/dist/config/extensionSecrets.d.ts.map +1 -0
  107. package/dist/config/extensionSecrets.js +24 -0
  108. package/dist/config/extensionSecrets.js.map +1 -0
  109. package/dist/core/agency/AgencyMemoryManager.d.ts +300 -0
  110. package/dist/core/agency/AgencyMemoryManager.d.ts.map +1 -0
  111. package/dist/core/agency/AgencyMemoryManager.js +657 -0
  112. package/dist/core/agency/AgencyMemoryManager.js.map +1 -0
  113. package/dist/core/agency/AgencyRegistry.d.ts +100 -0
  114. package/dist/core/agency/AgencyRegistry.d.ts.map +1 -0
  115. package/dist/core/agency/AgencyRegistry.js +209 -0
  116. package/dist/core/agency/AgencyRegistry.js.map +1 -0
  117. package/dist/core/agency/AgencyTypes.d.ts +200 -0
  118. package/dist/core/agency/AgencyTypes.d.ts.map +1 -0
  119. package/dist/core/agency/AgencyTypes.js +7 -0
  120. package/dist/core/agency/AgencyTypes.js.map +1 -0
  121. package/dist/core/agency/AgentCommunicationBus.d.ts +150 -0
  122. package/dist/core/agency/AgentCommunicationBus.d.ts.map +1 -0
  123. package/dist/core/agency/AgentCommunicationBus.js +568 -0
  124. package/dist/core/agency/AgentCommunicationBus.js.map +1 -0
  125. package/dist/core/agency/IAgentCommunicationBus.d.ts +469 -0
  126. package/dist/core/agency/IAgentCommunicationBus.d.ts.map +1 -0
  127. package/dist/core/agency/IAgentCommunicationBus.js +40 -0
  128. package/dist/core/agency/IAgentCommunicationBus.js.map +1 -0
  129. package/dist/core/agency/index.d.ts +18 -0
  130. package/dist/core/agency/index.d.ts.map +1 -0
  131. package/dist/core/agency/index.js +18 -0
  132. package/dist/core/agency/index.js.map +1 -0
  133. package/dist/core/agents/AgentCore.d.ts +385 -0
  134. package/dist/core/agents/AgentCore.d.ts.map +1 -0
  135. package/dist/core/agents/AgentCore.js +527 -0
  136. package/dist/core/agents/AgentCore.js.map +1 -0
  137. package/dist/core/agents/AgentFactory.d.ts +123 -0
  138. package/dist/core/agents/AgentFactory.d.ts.map +1 -0
  139. package/dist/core/agents/AgentFactory.js +232 -0
  140. package/dist/core/agents/AgentFactory.js.map +1 -0
  141. package/dist/core/agents/AgentPoolAgent.d.ts +244 -0
  142. package/dist/core/agents/AgentPoolAgent.d.ts.map +1 -0
  143. package/dist/core/agents/AgentPoolAgent.js +697 -0
  144. package/dist/core/agents/AgentPoolAgent.js.map +1 -0
  145. package/dist/core/agents/AgentPoolConfig.d.ts +191 -0
  146. package/dist/core/agents/AgentPoolConfig.d.ts.map +1 -0
  147. package/dist/core/agents/AgentPoolConfig.js +58 -0
  148. package/dist/core/agents/AgentPoolConfig.js.map +1 -0
  149. package/dist/core/agents/IAgent.d.ts +226 -0
  150. package/dist/core/agents/IAgent.d.ts.map +1 -0
  151. package/dist/core/agents/IAgent.js +14 -0
  152. package/dist/core/agents/IAgent.js.map +1 -0
  153. package/dist/core/agents/IAgentFactory.d.ts +137 -0
  154. package/dist/core/agents/IAgentFactory.d.ts.map +1 -0
  155. package/dist/core/agents/IAgentFactory.js +13 -0
  156. package/dist/core/agents/IAgentFactory.js.map +1 -0
  157. package/dist/core/agents/tools/Tool.d.ts +17 -0
  158. package/dist/core/agents/tools/Tool.d.ts.map +1 -0
  159. package/dist/core/agents/tools/Tool.js +8 -0
  160. package/dist/core/agents/tools/Tool.js.map +1 -0
  161. package/dist/core/ai_utilities/HybridUtilityAI.d.ts +1 -0
  162. package/dist/core/ai_utilities/HybridUtilityAI.d.ts.map +1 -0
  163. package/dist/core/ai_utilities/HybridUtilityAI.js +2 -0
  164. package/dist/core/ai_utilities/HybridUtilityAI.js.map +1 -0
  165. package/dist/core/ai_utilities/IUtilityAI.d.ts +212 -0
  166. package/dist/core/ai_utilities/IUtilityAI.d.ts.map +1 -0
  167. package/dist/core/ai_utilities/IUtilityAI.js +11 -0
  168. package/dist/core/ai_utilities/IUtilityAI.js.map +1 -0
  169. package/dist/core/ai_utilities/LLMUtilityAI.d.ts +94 -0
  170. package/dist/core/ai_utilities/LLMUtilityAI.d.ts.map +1 -0
  171. package/dist/core/ai_utilities/LLMUtilityAI.js +434 -0
  172. package/dist/core/ai_utilities/LLMUtilityAI.js.map +1 -0
  173. package/dist/core/ai_utilities/StatisticalUtilityAI.d.ts +102 -0
  174. package/dist/core/ai_utilities/StatisticalUtilityAI.d.ts.map +1 -0
  175. package/dist/core/ai_utilities/StatisticalUtilityAI.js +617 -0
  176. package/dist/core/ai_utilities/StatisticalUtilityAI.js.map +1 -0
  177. package/dist/core/conversation/ConversationContext.d.ts +259 -0
  178. package/dist/core/conversation/ConversationContext.d.ts.map +1 -0
  179. package/dist/core/conversation/ConversationContext.js +450 -0
  180. package/dist/core/conversation/ConversationContext.js.map +1 -0
  181. package/dist/core/conversation/ConversationManager.d.ts +223 -0
  182. package/dist/core/conversation/ConversationManager.d.ts.map +1 -0
  183. package/dist/core/conversation/ConversationManager.js +558 -0
  184. package/dist/core/conversation/ConversationManager.js.map +1 -0
  185. package/dist/core/conversation/ConversationMessage.d.ts +184 -0
  186. package/dist/core/conversation/ConversationMessage.d.ts.map +1 -0
  187. package/dist/core/conversation/ConversationMessage.js +66 -0
  188. package/dist/core/conversation/ConversationMessage.js.map +1 -0
  189. package/dist/core/evaluation/Evaluator.d.ts +28 -0
  190. package/dist/core/evaluation/Evaluator.d.ts.map +1 -0
  191. package/dist/core/evaluation/Evaluator.js +490 -0
  192. package/dist/core/evaluation/Evaluator.js.map +1 -0
  193. package/dist/core/evaluation/IEvaluator.d.ts +309 -0
  194. package/dist/core/evaluation/IEvaluator.d.ts.map +1 -0
  195. package/dist/core/evaluation/IEvaluator.js +12 -0
  196. package/dist/core/evaluation/IEvaluator.js.map +1 -0
  197. package/dist/core/evaluation/LLMJudge.d.ts +105 -0
  198. package/dist/core/evaluation/LLMJudge.d.ts.map +1 -0
  199. package/dist/core/evaluation/LLMJudge.js +229 -0
  200. package/dist/core/evaluation/LLMJudge.js.map +1 -0
  201. package/dist/core/evaluation/index.d.ts +9 -0
  202. package/dist/core/evaluation/index.d.ts.map +1 -0
  203. package/dist/core/evaluation/index.js +9 -0
  204. package/dist/core/evaluation/index.js.map +1 -0
  205. package/dist/core/guardrails/IGuardrailService.d.ts +142 -0
  206. package/dist/core/guardrails/IGuardrailService.d.ts.map +1 -0
  207. package/dist/core/guardrails/IGuardrailService.js +24 -0
  208. package/dist/core/guardrails/IGuardrailService.js.map +1 -0
  209. package/dist/core/guardrails/guardrailDispatcher.d.ts +36 -0
  210. package/dist/core/guardrails/guardrailDispatcher.d.ts.map +1 -0
  211. package/dist/core/guardrails/guardrailDispatcher.js +240 -0
  212. package/dist/core/guardrails/guardrailDispatcher.js.map +1 -0
  213. package/dist/core/hitl/HumanInteractionManager.d.ts +146 -0
  214. package/dist/core/hitl/HumanInteractionManager.d.ts.map +1 -0
  215. package/dist/core/hitl/HumanInteractionManager.js +491 -0
  216. package/dist/core/hitl/HumanInteractionManager.js.map +1 -0
  217. package/dist/core/hitl/IHumanInteractionManager.d.ts +521 -0
  218. package/dist/core/hitl/IHumanInteractionManager.d.ts.map +1 -0
  219. package/dist/core/hitl/IHumanInteractionManager.js +33 -0
  220. package/dist/core/hitl/IHumanInteractionManager.js.map +1 -0
  221. package/dist/core/hitl/index.d.ts +17 -0
  222. package/dist/core/hitl/index.d.ts.map +1 -0
  223. package/dist/core/hitl/index.js +17 -0
  224. package/dist/core/hitl/index.js.map +1 -0
  225. package/dist/core/knowledge/IKnowledgeGraph.d.ts +351 -0
  226. package/dist/core/knowledge/IKnowledgeGraph.d.ts.map +1 -0
  227. package/dist/core/knowledge/IKnowledgeGraph.js +10 -0
  228. package/dist/core/knowledge/IKnowledgeGraph.js.map +1 -0
  229. package/dist/core/knowledge/KnowledgeGraph.d.ts +93 -0
  230. package/dist/core/knowledge/KnowledgeGraph.d.ts.map +1 -0
  231. package/dist/core/knowledge/KnowledgeGraph.js +601 -0
  232. package/dist/core/knowledge/KnowledgeGraph.js.map +1 -0
  233. package/dist/core/knowledge/index.d.ts +8 -0
  234. package/dist/core/knowledge/index.d.ts.map +1 -0
  235. package/dist/core/knowledge/index.js +8 -0
  236. package/dist/core/knowledge/index.js.map +1 -0
  237. package/dist/core/language/LanguageService.d.ts +77 -0
  238. package/dist/core/language/LanguageService.d.ts.map +1 -0
  239. package/dist/core/language/LanguageService.js +305 -0
  240. package/dist/core/language/LanguageService.js.map +1 -0
  241. package/dist/core/language/index.d.ts +6 -0
  242. package/dist/core/language/index.d.ts.map +1 -0
  243. package/dist/core/language/index.js +6 -0
  244. package/dist/core/language/index.js.map +1 -0
  245. package/dist/core/language/interfaces.d.ts +168 -0
  246. package/dist/core/language/interfaces.d.ts.map +1 -0
  247. package/dist/core/language/interfaces.js +37 -0
  248. package/dist/core/language/interfaces.js.map +1 -0
  249. package/dist/core/language/providers/DeepLTranslationProvider.d.ts +16 -0
  250. package/dist/core/language/providers/DeepLTranslationProvider.d.ts.map +1 -0
  251. package/dist/core/language/providers/DeepLTranslationProvider.js +28 -0
  252. package/dist/core/language/providers/DeepLTranslationProvider.js.map +1 -0
  253. package/dist/core/language/providers/OpenAITranslationProvider.d.ts +17 -0
  254. package/dist/core/language/providers/OpenAITranslationProvider.d.ts.map +1 -0
  255. package/dist/core/language/providers/OpenAITranslationProvider.js +34 -0
  256. package/dist/core/language/providers/OpenAITranslationProvider.js.map +1 -0
  257. package/dist/core/language/providers/WhisperDetectionProvider.d.ts +16 -0
  258. package/dist/core/language/providers/WhisperDetectionProvider.d.ts.map +1 -0
  259. package/dist/core/language/providers/WhisperDetectionProvider.js +15 -0
  260. package/dist/core/language/providers/WhisperDetectionProvider.js.map +1 -0
  261. package/dist/core/llm/IPromptEngine.d.ts +627 -0
  262. package/dist/core/llm/IPromptEngine.d.ts.map +1 -0
  263. package/dist/core/llm/IPromptEngine.js +81 -0
  264. package/dist/core/llm/IPromptEngine.js.map +1 -0
  265. package/dist/core/llm/PromptEngine.d.ts +108 -0
  266. package/dist/core/llm/PromptEngine.d.ts.map +1 -0
  267. package/dist/core/llm/PromptEngine.js +872 -0
  268. package/dist/core/llm/PromptEngine.js.map +1 -0
  269. package/dist/core/llm/providers/AIModelProviderManager.d.ts +74 -0
  270. package/dist/core/llm/providers/AIModelProviderManager.d.ts.map +1 -0
  271. package/dist/core/llm/providers/AIModelProviderManager.js +263 -0
  272. package/dist/core/llm/providers/AIModelProviderManager.js.map +1 -0
  273. package/dist/core/llm/providers/IProvider.d.ts +327 -0
  274. package/dist/core/llm/providers/IProvider.d.ts.map +1 -0
  275. package/dist/core/llm/providers/IProvider.js +39 -0
  276. package/dist/core/llm/providers/IProvider.js.map +1 -0
  277. package/dist/core/llm/providers/errors/OllamaProviderError.d.ts +36 -0
  278. package/dist/core/llm/providers/errors/OllamaProviderError.d.ts.map +1 -0
  279. package/dist/core/llm/providers/errors/OllamaProviderError.js +40 -0
  280. package/dist/core/llm/providers/errors/OllamaProviderError.js.map +1 -0
  281. package/dist/core/llm/providers/errors/OpenAIProviderError.d.ts +42 -0
  282. package/dist/core/llm/providers/errors/OpenAIProviderError.d.ts.map +1 -0
  283. package/dist/core/llm/providers/errors/OpenAIProviderError.js +44 -0
  284. package/dist/core/llm/providers/errors/OpenAIProviderError.js.map +1 -0
  285. package/dist/core/llm/providers/errors/OpenRouterProviderError.d.ts +39 -0
  286. package/dist/core/llm/providers/errors/OpenRouterProviderError.d.ts.map +1 -0
  287. package/dist/core/llm/providers/errors/OpenRouterProviderError.js +42 -0
  288. package/dist/core/llm/providers/errors/OpenRouterProviderError.js.map +1 -0
  289. package/dist/core/llm/providers/errors/ProviderError.d.ts +37 -0
  290. package/dist/core/llm/providers/errors/ProviderError.d.ts.map +1 -0
  291. package/dist/core/llm/providers/errors/ProviderError.js +36 -0
  292. package/dist/core/llm/providers/errors/ProviderError.js.map +1 -0
  293. package/dist/core/llm/providers/implementations/OllamaProvider.d.ts +80 -0
  294. package/dist/core/llm/providers/implementations/OllamaProvider.d.ts.map +1 -0
  295. package/dist/core/llm/providers/implementations/OllamaProvider.js +473 -0
  296. package/dist/core/llm/providers/implementations/OllamaProvider.js.map +1 -0
  297. package/dist/core/llm/providers/implementations/OpenAIProvider.d.ts +160 -0
  298. package/dist/core/llm/providers/implementations/OpenAIProvider.d.ts.map +1 -0
  299. package/dist/core/llm/providers/implementations/OpenAIProvider.js +672 -0
  300. package/dist/core/llm/providers/implementations/OpenAIProvider.js.map +1 -0
  301. package/dist/core/llm/providers/implementations/OpenRouterProvider.d.ts +51 -0
  302. package/dist/core/llm/providers/implementations/OpenRouterProvider.d.ts.map +1 -0
  303. package/dist/core/llm/providers/implementations/OpenRouterProvider.js +499 -0
  304. package/dist/core/llm/providers/implementations/OpenRouterProvider.js.map +1 -0
  305. package/dist/core/llm/routing/IModelRouter.d.ts +129 -0
  306. package/dist/core/llm/routing/IModelRouter.d.ts.map +1 -0
  307. package/dist/core/llm/routing/IModelRouter.js +14 -0
  308. package/dist/core/llm/routing/IModelRouter.js.map +1 -0
  309. package/dist/core/llm/routing/ModelRouter.d.ts +157 -0
  310. package/dist/core/llm/routing/ModelRouter.d.ts.map +1 -0
  311. package/dist/core/llm/routing/ModelRouter.js +190 -0
  312. package/dist/core/llm/routing/ModelRouter.js.map +1 -0
  313. package/dist/core/llm/streaming/StreamingBatcher.d.ts +54 -0
  314. package/dist/core/llm/streaming/StreamingBatcher.d.ts.map +1 -0
  315. package/dist/core/llm/streaming/StreamingBatcher.js +173 -0
  316. package/dist/core/llm/streaming/StreamingBatcher.js.map +1 -0
  317. package/dist/core/llm/streaming/StreamingReconstructor.d.ts +69 -0
  318. package/dist/core/llm/streaming/StreamingReconstructor.d.ts.map +1 -0
  319. package/dist/core/llm/streaming/StreamingReconstructor.js +102 -0
  320. package/dist/core/llm/streaming/StreamingReconstructor.js.map +1 -0
  321. package/dist/core/marketplace/IMarketplace.d.ts +500 -0
  322. package/dist/core/marketplace/IMarketplace.d.ts.map +1 -0
  323. package/dist/core/marketplace/IMarketplace.js +10 -0
  324. package/dist/core/marketplace/IMarketplace.js.map +1 -0
  325. package/dist/core/marketplace/Marketplace.d.ts +122 -0
  326. package/dist/core/marketplace/Marketplace.d.ts.map +1 -0
  327. package/dist/core/marketplace/Marketplace.js +591 -0
  328. package/dist/core/marketplace/Marketplace.js.map +1 -0
  329. package/dist/core/marketplace/index.d.ts +8 -0
  330. package/dist/core/marketplace/index.d.ts.map +1 -0
  331. package/dist/core/marketplace/index.js +8 -0
  332. package/dist/core/marketplace/index.js.map +1 -0
  333. package/dist/core/observability/ITracer.d.ts +317 -0
  334. package/dist/core/observability/ITracer.d.ts.map +1 -0
  335. package/dist/core/observability/ITracer.js +55 -0
  336. package/dist/core/observability/ITracer.js.map +1 -0
  337. package/dist/core/observability/Tracer.d.ts +76 -0
  338. package/dist/core/observability/Tracer.d.ts.map +1 -0
  339. package/dist/core/observability/Tracer.js +360 -0
  340. package/dist/core/observability/Tracer.js.map +1 -0
  341. package/dist/core/observability/index.d.ts +9 -0
  342. package/dist/core/observability/index.d.ts.map +1 -0
  343. package/dist/core/observability/index.js +8 -0
  344. package/dist/core/observability/index.js.map +1 -0
  345. package/dist/core/orchestration/AgentOrchestrator.d.ts +243 -0
  346. package/dist/core/orchestration/AgentOrchestrator.d.ts.map +1 -0
  347. package/dist/core/orchestration/AgentOrchestrator.js +648 -0
  348. package/dist/core/orchestration/AgentOrchestrator.js.map +1 -0
  349. package/dist/core/orchestration/IAgentOrchestrator.d.ts +44 -0
  350. package/dist/core/orchestration/IAgentOrchestrator.d.ts.map +1 -0
  351. package/dist/core/orchestration/IAgentOrchestrator.js +4 -0
  352. package/dist/core/orchestration/IAgentOrchestrator.js.map +1 -0
  353. package/dist/core/orchestration/helpers.d.ts +12 -0
  354. package/dist/core/orchestration/helpers.d.ts.map +1 -0
  355. package/dist/core/orchestration/helpers.js +36 -0
  356. package/dist/core/orchestration/helpers.js.map +1 -0
  357. package/dist/core/planning/IPlanningEngine.d.ts +524 -0
  358. package/dist/core/planning/IPlanningEngine.d.ts.map +1 -0
  359. package/dist/core/planning/IPlanningEngine.js +32 -0
  360. package/dist/core/planning/IPlanningEngine.js.map +1 -0
  361. package/dist/core/planning/PlanningEngine.d.ts +161 -0
  362. package/dist/core/planning/PlanningEngine.d.ts.map +1 -0
  363. package/dist/core/planning/PlanningEngine.js +783 -0
  364. package/dist/core/planning/PlanningEngine.js.map +1 -0
  365. package/dist/core/planning/index.d.ts +25 -0
  366. package/dist/core/planning/index.d.ts.map +1 -0
  367. package/dist/core/planning/index.js +25 -0
  368. package/dist/core/planning/index.js.map +1 -0
  369. package/dist/core/sandbox/CodeSandbox.d.ts +86 -0
  370. package/dist/core/sandbox/CodeSandbox.d.ts.map +1 -0
  371. package/dist/core/sandbox/CodeSandbox.js +475 -0
  372. package/dist/core/sandbox/CodeSandbox.js.map +1 -0
  373. package/dist/core/sandbox/ICodeSandbox.d.ts +249 -0
  374. package/dist/core/sandbox/ICodeSandbox.d.ts.map +1 -0
  375. package/dist/core/sandbox/ICodeSandbox.js +24 -0
  376. package/dist/core/sandbox/ICodeSandbox.js.map +1 -0
  377. package/dist/core/sandbox/index.d.ts +9 -0
  378. package/dist/core/sandbox/index.d.ts.map +1 -0
  379. package/dist/core/sandbox/index.js +8 -0
  380. package/dist/core/sandbox/index.js.map +1 -0
  381. package/dist/core/storage/IStorageAdapter.d.ts +483 -0
  382. package/dist/core/storage/IStorageAdapter.d.ts.map +1 -0
  383. package/dist/core/storage/IStorageAdapter.js +19 -0
  384. package/dist/core/storage/IStorageAdapter.js.map +1 -0
  385. package/dist/core/storage/InMemoryStorageAdapter.d.ts +192 -0
  386. package/dist/core/storage/InMemoryStorageAdapter.d.ts.map +1 -0
  387. package/dist/core/storage/InMemoryStorageAdapter.js +343 -0
  388. package/dist/core/storage/InMemoryStorageAdapter.js.map +1 -0
  389. package/dist/core/storage/SqlStorageAdapter.d.ts +262 -0
  390. package/dist/core/storage/SqlStorageAdapter.d.ts.map +1 -0
  391. package/dist/core/storage/SqlStorageAdapter.js +485 -0
  392. package/dist/core/storage/SqlStorageAdapter.js.map +1 -0
  393. package/dist/core/storage/index.d.ts +14 -0
  394. package/dist/core/storage/index.d.ts.map +1 -0
  395. package/dist/core/storage/index.js +14 -0
  396. package/dist/core/storage/index.js.map +1 -0
  397. package/dist/core/streaming/IStreamClient.d.ts +72 -0
  398. package/dist/core/streaming/IStreamClient.d.ts.map +1 -0
  399. package/dist/core/streaming/IStreamClient.js +12 -0
  400. package/dist/core/streaming/IStreamClient.js.map +1 -0
  401. package/dist/core/streaming/StreamingManager.d.ts +242 -0
  402. package/dist/core/streaming/StreamingManager.d.ts.map +1 -0
  403. package/dist/core/streaming/StreamingManager.js +282 -0
  404. package/dist/core/streaming/StreamingManager.js.map +1 -0
  405. package/dist/core/structured/IStructuredOutputManager.d.ts +701 -0
  406. package/dist/core/structured/IStructuredOutputManager.d.ts.map +1 -0
  407. package/dist/core/structured/IStructuredOutputManager.js +74 -0
  408. package/dist/core/structured/IStructuredOutputManager.js.map +1 -0
  409. package/dist/core/structured/StructuredOutputManager.d.ts +140 -0
  410. package/dist/core/structured/StructuredOutputManager.d.ts.map +1 -0
  411. package/dist/core/structured/StructuredOutputManager.js +1015 -0
  412. package/dist/core/structured/StructuredOutputManager.js.map +1 -0
  413. package/dist/core/structured/index.d.ts +34 -0
  414. package/dist/core/structured/index.d.ts.map +1 -0
  415. package/dist/core/structured/index.js +34 -0
  416. package/dist/core/structured/index.js.map +1 -0
  417. package/dist/core/tools/ITool.d.ts +228 -0
  418. package/dist/core/tools/ITool.d.ts.map +1 -0
  419. package/dist/core/tools/ITool.js +11 -0
  420. package/dist/core/tools/ITool.js.map +1 -0
  421. package/dist/core/tools/IToolOrchestrator.d.ts +131 -0
  422. package/dist/core/tools/IToolOrchestrator.d.ts.map +1 -0
  423. package/dist/core/tools/IToolOrchestrator.js +14 -0
  424. package/dist/core/tools/IToolOrchestrator.js.map +1 -0
  425. package/dist/core/tools/ToolExecutor.d.ts +143 -0
  426. package/dist/core/tools/ToolExecutor.d.ts.map +1 -0
  427. package/dist/core/tools/ToolExecutor.js +364 -0
  428. package/dist/core/tools/ToolExecutor.js.map +1 -0
  429. package/dist/core/tools/ToolOrchestrator.d.ts +142 -0
  430. package/dist/core/tools/ToolOrchestrator.d.ts.map +1 -0
  431. package/dist/core/tools/ToolOrchestrator.js +373 -0
  432. package/dist/core/tools/ToolOrchestrator.js.map +1 -0
  433. package/dist/core/tools/permissions/IToolPermissionManager.d.ts +195 -0
  434. package/dist/core/tools/permissions/IToolPermissionManager.d.ts.map +1 -0
  435. package/dist/core/tools/permissions/IToolPermissionManager.js +14 -0
  436. package/dist/core/tools/permissions/IToolPermissionManager.js.map +1 -0
  437. package/dist/core/tools/permissions/ToolPermissionManager.d.ts +203 -0
  438. package/dist/core/tools/permissions/ToolPermissionManager.d.ts.map +1 -0
  439. package/dist/core/tools/permissions/ToolPermissionManager.js +298 -0
  440. package/dist/core/tools/permissions/ToolPermissionManager.js.map +1 -0
  441. package/dist/core/ui/IUIComponent.d.ts +11 -0
  442. package/dist/core/ui/IUIComponent.d.ts.map +1 -0
  443. package/dist/core/ui/IUIComponent.js +2 -0
  444. package/dist/core/ui/IUIComponent.js.map +1 -0
  445. package/dist/core/usage/UsageLedger.d.ts +81 -0
  446. package/dist/core/usage/UsageLedger.d.ts.map +1 -0
  447. package/dist/core/usage/UsageLedger.js +135 -0
  448. package/dist/core/usage/UsageLedger.js.map +1 -0
  449. package/dist/core/workflows/IWorkflowEngine.d.ts +42 -0
  450. package/dist/core/workflows/IWorkflowEngine.d.ts.map +1 -0
  451. package/dist/core/workflows/IWorkflowEngine.js +2 -0
  452. package/dist/core/workflows/IWorkflowEngine.js.map +1 -0
  453. package/dist/core/workflows/WorkflowEngine.d.ts +28 -0
  454. package/dist/core/workflows/WorkflowEngine.d.ts.map +1 -0
  455. package/dist/core/workflows/WorkflowEngine.js +309 -0
  456. package/dist/core/workflows/WorkflowEngine.js.map +1 -0
  457. package/dist/core/workflows/WorkflowTypes.d.ts +180 -0
  458. package/dist/core/workflows/WorkflowTypes.d.ts.map +1 -0
  459. package/dist/core/workflows/WorkflowTypes.js +26 -0
  460. package/dist/core/workflows/WorkflowTypes.js.map +1 -0
  461. package/dist/core/workflows/runtime/WorkflowRuntime.d.ts +70 -0
  462. package/dist/core/workflows/runtime/WorkflowRuntime.d.ts.map +1 -0
  463. package/dist/core/workflows/runtime/WorkflowRuntime.js +566 -0
  464. package/dist/core/workflows/runtime/WorkflowRuntime.js.map +1 -0
  465. package/dist/core/workflows/storage/IWorkflowStore.d.ts +75 -0
  466. package/dist/core/workflows/storage/IWorkflowStore.d.ts.map +1 -0
  467. package/dist/core/workflows/storage/IWorkflowStore.js +2 -0
  468. package/dist/core/workflows/storage/IWorkflowStore.js.map +1 -0
  469. package/dist/core/workflows/storage/InMemoryWorkflowStore.d.ts +14 -0
  470. package/dist/core/workflows/storage/InMemoryWorkflowStore.d.ts.map +1 -0
  471. package/dist/core/workflows/storage/InMemoryWorkflowStore.js +130 -0
  472. package/dist/core/workflows/storage/InMemoryWorkflowStore.js.map +1 -0
  473. package/dist/extensions/ExtensionLoader.d.ts +119 -0
  474. package/dist/extensions/ExtensionLoader.d.ts.map +1 -0
  475. package/dist/extensions/ExtensionLoader.js +297 -0
  476. package/dist/extensions/ExtensionLoader.js.map +1 -0
  477. package/dist/extensions/ExtensionManager.d.ts +49 -0
  478. package/dist/extensions/ExtensionManager.d.ts.map +1 -0
  479. package/dist/extensions/ExtensionManager.js +197 -0
  480. package/dist/extensions/ExtensionManager.js.map +1 -0
  481. package/dist/extensions/ExtensionRegistry.d.ts +39 -0
  482. package/dist/extensions/ExtensionRegistry.d.ts.map +1 -0
  483. package/dist/extensions/ExtensionRegistry.js +103 -0
  484. package/dist/extensions/ExtensionRegistry.js.map +1 -0
  485. package/dist/extensions/MultiRegistryLoader.d.ts +61 -0
  486. package/dist/extensions/MultiRegistryLoader.d.ts.map +1 -0
  487. package/dist/extensions/MultiRegistryLoader.js +169 -0
  488. package/dist/extensions/MultiRegistryLoader.js.map +1 -0
  489. package/dist/extensions/RegistryConfig.d.ts +86 -0
  490. package/dist/extensions/RegistryConfig.d.ts.map +1 -0
  491. package/dist/extensions/RegistryConfig.js +99 -0
  492. package/dist/extensions/RegistryConfig.js.map +1 -0
  493. package/dist/extensions/events.d.ts +19 -0
  494. package/dist/extensions/events.d.ts.map +1 -0
  495. package/dist/extensions/events.js +2 -0
  496. package/dist/extensions/events.js.map +1 -0
  497. package/dist/extensions/index.d.ts +9 -0
  498. package/dist/extensions/index.d.ts.map +1 -0
  499. package/dist/extensions/index.js +9 -0
  500. package/dist/extensions/index.js.map +1 -0
  501. package/dist/extensions/manifest.d.ts +52 -0
  502. package/dist/extensions/manifest.d.ts.map +1 -0
  503. package/dist/extensions/manifest.js +2 -0
  504. package/dist/extensions/manifest.js.map +1 -0
  505. package/dist/extensions/types.d.ts +294 -0
  506. package/dist/extensions/types.d.ts.map +1 -0
  507. package/dist/extensions/types.js +12 -0
  508. package/dist/extensions/types.js.map +1 -0
  509. package/dist/index.d.ts +49 -0
  510. package/dist/index.d.ts.map +1 -0
  511. package/dist/index.js +59 -0
  512. package/dist/index.js.map +1 -0
  513. package/dist/logging/ILogger.d.ts +8 -0
  514. package/dist/logging/ILogger.d.ts.map +1 -0
  515. package/dist/logging/ILogger.js +2 -0
  516. package/dist/logging/ILogger.js.map +1 -0
  517. package/dist/logging/PinoLogger.d.ts +12 -0
  518. package/dist/logging/PinoLogger.d.ts.map +1 -0
  519. package/dist/logging/PinoLogger.js +22 -0
  520. package/dist/logging/PinoLogger.js.map +1 -0
  521. package/dist/logging/loggerFactory.d.ts +6 -0
  522. package/dist/logging/loggerFactory.d.ts.map +1 -0
  523. package/dist/logging/loggerFactory.js +14 -0
  524. package/dist/logging/loggerFactory.js.map +1 -0
  525. package/dist/rag/EmbeddingManager.d.ts +81 -0
  526. package/dist/rag/EmbeddingManager.d.ts.map +1 -0
  527. package/dist/rag/EmbeddingManager.js +412 -0
  528. package/dist/rag/EmbeddingManager.js.map +1 -0
  529. package/dist/rag/IEmbeddingManager.d.ts +277 -0
  530. package/dist/rag/IEmbeddingManager.d.ts.map +1 -0
  531. package/dist/rag/IEmbeddingManager.js +19 -0
  532. package/dist/rag/IEmbeddingManager.js.map +1 -0
  533. package/dist/rag/IRetrievalAugmentor.d.ts +208 -0
  534. package/dist/rag/IRetrievalAugmentor.d.ts.map +1 -0
  535. package/dist/rag/IRetrievalAugmentor.js +21 -0
  536. package/dist/rag/IRetrievalAugmentor.js.map +1 -0
  537. package/dist/rag/IVectorStore.d.ts +351 -0
  538. package/dist/rag/IVectorStore.d.ts.map +1 -0
  539. package/dist/rag/IVectorStore.js +15 -0
  540. package/dist/rag/IVectorStore.js.map +1 -0
  541. package/dist/rag/IVectorStoreManager.d.ts +121 -0
  542. package/dist/rag/IVectorStoreManager.d.ts.map +1 -0
  543. package/dist/rag/IVectorStoreManager.js +13 -0
  544. package/dist/rag/IVectorStoreManager.js.map +1 -0
  545. package/dist/rag/RetrievalAugmentor.d.ts +99 -0
  546. package/dist/rag/RetrievalAugmentor.d.ts.map +1 -0
  547. package/dist/rag/RetrievalAugmentor.js +674 -0
  548. package/dist/rag/RetrievalAugmentor.js.map +1 -0
  549. package/dist/rag/VectorStoreManager.d.ts +90 -0
  550. package/dist/rag/VectorStoreManager.d.ts.map +1 -0
  551. package/dist/rag/VectorStoreManager.js +283 -0
  552. package/dist/rag/VectorStoreManager.js.map +1 -0
  553. package/dist/rag/implementations/index.d.ts +9 -0
  554. package/dist/rag/implementations/index.d.ts.map +1 -0
  555. package/dist/rag/implementations/index.js +9 -0
  556. package/dist/rag/implementations/index.js.map +1 -0
  557. package/dist/rag/implementations/vector_stores/InMemoryVectorStore.d.ts +132 -0
  558. package/dist/rag/implementations/vector_stores/InMemoryVectorStore.d.ts.map +1 -0
  559. package/dist/rag/implementations/vector_stores/InMemoryVectorStore.js +539 -0
  560. package/dist/rag/implementations/vector_stores/InMemoryVectorStore.js.map +1 -0
  561. package/dist/rag/implementations/vector_stores/SqlVectorStore.d.ts +265 -0
  562. package/dist/rag/implementations/vector_stores/SqlVectorStore.d.ts.map +1 -0
  563. package/dist/rag/implementations/vector_stores/SqlVectorStore.js +755 -0
  564. package/dist/rag/implementations/vector_stores/SqlVectorStore.js.map +1 -0
  565. package/dist/rag/implementations/vector_stores/index.d.ts +10 -0
  566. package/dist/rag/implementations/vector_stores/index.d.ts.map +1 -0
  567. package/dist/rag/implementations/vector_stores/index.js +12 -0
  568. package/dist/rag/implementations/vector_stores/index.js.map +1 -0
  569. package/dist/rag/index.d.ts +95 -0
  570. package/dist/rag/index.d.ts.map +1 -0
  571. package/dist/rag/index.js +97 -0
  572. package/dist/rag/index.js.map +1 -0
  573. package/dist/services/user_auth/AuthService.d.ts +13 -0
  574. package/dist/services/user_auth/AuthService.d.ts.map +1 -0
  575. package/dist/services/user_auth/AuthService.js +24 -0
  576. package/dist/services/user_auth/AuthService.js.map +1 -0
  577. package/dist/services/user_auth/SubscriptionService.d.ts +14 -0
  578. package/dist/services/user_auth/SubscriptionService.d.ts.map +1 -0
  579. package/dist/services/user_auth/SubscriptionService.js +34 -0
  580. package/dist/services/user_auth/SubscriptionService.js.map +1 -0
  581. package/dist/services/user_auth/types.d.ts +30 -0
  582. package/dist/services/user_auth/types.d.ts.map +1 -0
  583. package/dist/services/user_auth/types.js +2 -0
  584. package/dist/services/user_auth/types.js.map +1 -0
  585. package/dist/stubs/prismaClient.d.ts +35 -0
  586. package/dist/stubs/prismaClient.d.ts.map +1 -0
  587. package/dist/stubs/prismaClient.js +47 -0
  588. package/dist/stubs/prismaClient.js.map +1 -0
  589. package/dist/types/rateLimitTypes.d.ts +70 -0
  590. package/dist/types/rateLimitTypes.d.ts.map +1 -0
  591. package/dist/types/rateLimitTypes.js +55 -0
  592. package/dist/types/rateLimitTypes.js.map +1 -0
  593. package/dist/utils/errors.d.ts +80 -0
  594. package/dist/utils/errors.d.ts.map +1 -0
  595. package/dist/utils/errors.js +201 -0
  596. package/dist/utils/errors.js.map +1 -0
  597. package/dist/utils/uuid.d.ts +11 -0
  598. package/dist/utils/uuid.d.ts.map +1 -0
  599. package/dist/utils/uuid.js +64 -0
  600. package/dist/utils/uuid.js.map +1 -0
  601. package/package.json +84 -0
@@ -0,0 +1,617 @@
1
+ /**
2
+ * @fileoverview Implementation of IUtilityAI using statistical and
3
+ * conventional NLP methods, primarily leveraging the 'natural' library.
4
+ * This utility is suited for tasks where deterministic, fast, and often offline
5
+ * processing is preferred over LLM-based approaches.
6
+ *
7
+ * @module backend/agentos/core/ai_utilities/StatisticalUtilityAI
8
+ * @see ./IUtilityAI.ts
9
+ * @see 'natural' library documentation
10
+ */
11
+ import * as fs from 'fs/promises'; // For loading resources
12
+ import * as path from 'path'; // For path manipulation
13
+ import { uuidv4 } from '../../utils/uuid.js';
14
+ import * as natural from 'natural';
15
+ import { GMIError, GMIErrorCode } from '../../utils/errors.js';
16
+ // Default English stop words list (can be expanded or loaded from file)
17
+ const DEFAULT_ENGLISH_STOP_WORDS = new Set([
18
+ 'i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', 'your', 'yours', 'yourself', 'yourselves',
19
+ 'he', 'him', 'his', 'himself', 'she', 'her', 'hers', 'herself', 'it', 'its', 'itself', 'they', 'them', 'their',
20
+ 'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this', 'that', 'these', 'those', 'am', 'is', 'are',
21
+ 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'having', 'do', 'does', 'did', 'doing', 'a', 'an',
22
+ 'the', 'and', 'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', 'at', 'by', 'for', 'with', 'about',
23
+ 'against', 'between', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'to', 'from', 'up',
24
+ 'down', 'in', 'out', 'on', 'off', 'over', 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when',
25
+ 'where', 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'no',
26
+ 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 's', 't', 'can', 'will', 'just', 'don',
27
+ 'should', 'now', 'com', 'edu', 'gov', 'org', 'www', 'http', 'https', 'eg', 'ie',
28
+ // Consider language-specific stop word lists.
29
+ ]);
30
+ export class StatisticalUtilityAI {
31
+ constructor(utilityId) {
32
+ this.isInitialized = false;
33
+ this.utilityId = utilityId || `stat-utility-${uuidv4()}`;
34
+ this.tokenizers = {
35
+ word: new natural.WordTokenizer(),
36
+ sentence: new natural.SentenceTokenizer(),
37
+ };
38
+ this.stemmers = {
39
+ porter: natural.PorterStemmer, // Static access to stem method
40
+ lancaster: natural.LancasterStemmer, // Static access
41
+ // PorterStemmerRu, PorterStemmerEs, etc. can be added if 'natural' supports them or via external libraries
42
+ };
43
+ this.stopWords = new Map([['en', DEFAULT_ENGLISH_STOP_WORDS]]);
44
+ this.classifiers = new Map();
45
+ this.sentimentAnalyzers = new Map();
46
+ }
47
+ async initialize(config) {
48
+ if (this.isInitialized) {
49
+ console.warn(`StatisticalUtilityAI (ID: ${this.utilityId}) already initialized. Re-initializing.`);
50
+ // Clear any loaded resources before re-initializing if necessary
51
+ this.stopWords.clear();
52
+ this.stopWords.set('en', DEFAULT_ENGLISH_STOP_WORDS);
53
+ this.classifiers.clear();
54
+ this.sentimentAnalyzers.clear();
55
+ }
56
+ this.config = {
57
+ defaultLanguage: 'en', // Default language for the utility itself
58
+ ...config,
59
+ summarizerConfig: { lexRank: { similarityThreshold: 0.1, dampingFactor: 0.85, maxIterations: 100, epsilon: 1e-4, ...config.summarizerConfig?.lexRank } },
60
+ classifierConfig: { naiveBayes: { defaultAlpha: 0.05, ...config.classifierConfig?.naiveBayes } },
61
+ sentimentConfig: { defaultLexiconLanguage: 'en', ...config.sentimentConfig },
62
+ };
63
+ // Load custom stop words if configured
64
+ if (this.config.customStopWordsPaths) {
65
+ for (const [lang, filePath] of Object.entries(this.config.customStopWordsPaths)) {
66
+ try {
67
+ const fullPath = this.config.resourcePath ? path.join(this.config.resourcePath, filePath) : filePath;
68
+ const stopWordsStr = await fs.readFile(fullPath, 'utf-8');
69
+ this.stopWords.set(lang.toLowerCase(), new Set(stopWordsStr.split(/\r?\n/).map(sw => sw.trim().toLowerCase()).filter(Boolean)));
70
+ console.log(`StatisticalUtilityAI (ID: ${this.utilityId}): Loaded custom stop words for '${lang}' from ${filePath}.`);
71
+ }
72
+ catch (error) {
73
+ console.warn(`StatisticalUtilityAI (ID: ${this.utilityId}): Failed to load custom stop words for '${lang}' from '${filePath}': ${error.message}. Using default if 'en'.`);
74
+ }
75
+ }
76
+ }
77
+ // Initialize default sentiment analyzer
78
+ const defaultSentimentLang = this.config.sentimentConfig?.defaultLexiconLanguage || this.config.defaultLanguage || 'en';
79
+ this.getSentimentAnalyzer(defaultSentimentLang); // Pre-initialize for default language
80
+ // Pre-load default Naive Bayes classifier if modelId specified
81
+ if (this.config.classifierConfig?.naiveBayes?.defaultModelId) {
82
+ try {
83
+ await this.loadTrainedModel(this.config.classifierConfig.naiveBayes.defaultModelId, 'naive_bayes');
84
+ }
85
+ catch {
86
+ console.warn(`StatisticalUtilityAI (ID: ${this.utilityId}): Failed to pre-load default Naive Bayes classifier '${this.config.classifierConfig.naiveBayes.defaultModelId}'. It may need training or explicit loading.`);
87
+ }
88
+ }
89
+ this.isInitialized = true;
90
+ console.log(`StatisticalUtilityAI (ID: ${this.utilityId}) initialized.`);
91
+ }
92
+ ensureInitialized() {
93
+ if (!this.isInitialized) {
94
+ throw new GMIError(`StatisticalUtilityAI (ID: ${this.utilityId}) not initialized.`, GMIErrorCode.NOT_INITIALIZED);
95
+ }
96
+ }
97
+ getStopWords(language) {
98
+ const langCode = (language || this.config.defaultLanguage || 'en').toLowerCase().split('-')[0];
99
+ return this.stopWords.get(langCode) || this.stopWords.get('en') || DEFAULT_ENGLISH_STOP_WORDS;
100
+ }
101
+ getStemmer(algorithm, language) {
102
+ const algo = (algorithm || 'porter').toLowerCase();
103
+ // TODO: Add language-specific stemmers from 'natural' if they exist (e.g., PorterStemmerRu)
104
+ // This requires checking the 'natural' library for available stemmers beyond the basic English ones.
105
+ // For now, defaults to English Porter if language-specific is not found.
106
+ if (language && language.toLowerCase() !== 'en' && this.stemmers[`${algo}_${language.toLowerCase()}`]) {
107
+ return this.stemmers[`${algo}_${language.toLowerCase()}`];
108
+ }
109
+ return this.stemmers[algo] || natural.PorterStemmer; // Fallback to Porter
110
+ }
111
+ getSentimentAnalyzer(language) {
112
+ const langCode = language.toLowerCase().split('-')[0];
113
+ if (!this.sentimentAnalyzers.has(langCode)) {
114
+ try {
115
+ const stemmer = langCode === 'en' ? natural.PorterStemmer : undefined;
116
+ const analyzer = new natural.SentimentAnalyzer(langCode, stemmer, 'afinn');
117
+ const customLexicon = langCode === 'en' && this.config.sentimentConfig?.lexiconPath
118
+ ? this.loadSentimentLexiconFromFile(this.config.sentimentConfig.lexiconPath)
119
+ : undefined;
120
+ if (customLexicon) {
121
+ analyzer.vocabulary = {
122
+ ...analyzer.vocabulary,
123
+ ...customLexicon,
124
+ };
125
+ }
126
+ this.sentimentAnalyzers.set(langCode, analyzer);
127
+ console.log(`StatisticalUtilityAI (ID: ${this.utilityId}): Initialized sentiment analyzer for language '${langCode}'.`);
128
+ }
129
+ catch (e) {
130
+ console.warn(`StatisticalUtilityAI (ID: ${this.utilityId}): Failed to initialize sentiment analyzer for '${langCode}' (${e?.message}). Falling back to neutral analyzer.`);
131
+ const neutralAnalyzer = {
132
+ getSentiment: (_tokens) => 0,
133
+ vocabulary: {},
134
+ };
135
+ this.sentimentAnalyzers.set(langCode, neutralAnalyzer);
136
+ }
137
+ }
138
+ return this.sentimentAnalyzers.get(langCode);
139
+ }
140
+ // Helper to load lexicon (conceptual for now, needs actual file reading)
141
+ loadSentimentLexiconFromFile(filePath) {
142
+ // This would read a file (e.g., AFINN format: word\tscore) and parse it.
143
+ // For this example, it's a placeholder. In initialize, a basic lexicon is hardcoded.
144
+ console.warn(`StatisticalUtilityAI (ID: ${this.utilityId}): Custom sentiment lexicon loading from '${filePath}' is conceptual.`);
145
+ return undefined;
146
+ }
147
+ async summarize(textToSummarize, options) {
148
+ this.ensureInitialized();
149
+ const method = options?.method || 'extractive_sentence_rank'; // 'natural' does not have built-in LexRank.
150
+ if (method === 'first_n_sentences') {
151
+ const sentences = this.tokenizers.sentence.tokenize(textToSummarize);
152
+ if (!sentences || sentences.length === 0)
153
+ return "";
154
+ let numSentences = 3; // Default
155
+ if (options?.desiredLength) {
156
+ if (options.desiredLength === 'short')
157
+ numSentences = 2;
158
+ else if (options.desiredLength === 'medium')
159
+ numSentences = Math.max(3, Math.floor(sentences.length * 0.3));
160
+ else if (options.desiredLength === 'long')
161
+ numSentences = Math.max(4, Math.floor(sentences.length * 0.5));
162
+ else if (typeof options.desiredLength === 'number') {
163
+ numSentences = options.desiredLength <= 1 ? Math.round(options.desiredLength * sentences.length) : options.desiredLength;
164
+ }
165
+ }
166
+ numSentences = Math.min(Math.max(1, numSentences), sentences.length);
167
+ return sentences.slice(0, numSentences).join(" ").trim();
168
+ }
169
+ else if (method === 'extractive_sentence_rank') {
170
+ // 'natural' does not have a direct LexRank or TextRank summarizer.
171
+ // Implementing one here is complex. Falling back to first_n for now.
172
+ console.warn(`StatisticalUtilityAI (ID: ${this.utilityId}): Method 'extractive_sentence_rank' for summarize is conceptual/not fully implemented with 'natural'. Falling back to 'first_n_sentences'.`);
173
+ return this.summarize(textToSummarize, { ...options, method: 'first_n_sentences' });
174
+ }
175
+ throw new GMIError(`Summarization method '${method}' not supported by StatisticalUtilityAI.`, GMIErrorCode.NOT_SUPPORTED);
176
+ }
177
+ async classifyText(textToClassify, options) {
178
+ this.ensureInitialized();
179
+ const modelId = options.modelId || this.config.classifierConfig?.naiveBayes?.defaultModelId || 'default_bayes';
180
+ const classifier = this.classifiers.get(modelId);
181
+ if (options.method === 'naive_bayes' && classifier) {
182
+ try {
183
+ const tokens = this.tokenizers.word.tokenize(textToClassify.toLowerCase());
184
+ if (!tokens)
185
+ throw new GMIError("Tokenization failed for classification.", GMIErrorCode.PROCESSING_ERROR);
186
+ const stemmedTokens = tokens.map(t => this.getStemmer('porter', options.language).stem(t));
187
+ const classifications = classifier.getClassifications(stemmedTokens.join(' '));
188
+ if (!classifications || classifications.length === 0) {
189
+ throw new GMIError("Naive Bayes classifier returned no classifications.", GMIErrorCode.PROCESSING_ERROR);
190
+ }
191
+ const best = classifications[0];
192
+ let bestClasses = best.label;
193
+ let confidences = best.value;
194
+ if (options.multiLabel) {
195
+ // For multi-label, need a threshold or to return top N. 'natural' Bayes returns sorted probabilities.
196
+ // This is a simplification for multi-label.
197
+ bestClasses = classifications.filter(c => c.value > 0.1).map(c => c.label); // Example threshold
198
+ if (bestClasses.length === 0 && classifications.length > 0)
199
+ bestClasses = [classifications[0].label]; // Fallback
200
+ confidences = bestClasses.map(bc => classifications.find(c => c.label === bc)?.value || 0);
201
+ }
202
+ return {
203
+ bestClass: bestClasses,
204
+ confidence: confidences,
205
+ allScores: classifications.map(c => ({ classLabel: c.label, score: c.value })),
206
+ };
207
+ }
208
+ catch (error) {
209
+ throw new GMIError(`Naive Bayes classification failed for model '${modelId}': ${error.message}`, GMIErrorCode.PROCESSING_ERROR, { underlyingError: error });
210
+ }
211
+ }
212
+ else {
213
+ // Fallback to basic keyword matching if Naive Bayes not available/trained or other method specified
214
+ console.warn(`StatisticalUtilityAI (ID: ${this.utilityId}): Method '${options.method}' or Naive Bayes model '${modelId}' not ready. Falling back to basic keyword matching for classification.`);
215
+ // Simplified keyword matching
216
+ const textLower = textToClassify.toLowerCase();
217
+ let bestMatch = options.candidateClasses[0] || "unknown";
218
+ let maxScore = 0;
219
+ const allScoresRaw = [];
220
+ for (const className of options.candidateClasses) {
221
+ let score = 0;
222
+ className.toLowerCase().split(' ').forEach(keyword => {
223
+ if (textLower.includes(keyword))
224
+ score++;
225
+ });
226
+ allScoresRaw.push({ classLabel: className, score });
227
+ if (score > maxScore) {
228
+ maxScore = score;
229
+ bestMatch = className;
230
+ }
231
+ }
232
+ const totalScores = allScoresRaw.reduce((s, item) => s + item.score, 0);
233
+ return {
234
+ bestClass: bestMatch,
235
+ confidence: totalScores > 0 ? maxScore / totalScores : 0.1,
236
+ allScores: allScoresRaw.map(s => ({ ...s, score: totalScores > 0 ? s.score / totalScores : 0 })),
237
+ };
238
+ }
239
+ }
240
+ async extractKeywords(textToAnalyze, options) {
241
+ this.ensureInitialized();
242
+ const maxKeywords = options?.maxKeywords || 5;
243
+ // 'natural' TfIdf is better with a corpus. For a single document, it's term frequency.
244
+ const tfidf = new natural.TfIdf();
245
+ tfidf.addDocument(textToAnalyze.toLowerCase());
246
+ const terms = tfidf.listTerms(0) // document index 0
247
+ .sort((a, b) => b.tfidf - a.tfidf) // Sort by score
248
+ .slice(0, maxKeywords)
249
+ .map(item => item.term);
250
+ return terms;
251
+ }
252
+ async tokenize(text, options) {
253
+ this.ensureInitialized();
254
+ let processedText = text;
255
+ const shouldLowerCase = options?.type === 'sentence' ? false : options?.toLowerCase !== false;
256
+ if (shouldLowerCase)
257
+ processedText = processedText.toLowerCase(); // Default true for word tokenization
258
+ if (options?.type === 'sentence') {
259
+ return this.tokenizers.sentence.tokenize(processedText) || [];
260
+ }
261
+ // Default to word tokenization
262
+ let tokens = this.tokenizers.word.tokenize(processedText) || [];
263
+ if (options?.removePunctuation !== false) { // Default true for words
264
+ // More robust punctuation removal needed than simple regex for all cases
265
+ tokens = tokens.map(token => token.replace(/[^\w\s'-]|(?<!\w)-(?!\w)|(?<!\w)'(?!\w)/g, "")).filter(Boolean);
266
+ }
267
+ return tokens;
268
+ }
269
+ async stemTokens(tokens, options) {
270
+ this.ensureInitialized();
271
+ const stemmer = this.getStemmer(options?.algorithm, options?.language);
272
+ return tokens.map(token => stemmer.stem(token));
273
+ }
274
+ async calculateSimilarity(text1, text2, options) {
275
+ this.ensureInitialized();
276
+ const method = options?.method || 'cosine_tfidf';
277
+ const lang = options?.language || this.config.defaultLanguage || 'en';
278
+ const stemAlgo = 'porter'; // Default for 'natural' based similarity
279
+ let tokens1 = await this.tokenize(text1, { language: lang, toLowerCase: true, removePunctuation: true });
280
+ let tokens2 = await this.tokenize(text2, { language: lang, toLowerCase: true, removePunctuation: true });
281
+ if (options?.removeStopWords !== false) { // Default true
282
+ const stopWordsSet = this.getStopWords(lang);
283
+ tokens1 = tokens1.filter(t => !stopWordsSet.has(t));
284
+ tokens2 = tokens2.filter(t => !stopWordsSet.has(t));
285
+ }
286
+ if (options?.stem !== false) { // Default true
287
+ const stemmer = this.getStemmer(stemAlgo, lang);
288
+ tokens1 = tokens1.map(t => stemmer.stem(t));
289
+ tokens2 = tokens2.map(t => stemmer.stem(t));
290
+ }
291
+ if (method === 'jaccard') {
292
+ const set1 = new Set(tokens1);
293
+ const set2 = new Set(tokens2);
294
+ if (set1.size === 0 && set2.size === 0) {
295
+ return 1;
296
+ }
297
+ let intersectionCount = 0;
298
+ set1.forEach(token => {
299
+ if (set2.has(token)) {
300
+ intersectionCount++;
301
+ }
302
+ });
303
+ const unionCount = new Set([...set1, ...set2]).size;
304
+ return unionCount === 0 ? 0 : intersectionCount / unionCount;
305
+ }
306
+ else if (method === 'levenshtein') {
307
+ const distance = natural.LevenshteinDistance(text1, text2);
308
+ const maxLength = Math.max(text1.length, text2.length);
309
+ return maxLength === 0 ? 1 : 1 - (distance / maxLength);
310
+ }
311
+ else if (method === 'cosine_tfidf') {
312
+ const tfidf = new natural.TfIdf();
313
+ if (options?.corpusForIDF && options.corpusForIDF.length > 0) {
314
+ options.corpusForIDF.forEach(doc => tfidf.addDocument(doc.toLowerCase()));
315
+ }
316
+ tfidf.addDocument(tokens1.join(' '));
317
+ tfidf.addDocument(tokens2.join(' '));
318
+ // Get vectors for the last two added documents (text1, text2)
319
+ // This requires careful indexing if a corpus was also added.
320
+ // Assuming text1 is doc N-2 and text2 is doc N-1 if corpus added before them.
321
+ // If no corpus, text1 is doc 0, text2 is doc 1.
322
+ const docIndex1 = (options?.corpusForIDF?.length || 0) + 0;
323
+ const docIndex2 = (options?.corpusForIDF?.length || 0) + 1;
324
+ // This part is tricky with 'natural'. We need to construct vectors manually.
325
+ const termsInDoc1 = new Map(tfidf.listTerms(docIndex1).map(t => [t.term, t.tfidf]));
326
+ const termsInDoc2 = new Map(tfidf.listTerms(docIndex2).map(t => [t.term, t.tfidf]));
327
+ const allTerms = new Set([...termsInDoc1.keys(), ...termsInDoc2.keys()]);
328
+ const vecA = [];
329
+ const vecB = [];
330
+ allTerms.forEach(term => {
331
+ vecA.push(termsInDoc1.get(term) || 0);
332
+ vecB.push(termsInDoc2.get(term) || 0);
333
+ });
334
+ return this.computeCosineSimilarity(vecA, vecB);
335
+ }
336
+ throw new GMIError(`Similarity method '${method}' not supported or fully implemented by StatisticalUtilityAI.`, GMIErrorCode.NOT_SUPPORTED);
337
+ }
338
+ async analyzeSentiment(text, options) {
339
+ this.ensureInitialized();
340
+ const lang = options?.language || this.config.sentimentConfig?.defaultLexiconLanguage || this.config.defaultLanguage || 'en';
341
+ const analyzer = this.getSentimentAnalyzer(lang);
342
+ const tokens = await this.tokenize(text, { language: lang, toLowerCase: true }); // Keep punctuation for sentiment context
343
+ const stemmedTokensForSentiment = (await this.stemTokens(tokens, { algorithm: 'porter', language: lang })); // 'natural' sentiment analyzer uses stemming
344
+ const score = analyzer.getSentiment(stemmedTokensForSentiment); // This is the 'comparative' score in 'natural'
345
+ let polarity = 'neutral';
346
+ if (score > 0.05)
347
+ polarity = 'positive'; // Thresholds from 'natural' are typically small
348
+ else if (score < -0.05)
349
+ polarity = 'negative';
350
+ // 'natural' doesn't easily give positive/negative tokens or overall score.
351
+ // This is a more manual approximation based on the lexicon if available.
352
+ let detailedScore = 0;
353
+ const positiveTokens = [];
354
+ const negativeTokens = [];
355
+ const analyzerEntry = this.sentimentAnalyzers.get(lang);
356
+ const lexicon = analyzerEntry ? analyzerEntry.vocabulary : undefined;
357
+ if (lexicon) {
358
+ tokens.forEach(t => {
359
+ const tokenScore = lexicon[t.toLowerCase()];
360
+ if (tokenScore !== undefined) {
361
+ detailedScore += tokenScore;
362
+ if (tokenScore > 0)
363
+ positiveTokens.push({ token: t, score: tokenScore });
364
+ else if (tokenScore < 0)
365
+ negativeTokens.push({ token: t, score: tokenScore });
366
+ }
367
+ });
368
+ }
369
+ return {
370
+ score: detailedScore || score, // Use detailed if available, else analyzer's overall
371
+ polarity,
372
+ comparative: score, // 'natural' getSentiment result is comparative
373
+ positiveTokens,
374
+ negativeTokens,
375
+ neutralTokens: [], // Not easily extracted from 'natural'
376
+ intensity: Math.abs(score),
377
+ };
378
+ }
379
+ async detectLanguage(_text, _options) {
380
+ this.ensureInitialized();
381
+ // 'natural' library does not have a built-in robust language detector.
382
+ // A real implementation would use a dedicated library (e.g., franc, langdetect) or n-gram profiles.
383
+ console.warn("StatisticalUtilityAI.detectLanguage: Placeholder implementation. Not reliable.");
384
+ return [{ language: this.config.defaultLanguage || 'en', confidence: 0.1 }]; // Fallback
385
+ }
386
+ async normalizeText(text, options) {
387
+ this.ensureInitialized();
388
+ let normalizedText = text;
389
+ const lang = options?.language || this.config.defaultLanguage || 'en';
390
+ if (options?.stripHtml) {
391
+ normalizedText = normalizedText.replace(/<[^>]+>/g, ' ');
392
+ }
393
+ if (options?.toLowerCase !== false) {
394
+ normalizedText = normalizedText.toLowerCase();
395
+ }
396
+ if (options?.expandContractions) { // Basic, language-dependent
397
+ if (lang === 'en') {
398
+ normalizedText = normalizedText.replace(/\bwon't\b/g, "will not")
399
+ .replace(/\bcan't\b/g, "cannot").replace(/\bain't\b/g, "am not") // Example
400
+ .replace(/\bn't\b/g, " not").replace(/\b're\b/g, " are")
401
+ .replace(/\b's\b/g, " is").replace(/\b'd\b/g, " would") // Ambiguous ('s, 'd)
402
+ .replace(/\b'll\b/g, " will").replace(/\b've\b/g, " have")
403
+ .replace(/\b'm\b/g, " am");
404
+ }
405
+ }
406
+ if (options?.removePunctuation) {
407
+ normalizedText = normalizedText.replace(/[.,/#!$%^&*;:{}=\-_`~()?"]/g, " ");
408
+ }
409
+ // Tokenize for stop word removal and stemming
410
+ let tokens = this.tokenizers.word.tokenize(normalizedText) || [];
411
+ if (options?.removeStopWords) {
412
+ tokens = tokens.filter(token => !this.getStopWords(lang).has(token));
413
+ }
414
+ if (options?.stem) {
415
+ const stemmer = this.getStemmer(options.stemAlgorithm, lang);
416
+ tokens = tokens.map(token => stemmer.stem(token));
417
+ }
418
+ if (options?.replaceNumbersWith !== undefined) {
419
+ const replacement = options.replaceNumbersWith;
420
+ tokens = tokens.map(token => /^\d+(\.\d+)?$/.test(token) ? (replacement === null ? "" : replacement) : token).filter(t => replacement !== null || t !== "");
421
+ }
422
+ normalizedText = tokens.join(" ").replace(/\s+/g, ' ').trim(); // Consolidate spaces
423
+ return normalizedText;
424
+ }
425
+ async generateNGrams(tokens, options) {
426
+ this.ensureInitialized();
427
+ const nValues = Array.isArray(options.n) ? options.n : [options.n];
428
+ const result = {};
429
+ const Ngram = natural.NGrams; // Access Ngrams methods
430
+ nValues.forEach(n => {
431
+ if (n <= 0) {
432
+ result[n] = [];
433
+ return;
434
+ }
435
+ if (options.includePartial) {
436
+ // 'natural' NGrams.ngrams doesn't directly support partials at the end in a simple way.
437
+ // This would need custom logic if strictly required. For now, use standard n-gram generation.
438
+ console.warn("StatisticalUtilityAI.generateNGrams: includePartial=true is not fully supported by 'natural' Ngrams, will generate full N-grams only.");
439
+ }
440
+ result[n] = Ngram.ngrams(tokens, n);
441
+ });
442
+ return result;
443
+ }
444
+ async calculateReadability(text, options) {
445
+ this.ensureInitialized();
446
+ // 'natural' does not have built-in readability scores.
447
+ // This requires implementing the formulas manually. Syllable counting is the hardest part.
448
+ // The implementation from LLMUtilityAI provided earlier was an LLM-based *estimation*.
449
+ // A true statistical one needs the formulas.
450
+ console.warn("StatisticalUtilityAI.calculateReadability: Formula-based readability is complex to implement accurately without dedicated syllable counters. This is a very basic placeholder.");
451
+ const sentences = (this.tokenizers.sentence.tokenize(text) || [text]).filter(s => s.trim().length > 0);
452
+ const words = (this.tokenizers.word.tokenize(text.toLowerCase()) || []).filter(w => /^[a-z']+$/.test(w) && w.length > 0); // Basic word filter
453
+ const numSentences = Math.max(1, sentences.length);
454
+ const numWords = Math.max(1, words.length);
455
+ // Extremely naive syllable counter (vowel groups, often inaccurate)
456
+ const countSyllablesApprox = (word) => {
457
+ if (word.length <= 3)
458
+ return 1;
459
+ word = word.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '');
460
+ word = word.replace(/^y/, '');
461
+ const matches = word.match(/[aeiouy]{1,2}/g);
462
+ return matches ? Math.max(1, matches.length) : 1;
463
+ };
464
+ const numSyllables = Math.max(1, words.reduce((sum, word) => sum + countSyllablesApprox(word), 0));
465
+ let score = 0;
466
+ const interpretation = "Score interpretation unavailable for placeholder.";
467
+ let gradeLevel = "N/A";
468
+ switch (options.formula) {
469
+ case 'flesch_kincaid_reading_ease':
470
+ score = 206.835 - 1.015 * (numWords / numSentences) - 84.6 * (numSyllables / numWords);
471
+ break;
472
+ case 'flesch_kincaid_grade_level':
473
+ score = 0.39 * (numWords / numSentences) + 11.8 * (numSyllables / numWords) - 15.59;
474
+ gradeLevel = `Approx. Grade ${Math.max(0, Math.round(score))}`;
475
+ break;
476
+ // Add other formulas if you implement them
477
+ default:
478
+ throw new GMIError(`Readability formula '${options.formula}' not implemented in StatisticalUtilityAI.`, GMIErrorCode.NOT_SUPPORTED);
479
+ }
480
+ return { score: parseFloat(score.toFixed(2)), interpretation, gradeLevel };
481
+ }
482
+ async checkHealth() {
483
+ // Basic check, can be expanded (e.g., verify resource files loaded)
484
+ return {
485
+ isHealthy: this.isInitialized,
486
+ details: {
487
+ utilityId: this.utilityId,
488
+ status: this.isInitialized ? 'Initialized' : 'Not Initialized',
489
+ defaultLanguage: this.config?.defaultLanguage,
490
+ loadedStopWordLanguages: Array.from(this.stopWords.keys()),
491
+ loadedClassifierModels: Array.from(this.classifiers.keys()),
492
+ loadedSentimentAnalyzers: Array.from(this.sentimentAnalyzers.keys()),
493
+ }
494
+ };
495
+ }
496
+ // --- Model Training/Management for Naive Bayes Classifier ---
497
+ async trainModel(trainingData, modelType, // e.g., "text_classifier_naive_bayes"
498
+ trainingOptions) {
499
+ this.ensureInitialized();
500
+ if (modelType.toLowerCase() !== 'text_classifier_naive_bayes') {
501
+ return { success: false, message: `Model type '${modelType}' not supported for training by StatisticalUtilityAI.` };
502
+ }
503
+ const modelId = trainingOptions?.modelId || 'default_bayes_classifier';
504
+ const stemmerAlgo = trainingOptions?.stemmer || 'porter';
505
+ const stemmer = this.getStemmer(stemmerAlgo);
506
+ const alpha = trainingOptions?.alpha || this.config.classifierConfig?.naiveBayes?.defaultAlpha || 0.05;
507
+ const classifier = new natural.BayesClassifier(stemmer, alpha);
508
+ console.log(`StatisticalUtilityAI (ID: ${this.utilityId}): Training Naive Bayes classifier '${modelId}' with ${trainingData.length} samples.`);
509
+ for (const item of trainingData) {
510
+ // Basic tokenization for training; consider using this.tokenize for consistency if options differ
511
+ const tokens = this.tokenizers.word.tokenize(item.text.toLowerCase());
512
+ if (tokens) {
513
+ classifier.addDocument(tokens, item.label);
514
+ }
515
+ }
516
+ try {
517
+ classifier.train();
518
+ this.classifiers.set(modelId, classifier);
519
+ console.log(`StatisticalUtilityAI (ID: ${this.utilityId}): Naive Bayes classifier '${modelId}' training complete.`);
520
+ return { success: true, message: `Model '${modelId}' trained successfully.`, modelId };
521
+ }
522
+ catch (error) {
523
+ console.error(`StatisticalUtilityAI (ID: ${this.utilityId}): Error training Naive Bayes classifier '${modelId}': ${error.message}`);
524
+ return { success: false, message: `Training failed: ${error.message}` };
525
+ }
526
+ }
527
+ async saveTrainedModel(modelId, modelType, storagePath) {
528
+ this.ensureInitialized();
529
+ const typeToSave = modelType || 'text_classifier_naive_bayes'; // Assume default if not given
530
+ if (typeToSave.toLowerCase() !== 'text_classifier_naive_bayes') {
531
+ return { success: false, message: `Saving model type '${typeToSave}' not supported.` };
532
+ }
533
+ const classifier = this.classifiers.get(modelId);
534
+ if (!classifier) {
535
+ return { success: false, message: `Classifier model ID '${modelId}' not found for saving.` };
536
+ }
537
+ const savePath = storagePath || (this.config.classifierConfig?.naiveBayes?.modelStoragePath ? path.join(this.config.classifierConfig.naiveBayes.modelStoragePath, `${modelId}.nbc.json`) : `${modelId}.nbc.json`);
538
+ return new Promise((resolve) => {
539
+ // 'natural' BayesClassifier.save uses a callback
540
+ classifier.save(savePath, (err, _savedClassifier) => {
541
+ if (err) {
542
+ console.error(`StatisticalUtilityAI (ID: ${this.utilityId}): Error saving Naive Bayes model '${modelId}' to '${savePath}':`, err);
543
+ resolve({ success: false, message: `Failed to save model: ${err.message || 'Unknown error'}` });
544
+ }
545
+ else {
546
+ console.log(`StatisticalUtilityAI (ID: ${this.utilityId}): Naive Bayes model '${modelId}' saved to '${savePath}'.`);
547
+ resolve({ success: true, pathOrStoreId: savePath, message: 'Model saved successfully.' });
548
+ }
549
+ });
550
+ });
551
+ }
552
+ async loadTrainedModel(modelId, modelType, storagePath) {
553
+ this.ensureInitialized();
554
+ const typeToLoad = modelType || 'text_classifier_naive_bayes';
555
+ if (typeToLoad.toLowerCase() !== 'text_classifier_naive_bayes') {
556
+ return { success: false, message: `Loading model type '${typeToLoad}' not supported.` };
557
+ }
558
+ const loadPath = storagePath || (this.config.classifierConfig?.naiveBayes?.modelStoragePath ? path.join(this.config.classifierConfig.naiveBayes.modelStoragePath, `${modelId}.nbc.json`) : `${modelId}.nbc.json`);
559
+ return new Promise((resolve) => {
560
+ natural.BayesClassifier.load(loadPath, this.getStemmer('porter'), (err, classifier) => {
561
+ if (err || !classifier) {
562
+ console.error(`StatisticalUtilityAI (ID: ${this.utilityId}): Error loading Naive Bayes model '${modelId}' from '${loadPath}':`, err);
563
+ resolve({ success: false, message: `Failed to load model: ${err?.message || 'Classifier could not be loaded.'}` });
564
+ }
565
+ else {
566
+ this.classifiers.set(modelId, classifier);
567
+ console.log(`StatisticalUtilityAI (ID: ${this.utilityId}): Naive Bayes model '${modelId}' loaded from '${loadPath}'.`);
568
+ resolve({ success: true, message: 'Model loaded successfully.' });
569
+ }
570
+ });
571
+ });
572
+ }
573
+ computeCosineSimilarity(vecA, vecB) {
574
+ if (vecA.length === 0 || vecB.length === 0 || vecA.length !== vecB.length) {
575
+ return 0;
576
+ }
577
+ let dot = 0;
578
+ let magA = 0;
579
+ let magB = 0;
580
+ for (let i = 0; i < vecA.length; i++) {
581
+ const a = vecA[i];
582
+ const b = vecB[i];
583
+ dot += a * b;
584
+ magA += a * a;
585
+ magB += b * b;
586
+ }
587
+ if (magA === 0 || magB === 0) {
588
+ return 0;
589
+ }
590
+ return dot / (Math.sqrt(magA) * Math.sqrt(magB));
591
+ }
592
+ async parseJsonSafe(jsonString, options) {
593
+ this.ensureInitialized();
594
+ if (typeof jsonString !== 'string' || jsonString.trim().length === 0) {
595
+ return null;
596
+ }
597
+ try {
598
+ return JSON.parse(jsonString);
599
+ }
600
+ catch (error) {
601
+ console.warn(`StatisticalUtilityAI (ID: ${this.utilityId}): JSON parse failed.`, error?.message || error);
602
+ if (options?.attemptFixWithLLM) {
603
+ console.warn(`StatisticalUtilityAI: attemptFixWithLLM=true but LLM-based repair is not supported in this implementation.`);
604
+ }
605
+ return null;
606
+ }
607
+ }
608
+ async shutdown() {
609
+ this.isInitialized = false;
610
+ // Clear any resources, though 'natural' instances are mostly self-contained.
611
+ this.classifiers.clear();
612
+ this.sentimentAnalyzers.clear();
613
+ this.stopWords.clear();
614
+ console.log(`StatisticalUtilityAI (ID: ${this.utilityId}) shut down.`);
615
+ }
616
+ }
617
+ //# sourceMappingURL=StatisticalUtilityAI.js.map