@nxuss/lemma 0.1.1 → 0.2.1

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 (452) hide show
  1. package/README.md +195 -13
  2. package/dist/cjs/cloud/KeyManager.d.ts.map +1 -0
  3. package/dist/cjs/cloud/KeyManager.js.map +1 -0
  4. package/dist/cjs/cloud/TenantCache.d.ts.map +1 -0
  5. package/dist/cjs/cloud/TenantCache.js.map +1 -0
  6. package/dist/cjs/cloud/index.d.ts.map +1 -0
  7. package/dist/cjs/cloud/index.js.map +1 -0
  8. package/dist/cjs/cloud/server.d.ts.map +1 -0
  9. package/dist/cjs/cloud/server.js.map +1 -0
  10. package/dist/cjs/cloud/types.d.ts.map +1 -0
  11. package/dist/cjs/cloud/types.js.map +1 -0
  12. package/dist/cjs/config/index.d.ts.map +1 -0
  13. package/dist/cjs/config/index.js.map +1 -0
  14. package/dist/cjs/consensus/ConsensusEngine.d.ts.map +1 -0
  15. package/dist/cjs/consensus/ConsensusEngine.js.map +1 -0
  16. package/dist/cjs/consensus/ModelPool.d.ts.map +1 -0
  17. package/dist/cjs/consensus/ModelPool.js.map +1 -0
  18. package/dist/cjs/consensus/index.d.ts.map +1 -0
  19. package/dist/cjs/consensus/index.js.map +1 -0
  20. package/dist/cjs/core/AgentRegistry.d.ts.map +1 -0
  21. package/dist/cjs/core/AgentRegistry.js.map +1 -0
  22. package/dist/cjs/core/DashboardBroadcaster.d.ts.map +1 -0
  23. package/dist/cjs/core/DashboardBroadcaster.js.map +1 -0
  24. package/dist/cjs/core/OrchestrationEngine.d.ts.map +1 -0
  25. package/dist/cjs/core/OrchestrationEngine.js.map +1 -0
  26. package/dist/cjs/core/SubconsciousEngine.d.ts.map +1 -0
  27. package/dist/cjs/core/SubconsciousEngine.js.map +1 -0
  28. package/dist/cjs/core/WebSocketServer.d.ts.map +1 -0
  29. package/dist/cjs/core/WebSocketServer.js.map +1 -0
  30. package/dist/cjs/core/index.d.ts.map +1 -0
  31. package/dist/cjs/core/index.js.map +1 -0
  32. package/dist/cjs/core/router.d.ts.map +1 -0
  33. package/dist/cjs/core/router.js.map +1 -0
  34. package/dist/{embed → cjs/embed}/index.d.ts +66 -1
  35. package/dist/cjs/embed/index.d.ts.map +1 -0
  36. package/dist/cjs/embed/index.js +989 -0
  37. package/dist/cjs/embed/index.js.map +1 -0
  38. package/dist/cjs/embed.d.ts.map +1 -0
  39. package/dist/cjs/embed.js.map +1 -0
  40. package/dist/cjs/examples/basic-usage.d.ts +12 -0
  41. package/dist/cjs/examples/basic-usage.d.ts.map +1 -0
  42. package/dist/cjs/examples/basic-usage.js +128 -0
  43. package/dist/cjs/examples/basic-usage.js.map +1 -0
  44. package/dist/cjs/index.d.ts.map +1 -0
  45. package/dist/cjs/index.js.map +1 -0
  46. package/dist/cjs/package.json +3 -0
  47. package/dist/cjs/protocol/flows.d.ts.map +1 -0
  48. package/dist/cjs/protocol/flows.js.map +1 -0
  49. package/dist/cjs/protocol/iap.d.ts.map +1 -0
  50. package/dist/cjs/protocol/iap.js.map +1 -0
  51. package/dist/cjs/protocol/index.d.ts.map +1 -0
  52. package/dist/cjs/protocol/index.js.map +1 -0
  53. package/dist/cjs/protocol/types.d.ts.map +1 -0
  54. package/dist/cjs/protocol/types.js.map +1 -0
  55. package/dist/cjs/protocol/utils.d.ts.map +1 -0
  56. package/dist/cjs/protocol/utils.js.map +1 -0
  57. package/dist/cjs/protocol/validators.d.ts.map +1 -0
  58. package/dist/cjs/protocol/validators.js.map +1 -0
  59. package/dist/cjs/security/AuthManager.d.ts.map +1 -0
  60. package/dist/cjs/security/AuthManager.js.map +1 -0
  61. package/dist/cjs/security/MessageSanitizer.d.ts.map +1 -0
  62. package/dist/cjs/security/MessageSanitizer.js.map +1 -0
  63. package/dist/cjs/security/RateLimiter.d.ts.map +1 -0
  64. package/dist/cjs/security/RateLimiter.js.map +1 -0
  65. package/dist/cjs/security/SecurityMiddleware.d.ts.map +1 -0
  66. package/dist/cjs/security/SecurityMiddleware.js.map +1 -0
  67. package/dist/cjs/security/index.d.ts.map +1 -0
  68. package/dist/cjs/security/index.js.map +1 -0
  69. package/dist/cjs/speculative/PredictionEngine.d.ts.map +1 -0
  70. package/dist/cjs/speculative/PredictionEngine.js.map +1 -0
  71. package/dist/cjs/speculative/SpeculativeCache.d.ts.map +1 -0
  72. package/dist/cjs/speculative/SpeculativeCache.js.map +1 -0
  73. package/dist/cjs/speculative/SpeculativeEngine.d.ts.map +1 -0
  74. package/dist/cjs/speculative/SpeculativeEngine.js.map +1 -0
  75. package/dist/cjs/speculative/WorkerPool.d.ts.map +1 -0
  76. package/dist/cjs/speculative/WorkerPool.js.map +1 -0
  77. package/dist/cjs/speculative/index.d.ts.map +1 -0
  78. package/dist/cjs/speculative/index.js.map +1 -0
  79. package/dist/cjs/subconscious/EmbeddingService.d.ts.map +1 -0
  80. package/dist/cjs/subconscious/EmbeddingService.js.map +1 -0
  81. package/dist/cjs/subconscious/SemanticCache.d.ts.map +1 -0
  82. package/dist/cjs/subconscious/SemanticCache.js.map +1 -0
  83. package/dist/cjs/subconscious/SubconsciousEngine.d.ts.map +1 -0
  84. package/dist/cjs/subconscious/SubconsciousEngine.js.map +1 -0
  85. package/dist/cjs/subconscious/VectorStore.d.ts.map +1 -0
  86. package/dist/cjs/subconscious/VectorStore.js.map +1 -0
  87. package/dist/cjs/subconscious/cache.d.ts.map +1 -0
  88. package/dist/cjs/subconscious/cache.js.map +1 -0
  89. package/dist/cjs/subconscious/embeddings.d.ts.map +1 -0
  90. package/dist/cjs/subconscious/embeddings.js.map +1 -0
  91. package/dist/cjs/subconscious/index.d.ts.map +1 -0
  92. package/dist/cjs/subconscious/index.js.map +1 -0
  93. package/dist/cjs/types/index.d.ts.map +1 -0
  94. package/dist/cjs/types/index.js.map +1 -0
  95. package/dist/cjs/utils/logger.d.ts.map +1 -0
  96. package/dist/cjs/utils/logger.js.map +1 -0
  97. package/dist/esm/cloud/KeyManager.d.ts +29 -0
  98. package/dist/esm/cloud/KeyManager.d.ts.map +1 -0
  99. package/dist/esm/cloud/KeyManager.js +135 -0
  100. package/dist/esm/cloud/KeyManager.js.map +1 -0
  101. package/dist/esm/cloud/TenantCache.d.ts +29 -0
  102. package/dist/esm/cloud/TenantCache.d.ts.map +1 -0
  103. package/dist/esm/cloud/TenantCache.js +125 -0
  104. package/dist/esm/cloud/TenantCache.js.map +1 -0
  105. package/dist/esm/cloud/index.d.ts +4 -0
  106. package/dist/esm/cloud/index.d.ts.map +1 -0
  107. package/dist/esm/cloud/index.js +4 -0
  108. package/dist/esm/cloud/index.js.map +1 -0
  109. package/dist/esm/cloud/server.d.ts +17 -0
  110. package/dist/esm/cloud/server.d.ts.map +1 -0
  111. package/dist/esm/cloud/server.js +181 -0
  112. package/dist/esm/cloud/server.js.map +1 -0
  113. package/dist/esm/cloud/types.d.ts +35 -0
  114. package/dist/esm/cloud/types.d.ts.map +1 -0
  115. package/dist/esm/cloud/types.js +11 -0
  116. package/dist/esm/cloud/types.js.map +1 -0
  117. package/dist/esm/config/index.d.ts +44 -0
  118. package/dist/esm/config/index.d.ts.map +1 -0
  119. package/dist/esm/config/index.js +151 -0
  120. package/dist/esm/config/index.js.map +1 -0
  121. package/dist/esm/consensus/ConsensusEngine.d.ts +119 -0
  122. package/dist/esm/consensus/ConsensusEngine.d.ts.map +1 -0
  123. package/dist/esm/consensus/ConsensusEngine.js +310 -0
  124. package/dist/esm/consensus/ConsensusEngine.js.map +1 -0
  125. package/dist/esm/consensus/ModelPool.d.ts +103 -0
  126. package/dist/esm/consensus/ModelPool.d.ts.map +1 -0
  127. package/dist/esm/consensus/ModelPool.js +269 -0
  128. package/dist/esm/consensus/ModelPool.js.map +1 -0
  129. package/dist/esm/consensus/index.d.ts +8 -0
  130. package/dist/esm/consensus/index.d.ts.map +1 -0
  131. package/dist/esm/consensus/index.js +8 -0
  132. package/dist/esm/consensus/index.js.map +1 -0
  133. package/dist/esm/core/AgentRegistry.d.ts +89 -0
  134. package/dist/esm/core/AgentRegistry.d.ts.map +1 -0
  135. package/dist/esm/core/AgentRegistry.js +260 -0
  136. package/dist/esm/core/AgentRegistry.js.map +1 -0
  137. package/dist/esm/core/DashboardBroadcaster.d.ts +67 -0
  138. package/dist/esm/core/DashboardBroadcaster.d.ts.map +1 -0
  139. package/dist/esm/core/DashboardBroadcaster.js +260 -0
  140. package/dist/esm/core/DashboardBroadcaster.js.map +1 -0
  141. package/dist/esm/core/OrchestrationEngine.d.ts +85 -0
  142. package/dist/esm/core/OrchestrationEngine.d.ts.map +1 -0
  143. package/dist/esm/core/OrchestrationEngine.js +457 -0
  144. package/dist/esm/core/OrchestrationEngine.js.map +1 -0
  145. package/dist/esm/core/SubconsciousEngine.d.ts +53 -0
  146. package/dist/esm/core/SubconsciousEngine.d.ts.map +1 -0
  147. package/dist/esm/core/SubconsciousEngine.js +278 -0
  148. package/dist/esm/core/SubconsciousEngine.js.map +1 -0
  149. package/dist/esm/core/WebSocketServer.d.ts +89 -0
  150. package/dist/esm/core/WebSocketServer.d.ts.map +1 -0
  151. package/dist/esm/core/WebSocketServer.js +380 -0
  152. package/dist/esm/core/WebSocketServer.js.map +1 -0
  153. package/dist/esm/core/index.d.ts +15 -0
  154. package/dist/esm/core/index.d.ts.map +1 -0
  155. package/dist/esm/core/index.js +15 -0
  156. package/dist/esm/core/index.js.map +1 -0
  157. package/dist/esm/core/router.d.ts +105 -0
  158. package/dist/esm/core/router.d.ts.map +1 -0
  159. package/dist/esm/core/router.js +416 -0
  160. package/dist/esm/core/router.js.map +1 -0
  161. package/dist/esm/embed/index.d.ts +218 -0
  162. package/dist/esm/embed/index.d.ts.map +1 -0
  163. package/dist/esm/embed/index.js +949 -0
  164. package/dist/esm/embed/index.js.map +1 -0
  165. package/dist/esm/embed.d.ts +11 -0
  166. package/dist/esm/embed.d.ts.map +1 -0
  167. package/dist/esm/embed.js +11 -0
  168. package/dist/esm/embed.js.map +1 -0
  169. package/dist/esm/examples/basic-usage.d.ts +12 -0
  170. package/dist/esm/examples/basic-usage.d.ts.map +1 -0
  171. package/dist/esm/examples/basic-usage.js +126 -0
  172. package/dist/esm/examples/basic-usage.js.map +1 -0
  173. package/dist/esm/index.d.ts +83 -0
  174. package/dist/esm/index.d.ts.map +1 -0
  175. package/dist/esm/index.js +132 -0
  176. package/dist/esm/index.js.map +1 -0
  177. package/dist/esm/package.json +3 -0
  178. package/dist/esm/protocol/flows.d.ts +126 -0
  179. package/dist/esm/protocol/flows.d.ts.map +1 -0
  180. package/dist/esm/protocol/flows.js +338 -0
  181. package/dist/esm/protocol/flows.js.map +1 -0
  182. package/dist/esm/protocol/iap.d.ts +54 -0
  183. package/dist/esm/protocol/iap.d.ts.map +1 -0
  184. package/dist/esm/protocol/iap.js +104 -0
  185. package/dist/esm/protocol/iap.js.map +1 -0
  186. package/dist/esm/protocol/index.d.ts +23 -0
  187. package/dist/esm/protocol/index.d.ts.map +1 -0
  188. package/dist/esm/protocol/index.js +28 -0
  189. package/dist/esm/protocol/index.js.map +1 -0
  190. package/dist/esm/protocol/types.d.ts +332 -0
  191. package/dist/esm/protocol/types.d.ts.map +1 -0
  192. package/dist/esm/protocol/types.js +54 -0
  193. package/dist/esm/protocol/types.js.map +1 -0
  194. package/dist/esm/protocol/utils.d.ts +130 -0
  195. package/dist/esm/protocol/utils.d.ts.map +1 -0
  196. package/dist/esm/protocol/utils.js +260 -0
  197. package/dist/esm/protocol/utils.js.map +1 -0
  198. package/dist/esm/protocol/validators.d.ts +54 -0
  199. package/dist/esm/protocol/validators.d.ts.map +1 -0
  200. package/dist/esm/protocol/validators.js +332 -0
  201. package/dist/esm/protocol/validators.js.map +1 -0
  202. package/dist/esm/security/AuthManager.d.ts +73 -0
  203. package/dist/esm/security/AuthManager.d.ts.map +1 -0
  204. package/dist/esm/security/AuthManager.js +95 -0
  205. package/dist/esm/security/AuthManager.js.map +1 -0
  206. package/dist/esm/security/MessageSanitizer.d.ts +51 -0
  207. package/dist/esm/security/MessageSanitizer.d.ts.map +1 -0
  208. package/dist/esm/security/MessageSanitizer.js +178 -0
  209. package/dist/esm/security/MessageSanitizer.js.map +1 -0
  210. package/dist/esm/security/RateLimiter.d.ts +46 -0
  211. package/dist/esm/security/RateLimiter.d.ts.map +1 -0
  212. package/dist/esm/security/RateLimiter.js +129 -0
  213. package/dist/esm/security/RateLimiter.js.map +1 -0
  214. package/dist/esm/security/SecurityMiddleware.d.ts +90 -0
  215. package/dist/esm/security/SecurityMiddleware.d.ts.map +1 -0
  216. package/dist/esm/security/SecurityMiddleware.js +144 -0
  217. package/dist/esm/security/SecurityMiddleware.js.map +1 -0
  218. package/dist/esm/security/index.d.ts +35 -0
  219. package/dist/esm/security/index.d.ts.map +1 -0
  220. package/dist/esm/security/index.js +35 -0
  221. package/dist/esm/security/index.js.map +1 -0
  222. package/dist/esm/speculative/PredictionEngine.d.ts +99 -0
  223. package/dist/esm/speculative/PredictionEngine.d.ts.map +1 -0
  224. package/dist/esm/speculative/PredictionEngine.js +284 -0
  225. package/dist/esm/speculative/PredictionEngine.js.map +1 -0
  226. package/dist/esm/speculative/SpeculativeCache.d.ts +117 -0
  227. package/dist/esm/speculative/SpeculativeCache.d.ts.map +1 -0
  228. package/dist/esm/speculative/SpeculativeCache.js +288 -0
  229. package/dist/esm/speculative/SpeculativeCache.js.map +1 -0
  230. package/dist/esm/speculative/SpeculativeEngine.d.ts +114 -0
  231. package/dist/esm/speculative/SpeculativeEngine.d.ts.map +1 -0
  232. package/dist/esm/speculative/SpeculativeEngine.js +240 -0
  233. package/dist/esm/speculative/SpeculativeEngine.js.map +1 -0
  234. package/dist/esm/speculative/WorkerPool.d.ts +109 -0
  235. package/dist/esm/speculative/WorkerPool.d.ts.map +1 -0
  236. package/dist/esm/speculative/WorkerPool.js +323 -0
  237. package/dist/esm/speculative/WorkerPool.js.map +1 -0
  238. package/dist/esm/speculative/index.d.ts +10 -0
  239. package/dist/esm/speculative/index.d.ts.map +1 -0
  240. package/dist/esm/speculative/index.js +10 -0
  241. package/dist/esm/speculative/index.js.map +1 -0
  242. package/dist/esm/subconscious/EmbeddingService.d.ts +73 -0
  243. package/dist/esm/subconscious/EmbeddingService.d.ts.map +1 -0
  244. package/dist/esm/subconscious/EmbeddingService.js +189 -0
  245. package/dist/esm/subconscious/EmbeddingService.js.map +1 -0
  246. package/dist/esm/subconscious/SemanticCache.d.ts +82 -0
  247. package/dist/esm/subconscious/SemanticCache.d.ts.map +1 -0
  248. package/dist/esm/subconscious/SemanticCache.js +160 -0
  249. package/dist/esm/subconscious/SemanticCache.js.map +1 -0
  250. package/dist/esm/subconscious/SubconsciousEngine.d.ts +121 -0
  251. package/dist/esm/subconscious/SubconsciousEngine.d.ts.map +1 -0
  252. package/dist/esm/subconscious/SubconsciousEngine.js +237 -0
  253. package/dist/esm/subconscious/SubconsciousEngine.js.map +1 -0
  254. package/dist/esm/subconscious/VectorStore.d.ts +54 -0
  255. package/dist/esm/subconscious/VectorStore.d.ts.map +1 -0
  256. package/dist/esm/subconscious/VectorStore.js +164 -0
  257. package/dist/esm/subconscious/VectorStore.js.map +1 -0
  258. package/dist/esm/subconscious/cache.d.ts +34 -0
  259. package/dist/esm/subconscious/cache.d.ts.map +1 -0
  260. package/dist/esm/subconscious/cache.js +152 -0
  261. package/dist/{subconscious → esm/subconscious}/cache.js.map +1 -1
  262. package/dist/esm/subconscious/embeddings.d.ts +25 -0
  263. package/dist/esm/subconscious/embeddings.d.ts.map +1 -0
  264. package/dist/esm/subconscious/embeddings.js +58 -0
  265. package/dist/esm/subconscious/embeddings.js.map +1 -0
  266. package/dist/esm/subconscious/index.d.ts +12 -0
  267. package/dist/esm/subconscious/index.d.ts.map +1 -0
  268. package/dist/esm/subconscious/index.js +12 -0
  269. package/dist/esm/subconscious/index.js.map +1 -0
  270. package/dist/esm/types/index.d.ts +286 -0
  271. package/dist/esm/types/index.d.ts.map +1 -0
  272. package/dist/esm/types/index.js +40 -0
  273. package/dist/esm/types/index.js.map +1 -0
  274. package/dist/esm/utils/logger.d.ts +63 -0
  275. package/dist/esm/utils/logger.d.ts.map +1 -0
  276. package/dist/esm/utils/logger.js +122 -0
  277. package/dist/esm/utils/logger.js.map +1 -0
  278. package/package.json +81 -12
  279. package/dist/cloud/KeyManager.d.ts.map +0 -1
  280. package/dist/cloud/KeyManager.js.map +0 -1
  281. package/dist/cloud/TenantCache.d.ts.map +0 -1
  282. package/dist/cloud/TenantCache.js.map +0 -1
  283. package/dist/cloud/index.d.ts.map +0 -1
  284. package/dist/cloud/index.js.map +0 -1
  285. package/dist/cloud/server.d.ts.map +0 -1
  286. package/dist/cloud/server.js.map +0 -1
  287. package/dist/cloud/types.d.ts.map +0 -1
  288. package/dist/cloud/types.js.map +0 -1
  289. package/dist/config/index.d.ts.map +0 -1
  290. package/dist/config/index.js.map +0 -1
  291. package/dist/consensus/ConsensusEngine.d.ts.map +0 -1
  292. package/dist/consensus/ConsensusEngine.js.map +0 -1
  293. package/dist/consensus/ModelPool.d.ts.map +0 -1
  294. package/dist/consensus/ModelPool.js.map +0 -1
  295. package/dist/consensus/index.d.ts.map +0 -1
  296. package/dist/consensus/index.js.map +0 -1
  297. package/dist/core/AgentRegistry.d.ts.map +0 -1
  298. package/dist/core/AgentRegistry.js.map +0 -1
  299. package/dist/core/DashboardBroadcaster.d.ts.map +0 -1
  300. package/dist/core/DashboardBroadcaster.js.map +0 -1
  301. package/dist/core/OrchestrationEngine.d.ts.map +0 -1
  302. package/dist/core/OrchestrationEngine.js.map +0 -1
  303. package/dist/core/SubconsciousEngine.d.ts.map +0 -1
  304. package/dist/core/SubconsciousEngine.js.map +0 -1
  305. package/dist/core/WebSocketServer.d.ts.map +0 -1
  306. package/dist/core/WebSocketServer.js.map +0 -1
  307. package/dist/core/index.d.ts.map +0 -1
  308. package/dist/core/index.js.map +0 -1
  309. package/dist/core/router.d.ts.map +0 -1
  310. package/dist/core/router.js.map +0 -1
  311. package/dist/embed/index.d.ts.map +0 -1
  312. package/dist/embed/index.js +0 -408
  313. package/dist/embed/index.js.map +0 -1
  314. package/dist/embed.d.ts.map +0 -1
  315. package/dist/embed.js.map +0 -1
  316. package/dist/index.d.ts.map +0 -1
  317. package/dist/index.js.map +0 -1
  318. package/dist/protocol/flows.d.ts.map +0 -1
  319. package/dist/protocol/flows.js.map +0 -1
  320. package/dist/protocol/iap.d.ts.map +0 -1
  321. package/dist/protocol/iap.js.map +0 -1
  322. package/dist/protocol/index.d.ts.map +0 -1
  323. package/dist/protocol/index.js.map +0 -1
  324. package/dist/protocol/types.d.ts.map +0 -1
  325. package/dist/protocol/types.js.map +0 -1
  326. package/dist/protocol/utils.d.ts.map +0 -1
  327. package/dist/protocol/utils.js.map +0 -1
  328. package/dist/protocol/validators.d.ts.map +0 -1
  329. package/dist/protocol/validators.js.map +0 -1
  330. package/dist/security/AuthManager.d.ts.map +0 -1
  331. package/dist/security/AuthManager.js.map +0 -1
  332. package/dist/security/MessageSanitizer.d.ts.map +0 -1
  333. package/dist/security/MessageSanitizer.js.map +0 -1
  334. package/dist/security/RateLimiter.d.ts.map +0 -1
  335. package/dist/security/RateLimiter.js.map +0 -1
  336. package/dist/security/SecurityMiddleware.d.ts.map +0 -1
  337. package/dist/security/SecurityMiddleware.js.map +0 -1
  338. package/dist/security/index.d.ts.map +0 -1
  339. package/dist/security/index.js.map +0 -1
  340. package/dist/speculative/PredictionEngine.d.ts.map +0 -1
  341. package/dist/speculative/PredictionEngine.js.map +0 -1
  342. package/dist/speculative/SpeculativeCache.d.ts.map +0 -1
  343. package/dist/speculative/SpeculativeCache.js.map +0 -1
  344. package/dist/speculative/SpeculativeEngine.d.ts.map +0 -1
  345. package/dist/speculative/SpeculativeEngine.js.map +0 -1
  346. package/dist/speculative/WorkerPool.d.ts.map +0 -1
  347. package/dist/speculative/WorkerPool.js.map +0 -1
  348. package/dist/speculative/index.d.ts.map +0 -1
  349. package/dist/speculative/index.js.map +0 -1
  350. package/dist/subconscious/EmbeddingService.d.ts.map +0 -1
  351. package/dist/subconscious/EmbeddingService.js.map +0 -1
  352. package/dist/subconscious/SemanticCache.d.ts.map +0 -1
  353. package/dist/subconscious/SemanticCache.js.map +0 -1
  354. package/dist/subconscious/SubconsciousEngine.d.ts.map +0 -1
  355. package/dist/subconscious/SubconsciousEngine.js.map +0 -1
  356. package/dist/subconscious/VectorStore.d.ts.map +0 -1
  357. package/dist/subconscious/VectorStore.js.map +0 -1
  358. package/dist/subconscious/cache.d.ts.map +0 -1
  359. package/dist/subconscious/embeddings.d.ts.map +0 -1
  360. package/dist/subconscious/embeddings.js.map +0 -1
  361. package/dist/subconscious/index.d.ts.map +0 -1
  362. package/dist/subconscious/index.js.map +0 -1
  363. package/dist/types/index.d.ts.map +0 -1
  364. package/dist/types/index.js.map +0 -1
  365. package/dist/utils/logger.d.ts.map +0 -1
  366. package/dist/utils/logger.js.map +0 -1
  367. /package/dist/{cloud → cjs/cloud}/KeyManager.d.ts +0 -0
  368. /package/dist/{cloud → cjs/cloud}/KeyManager.js +0 -0
  369. /package/dist/{cloud → cjs/cloud}/TenantCache.d.ts +0 -0
  370. /package/dist/{cloud → cjs/cloud}/TenantCache.js +0 -0
  371. /package/dist/{cloud → cjs/cloud}/index.d.ts +0 -0
  372. /package/dist/{cloud → cjs/cloud}/index.js +0 -0
  373. /package/dist/{cloud → cjs/cloud}/server.d.ts +0 -0
  374. /package/dist/{cloud → cjs/cloud}/server.js +0 -0
  375. /package/dist/{cloud → cjs/cloud}/types.d.ts +0 -0
  376. /package/dist/{cloud → cjs/cloud}/types.js +0 -0
  377. /package/dist/{config → cjs/config}/index.d.ts +0 -0
  378. /package/dist/{config → cjs/config}/index.js +0 -0
  379. /package/dist/{consensus → cjs/consensus}/ConsensusEngine.d.ts +0 -0
  380. /package/dist/{consensus → cjs/consensus}/ConsensusEngine.js +0 -0
  381. /package/dist/{consensus → cjs/consensus}/ModelPool.d.ts +0 -0
  382. /package/dist/{consensus → cjs/consensus}/ModelPool.js +0 -0
  383. /package/dist/{consensus → cjs/consensus}/index.d.ts +0 -0
  384. /package/dist/{consensus → cjs/consensus}/index.js +0 -0
  385. /package/dist/{core → cjs/core}/AgentRegistry.d.ts +0 -0
  386. /package/dist/{core → cjs/core}/AgentRegistry.js +0 -0
  387. /package/dist/{core → cjs/core}/DashboardBroadcaster.d.ts +0 -0
  388. /package/dist/{core → cjs/core}/DashboardBroadcaster.js +0 -0
  389. /package/dist/{core → cjs/core}/OrchestrationEngine.d.ts +0 -0
  390. /package/dist/{core → cjs/core}/OrchestrationEngine.js +0 -0
  391. /package/dist/{core → cjs/core}/SubconsciousEngine.d.ts +0 -0
  392. /package/dist/{core → cjs/core}/SubconsciousEngine.js +0 -0
  393. /package/dist/{core → cjs/core}/WebSocketServer.d.ts +0 -0
  394. /package/dist/{core → cjs/core}/WebSocketServer.js +0 -0
  395. /package/dist/{core → cjs/core}/index.d.ts +0 -0
  396. /package/dist/{core → cjs/core}/index.js +0 -0
  397. /package/dist/{core → cjs/core}/router.d.ts +0 -0
  398. /package/dist/{core → cjs/core}/router.js +0 -0
  399. /package/dist/{embed.d.ts → cjs/embed.d.ts} +0 -0
  400. /package/dist/{embed.js → cjs/embed.js} +0 -0
  401. /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
  402. /package/dist/{index.js → cjs/index.js} +0 -0
  403. /package/dist/{protocol → cjs/protocol}/flows.d.ts +0 -0
  404. /package/dist/{protocol → cjs/protocol}/flows.js +0 -0
  405. /package/dist/{protocol → cjs/protocol}/iap.d.ts +0 -0
  406. /package/dist/{protocol → cjs/protocol}/iap.js +0 -0
  407. /package/dist/{protocol → cjs/protocol}/index.d.ts +0 -0
  408. /package/dist/{protocol → cjs/protocol}/index.js +0 -0
  409. /package/dist/{protocol → cjs/protocol}/types.d.ts +0 -0
  410. /package/dist/{protocol → cjs/protocol}/types.js +0 -0
  411. /package/dist/{protocol → cjs/protocol}/utils.d.ts +0 -0
  412. /package/dist/{protocol → cjs/protocol}/utils.js +0 -0
  413. /package/dist/{protocol → cjs/protocol}/validators.d.ts +0 -0
  414. /package/dist/{protocol → cjs/protocol}/validators.js +0 -0
  415. /package/dist/{security → cjs/security}/AuthManager.d.ts +0 -0
  416. /package/dist/{security → cjs/security}/AuthManager.js +0 -0
  417. /package/dist/{security → cjs/security}/MessageSanitizer.d.ts +0 -0
  418. /package/dist/{security → cjs/security}/MessageSanitizer.js +0 -0
  419. /package/dist/{security → cjs/security}/RateLimiter.d.ts +0 -0
  420. /package/dist/{security → cjs/security}/RateLimiter.js +0 -0
  421. /package/dist/{security → cjs/security}/SecurityMiddleware.d.ts +0 -0
  422. /package/dist/{security → cjs/security}/SecurityMiddleware.js +0 -0
  423. /package/dist/{security → cjs/security}/index.d.ts +0 -0
  424. /package/dist/{security → cjs/security}/index.js +0 -0
  425. /package/dist/{speculative → cjs/speculative}/PredictionEngine.d.ts +0 -0
  426. /package/dist/{speculative → cjs/speculative}/PredictionEngine.js +0 -0
  427. /package/dist/{speculative → cjs/speculative}/SpeculativeCache.d.ts +0 -0
  428. /package/dist/{speculative → cjs/speculative}/SpeculativeCache.js +0 -0
  429. /package/dist/{speculative → cjs/speculative}/SpeculativeEngine.d.ts +0 -0
  430. /package/dist/{speculative → cjs/speculative}/SpeculativeEngine.js +0 -0
  431. /package/dist/{speculative → cjs/speculative}/WorkerPool.d.ts +0 -0
  432. /package/dist/{speculative → cjs/speculative}/WorkerPool.js +0 -0
  433. /package/dist/{speculative → cjs/speculative}/index.d.ts +0 -0
  434. /package/dist/{speculative → cjs/speculative}/index.js +0 -0
  435. /package/dist/{subconscious → cjs/subconscious}/EmbeddingService.d.ts +0 -0
  436. /package/dist/{subconscious → cjs/subconscious}/EmbeddingService.js +0 -0
  437. /package/dist/{subconscious → cjs/subconscious}/SemanticCache.d.ts +0 -0
  438. /package/dist/{subconscious → cjs/subconscious}/SemanticCache.js +0 -0
  439. /package/dist/{subconscious → cjs/subconscious}/SubconsciousEngine.d.ts +0 -0
  440. /package/dist/{subconscious → cjs/subconscious}/SubconsciousEngine.js +0 -0
  441. /package/dist/{subconscious → cjs/subconscious}/VectorStore.d.ts +0 -0
  442. /package/dist/{subconscious → cjs/subconscious}/VectorStore.js +0 -0
  443. /package/dist/{subconscious → cjs/subconscious}/cache.d.ts +0 -0
  444. /package/dist/{subconscious → cjs/subconscious}/cache.js +0 -0
  445. /package/dist/{subconscious → cjs/subconscious}/embeddings.d.ts +0 -0
  446. /package/dist/{subconscious → cjs/subconscious}/embeddings.js +0 -0
  447. /package/dist/{subconscious → cjs/subconscious}/index.d.ts +0 -0
  448. /package/dist/{subconscious → cjs/subconscious}/index.js +0 -0
  449. /package/dist/{types → cjs/types}/index.d.ts +0 -0
  450. /package/dist/{types → cjs/types}/index.js +0 -0
  451. /package/dist/{utils → cjs/utils}/logger.d.ts +0 -0
  452. /package/dist/{utils → cjs/utils}/logger.js +0 -0
@@ -0,0 +1,989 @@
1
+ "use strict";
2
+ /**
3
+ * Lemma Embedded Mode
4
+ *
5
+ * Zero-config semantic cache for any project.
6
+ * No separate server, no WebSocket, no agents required.
7
+ *
8
+ * Usage:
9
+ * import { Lemma } from 'lemma/embed';
10
+ *
11
+ * const lemma = await Lemma.create();
12
+ * const suggest = lemma.wrap(myOpenAIFunction);
13
+ * const result = await suggest('pollo y arroz'); // cached after first call
14
+ */
15
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ var desc = Object.getOwnPropertyDescriptor(m, k);
18
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
+ desc = { enumerable: true, get: function() { return m[k]; } };
20
+ }
21
+ Object.defineProperty(o, k2, desc);
22
+ }) : (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ o[k2] = m[k];
25
+ }));
26
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
27
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
28
+ }) : function(o, v) {
29
+ o["default"] = v;
30
+ });
31
+ var __importStar = (this && this.__importStar) || (function () {
32
+ var ownKeys = function(o) {
33
+ ownKeys = Object.getOwnPropertyNames || function (o) {
34
+ var ar = [];
35
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
36
+ return ar;
37
+ };
38
+ return ownKeys(o);
39
+ };
40
+ return function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ })();
48
+ var __importDefault = (this && this.__importDefault) || function (mod) {
49
+ return (mod && mod.__esModule) ? mod : { "default": mod };
50
+ };
51
+ Object.defineProperty(exports, "__esModule", { value: true });
52
+ exports.Lemma = void 0;
53
+ const events_1 = require("events");
54
+ const crypto_1 = __importDefault(require("crypto"));
55
+ // ─── Circuit Breaker ──────────────────────────────────────────────────────────
56
+ /**
57
+ * Circuit Breaker implementation for backend resilience.
58
+ *
59
+ * States:
60
+ * - CLOSED: Normal operation, requests pass through
61
+ * - OPEN: Too many failures, requests fail fast
62
+ * - HALF_OPEN: Testing if backend recovered, limited requests allowed
63
+ */
64
+ class BackendCircuitBreaker {
65
+ constructor(failureThreshold = 3, recoveryTimeout = 30000, successThreshold = 2) {
66
+ this.state = 'CLOSED';
67
+ this.failureCount = 0;
68
+ this.successCount = 0;
69
+ this.lastFailureTime = null;
70
+ this.failureThreshold = failureThreshold;
71
+ this.recoveryTimeout = recoveryTimeout;
72
+ this.successThreshold = successThreshold;
73
+ }
74
+ /**
75
+ * Check if a request should be allowed through.
76
+ */
77
+ canAttempt() {
78
+ if (this.state === 'CLOSED')
79
+ return true;
80
+ if (this.state === 'OPEN') {
81
+ // Check if enough time has passed to try recovery
82
+ if (this.lastFailureTime && Date.now() - this.lastFailureTime >= this.recoveryTimeout) {
83
+ this.state = 'HALF_OPEN';
84
+ this.successCount = 0;
85
+ return true;
86
+ }
87
+ return false;
88
+ }
89
+ // HALF_OPEN: allow limited requests to test recovery
90
+ return true;
91
+ }
92
+ /**
93
+ * Record a successful operation.
94
+ */
95
+ recordSuccess() {
96
+ this.failureCount = 0;
97
+ if (this.state === 'HALF_OPEN') {
98
+ this.successCount++;
99
+ if (this.successCount >= this.successThreshold) {
100
+ this.state = 'CLOSED';
101
+ this.successCount = 0;
102
+ }
103
+ }
104
+ }
105
+ /**
106
+ * Record a failed operation.
107
+ */
108
+ recordFailure() {
109
+ this.failureCount++;
110
+ this.lastFailureTime = Date.now();
111
+ if (this.state === 'HALF_OPEN') {
112
+ // Failed during recovery test, go back to OPEN
113
+ this.state = 'OPEN';
114
+ this.successCount = 0;
115
+ }
116
+ else if (this.failureCount >= this.failureThreshold) {
117
+ this.state = 'OPEN';
118
+ }
119
+ }
120
+ /**
121
+ * Get current health status.
122
+ */
123
+ getHealth() {
124
+ return {
125
+ state: this.state,
126
+ failureCount: this.failureCount,
127
+ lastFailure: this.lastFailureTime,
128
+ successCount: this.successCount,
129
+ };
130
+ }
131
+ /**
132
+ * Reset the circuit breaker to initial state.
133
+ */
134
+ reset() {
135
+ this.state = 'CLOSED';
136
+ this.failureCount = 0;
137
+ this.successCount = 0;
138
+ this.lastFailureTime = null;
139
+ }
140
+ }
141
+ /**
142
+ * Resilient wrapper for backends with circuit breaker, retries, and fallback.
143
+ *
144
+ * Features:
145
+ * - Circuit breaker to prevent cascading failures
146
+ * - Exponential backoff retries
147
+ * - Automatic fallback: Cloud → Chroma → Memory
148
+ * - Health monitoring and events
149
+ */
150
+ class ResilientBackend extends events_1.EventEmitter {
151
+ constructor(primary, fallbacks, options = {}) {
152
+ super();
153
+ this.totalFailures = 0;
154
+ this.primary = primary;
155
+ this.fallbacks = fallbacks;
156
+ this.currentBackend = primary;
157
+ this.enableFallback = options.enableFallback ?? true;
158
+ this.maxRetries = options.maxRetries ?? 3;
159
+ this.retryDelay = options.retryDelay ?? 1000;
160
+ this.circuitBreaker = new BackendCircuitBreaker(options.failureThreshold ?? 3, options.recoveryTimeout ?? 30000);
161
+ }
162
+ /**
163
+ * Execute an operation with retry logic and circuit breaker.
164
+ */
165
+ async executeWithRetry(operation, operationName) {
166
+ let lastError = null;
167
+ for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
168
+ // Check circuit breaker
169
+ if (!this.circuitBreaker.canAttempt()) {
170
+ const error = new Error(`Circuit breaker OPEN for ${operationName}`);
171
+ this.emit('backend-error', { operation: operationName, error, attempt });
172
+ throw error;
173
+ }
174
+ try {
175
+ const result = await operation();
176
+ this.circuitBreaker.recordSuccess();
177
+ // If we recovered from a previous failure
178
+ if (this.totalFailures > 0 && this.currentBackend === this.primary) {
179
+ this.emit('backend-recovered', { backend: this.getBackendName() });
180
+ }
181
+ return result;
182
+ }
183
+ catch (error) {
184
+ lastError = error;
185
+ this.circuitBreaker.recordFailure();
186
+ this.totalFailures++;
187
+ this.emit('backend-error', {
188
+ operation: operationName,
189
+ error,
190
+ attempt: attempt + 1,
191
+ maxRetries: this.maxRetries,
192
+ });
193
+ // Don't retry on last attempt
194
+ if (attempt < this.maxRetries) {
195
+ const delay = this.retryDelay * Math.pow(2, attempt);
196
+ await this.sleep(delay);
197
+ }
198
+ }
199
+ }
200
+ // All retries exhausted, try fallback
201
+ if (this.enableFallback && this.fallbacks.length > 0) {
202
+ return this.tryFallback(operation, operationName);
203
+ }
204
+ throw lastError || new Error(`${operationName} failed after ${this.maxRetries} retries`);
205
+ }
206
+ /**
207
+ * Try fallback backends in order.
208
+ */
209
+ async tryFallback(operation, operationName) {
210
+ for (const fallback of this.fallbacks) {
211
+ try {
212
+ this.currentBackend = fallback;
213
+ this.emit('backend-degraded', {
214
+ from: this.getBackendName(this.primary),
215
+ to: this.getBackendName(fallback),
216
+ });
217
+ const result = await operation();
218
+ return result;
219
+ }
220
+ catch (error) {
221
+ this.emit('backend-error', {
222
+ operation: operationName,
223
+ error,
224
+ backend: this.getBackendName(fallback),
225
+ });
226
+ // Continue to next fallback
227
+ }
228
+ }
229
+ throw new Error(`All backends failed for ${operationName}`);
230
+ }
231
+ /**
232
+ * Set operation with resilience.
233
+ */
234
+ async set(key, input, data, ttl) {
235
+ return this.executeWithRetry(() => this.currentBackend.set(key, input, data, ttl), 'set');
236
+ }
237
+ /**
238
+ * Find similar operation with resilience.
239
+ */
240
+ async findSimilar(input, threshold) {
241
+ return this.executeWithRetry(() => this.currentBackend.findSimilar(input, threshold), 'findSimilar');
242
+ }
243
+ /**
244
+ * Get backend health status.
245
+ */
246
+ getHealth() {
247
+ return {
248
+ ...this.circuitBreaker.getHealth(),
249
+ currentBackend: this.getBackendName(),
250
+ totalFailures: this.totalFailures,
251
+ };
252
+ }
253
+ /**
254
+ * Get current backend name.
255
+ */
256
+ getBackendName(backend) {
257
+ const b = backend || this.currentBackend;
258
+ if (b instanceof MemoryBackend)
259
+ return 'memory';
260
+ if (b instanceof ChromaBackend)
261
+ return 'chroma';
262
+ if (b instanceof CloudBackend)
263
+ return 'cloud';
264
+ return 'unknown';
265
+ }
266
+ /**
267
+ * Reset circuit breaker and switch back to primary.
268
+ */
269
+ reset() {
270
+ this.circuitBreaker.reset();
271
+ this.currentBackend = this.primary;
272
+ this.totalFailures = 0;
273
+ }
274
+ size() {
275
+ return this.currentBackend.size();
276
+ }
277
+ clear() {
278
+ this.currentBackend.clear();
279
+ }
280
+ /**
281
+ * Stop all backends and cleanup resources.
282
+ */
283
+ stop() {
284
+ // Stop primary backend if it has a stop method
285
+ if (this.primary instanceof MemoryBackend) {
286
+ this.primary.stop();
287
+ }
288
+ // Stop fallback backends
289
+ for (const fallback of this.fallbacks) {
290
+ if (fallback instanceof MemoryBackend) {
291
+ fallback.stop();
292
+ }
293
+ }
294
+ }
295
+ sleep(ms) {
296
+ return new Promise(resolve => setTimeout(resolve, ms));
297
+ }
298
+ }
299
+ class MemoryBackend {
300
+ constructor(maxSize = 10000, cleanupInterval = 60000, debug = false) {
301
+ this.store = new Map();
302
+ this.cleanupTimer = null;
303
+ this.evictedCount = 0;
304
+ this.lastCleanupAt = 0;
305
+ this.maxSize = maxSize;
306
+ this.cleanupInterval = cleanupInterval;
307
+ this.debug = debug;
308
+ // Start cleanup timer if interval > 0
309
+ if (this.cleanupInterval > 0) {
310
+ this.startCleanupTimer();
311
+ }
312
+ }
313
+ startCleanupTimer() {
314
+ this.cleanupTimer = setInterval(() => {
315
+ this.cleanup();
316
+ }, this.cleanupInterval);
317
+ // Prevent timer from keeping process alive
318
+ if (this.cleanupTimer.unref) {
319
+ this.cleanupTimer.unref();
320
+ }
321
+ }
322
+ /**
323
+ * Clean up expired entries from the store
324
+ */
325
+ cleanup() {
326
+ const now = Date.now();
327
+ let evicted = 0;
328
+ for (const [key, entry] of this.store.entries()) {
329
+ if (entry.ttl > 0 && now - entry.createdAt > entry.ttl) {
330
+ this.store.delete(key);
331
+ evicted++;
332
+ }
333
+ }
334
+ if (evicted > 0) {
335
+ this.evictedCount += evicted;
336
+ this.lastCleanupAt = now;
337
+ if (this.debug) {
338
+ console.log(`[Lemma] 🧹 Cleanup: evicted ${evicted} expired entries (total: ${this.evictedCount})`);
339
+ }
340
+ }
341
+ return evicted;
342
+ }
343
+ /**
344
+ * Stop cleanup timer for graceful shutdown
345
+ */
346
+ stop() {
347
+ if (this.cleanupTimer) {
348
+ clearInterval(this.cleanupTimer);
349
+ this.cleanupTimer = null;
350
+ if (this.debug) {
351
+ console.log('[Lemma] 🛑 Cleanup timer stopped');
352
+ }
353
+ }
354
+ }
355
+ async set(key, input, data, ttl) {
356
+ // Evict oldest entry if at capacity
357
+ if (this.store.size >= this.maxSize) {
358
+ const oldest = this.store.keys().next().value;
359
+ if (oldest) {
360
+ this.store.delete(oldest);
361
+ this.evictedCount++;
362
+ }
363
+ }
364
+ this.store.set(key, { key, input, data, createdAt: Date.now(), ttl });
365
+ }
366
+ async get(key) {
367
+ const entry = this.store.get(key);
368
+ if (!entry)
369
+ return null;
370
+ if (entry.ttl > 0 && Date.now() - entry.createdAt > entry.ttl) {
371
+ this.store.delete(key);
372
+ this.evictedCount++;
373
+ return null;
374
+ }
375
+ return entry.data;
376
+ }
377
+ /**
378
+ * Exact key lookup — used for memory mode (no vector similarity)
379
+ */
380
+ async findSimilar(input, _threshold) {
381
+ // In memory mode we do exact normalized match
382
+ const normalized = normalizeText(input);
383
+ for (const entry of this.store.values()) {
384
+ // Check if expired
385
+ if (entry.ttl > 0 && Date.now() - entry.createdAt > entry.ttl) {
386
+ this.store.delete(entry.key);
387
+ this.evictedCount++;
388
+ continue;
389
+ }
390
+ if (normalizeText(entry.input) === normalized) {
391
+ return { data: entry.data, similarity: 1.0 };
392
+ }
393
+ }
394
+ return null;
395
+ }
396
+ size() {
397
+ return this.store.size;
398
+ }
399
+ getEvictedCount() {
400
+ return this.evictedCount;
401
+ }
402
+ getLastCleanupAt() {
403
+ return this.lastCleanupAt;
404
+ }
405
+ clear() {
406
+ this.store.clear();
407
+ this.evictedCount = 0;
408
+ this.lastCleanupAt = 0;
409
+ }
410
+ }
411
+ class SemanticMemoryBackend {
412
+ constructor(maxSize = 10000, modelName = 'Xenova/all-MiniLM-L6-v2') {
413
+ this.store = new Map();
414
+ this.pipeline = null;
415
+ this.embeddingCache = new Map();
416
+ this.evictedCount = 0;
417
+ this.maxSize = maxSize;
418
+ this.modelName = modelName;
419
+ }
420
+ /**
421
+ * Lazy-load the transformers.js pipeline
422
+ */
423
+ async initialize() {
424
+ if (this.pipeline)
425
+ return;
426
+ try {
427
+ // @ts-ignore - Optional dependency
428
+ const { pipeline } = await Promise.resolve().then(() => __importStar(require('@xenova/transformers')));
429
+ this.pipeline = await pipeline('feature-extraction', this.modelName);
430
+ }
431
+ catch (err) {
432
+ throw new Error(`Lemma: Could not load @xenova/transformers.\n` +
433
+ `Install it with: npm install @xenova/transformers\n` +
434
+ `Original error: ${err.message}`);
435
+ }
436
+ }
437
+ async set(key, input, data, ttl) {
438
+ await this.initialize();
439
+ // Evict oldest entry if at capacity
440
+ if (this.store.size >= this.maxSize) {
441
+ const oldest = this.store.keys().next().value;
442
+ if (oldest) {
443
+ this.store.delete(oldest);
444
+ this.evictedCount++;
445
+ }
446
+ }
447
+ const embedding = await this.embed(input);
448
+ this.store.set(key, {
449
+ key,
450
+ input,
451
+ embedding,
452
+ data,
453
+ createdAt: Date.now(),
454
+ ttl,
455
+ });
456
+ }
457
+ async findSimilar(input, threshold) {
458
+ await this.initialize();
459
+ if (this.store.size === 0)
460
+ return null;
461
+ const queryEmbedding = await this.embed(input);
462
+ let bestMatch = null;
463
+ let bestSimilarity = -1;
464
+ for (const entry of this.store.values()) {
465
+ // Check TTL
466
+ if (entry.ttl > 0 && Date.now() - entry.createdAt > entry.ttl) {
467
+ this.store.delete(entry.key);
468
+ this.evictedCount++;
469
+ continue;
470
+ }
471
+ const similarity = cosineSimilarity(queryEmbedding, entry.embedding);
472
+ if (similarity > bestSimilarity && similarity >= threshold) {
473
+ bestSimilarity = similarity;
474
+ bestMatch = { data: entry.data, similarity };
475
+ }
476
+ }
477
+ return bestMatch;
478
+ }
479
+ /**
480
+ * Generate embedding with caching
481
+ */
482
+ async embed(text) {
483
+ const normalized = normalizeText(text);
484
+ if (this.embeddingCache.has(normalized)) {
485
+ return this.embeddingCache.get(normalized);
486
+ }
487
+ const output = await this.pipeline(text, {
488
+ pooling: 'mean',
489
+ normalize: true,
490
+ });
491
+ // Convert tensor to array
492
+ const embedding = Array.from(output.data);
493
+ // Cache the embedding
494
+ this.embeddingCache.set(normalized, embedding);
495
+ // Limit cache size
496
+ if (this.embeddingCache.size > this.maxSize) {
497
+ const firstKey = this.embeddingCache.keys().next().value;
498
+ if (firstKey)
499
+ this.embeddingCache.delete(firstKey);
500
+ }
501
+ return embedding;
502
+ }
503
+ size() {
504
+ return this.store.size;
505
+ }
506
+ getEvictedCount() {
507
+ return this.evictedCount;
508
+ }
509
+ getLastCleanupAt() {
510
+ return 0; // Semantic backend doesn't have scheduled cleanup
511
+ }
512
+ stop() {
513
+ // No cleanup timer to stop in semantic backend
514
+ }
515
+ clear() {
516
+ this.store.clear();
517
+ this.embeddingCache.clear();
518
+ this.evictedCount = 0;
519
+ }
520
+ }
521
+ /**
522
+ * Calculate cosine similarity between two vectors
523
+ */
524
+ function cosineSimilarity(a, b) {
525
+ if (a.length !== b.length) {
526
+ throw new Error('Vectors must have the same length');
527
+ }
528
+ let dotProduct = 0;
529
+ let normA = 0;
530
+ let normB = 0;
531
+ for (let i = 0; i < a.length; i++) {
532
+ dotProduct += a[i] * b[i];
533
+ normA += a[i] * a[i];
534
+ normB += b[i] * b[i];
535
+ }
536
+ const denominator = Math.sqrt(normA) * Math.sqrt(normB);
537
+ if (denominator === 0)
538
+ return 0;
539
+ return dotProduct / denominator;
540
+ }
541
+ // ─── ChromaDB + Ollama Backend ────────────────────────────────────────────────
542
+ class ChromaBackend {
543
+ constructor(chromaUrl, ollamaUrl, model, collection) {
544
+ this.embeddingCache = new Map();
545
+ // Lazy-loaded to avoid import errors when not using chroma
546
+ this.chromaClient = null;
547
+ this.chromaCollection = null;
548
+ this.chromaUrl = chromaUrl;
549
+ this.ollamaUrl = ollamaUrl;
550
+ this.model = model;
551
+ this.collection = collection;
552
+ }
553
+ async initialize() {
554
+ try {
555
+ const { ChromaClient } = await Promise.resolve().then(() => __importStar(require('chromadb')));
556
+ this.chromaClient = new ChromaClient({ path: this.chromaUrl });
557
+ this.chromaCollection = await this.chromaClient.getOrCreateCollection({
558
+ name: this.collection,
559
+ metadata: { 'hnsw:space': 'cosine' },
560
+ });
561
+ }
562
+ catch (err) {
563
+ throw new Error(`Lemma: Could not connect to ChromaDB at ${this.chromaUrl}.\n` +
564
+ `Make sure ChromaDB is running: chroma run --path ./chroma_data\n` +
565
+ `Original error: ${err.message}`);
566
+ }
567
+ }
568
+ async set(key, input, data, _ttl) {
569
+ const embedding = await this.embed(input);
570
+ await this.chromaCollection.add({
571
+ ids: [key],
572
+ embeddings: [embedding],
573
+ documents: [input],
574
+ metadatas: [{ data: JSON.stringify(data), timestamp: Date.now() }],
575
+ });
576
+ }
577
+ async findSimilar(input, threshold) {
578
+ const embedding = await this.embed(input);
579
+ const results = await this.chromaCollection.query({
580
+ queryEmbeddings: [embedding],
581
+ nResults: 1,
582
+ include: ['metadatas', 'distances'],
583
+ });
584
+ if (!results.ids?.[0]?.length)
585
+ return null;
586
+ const distance = results.distances[0][0];
587
+ const similarity = 1 - distance;
588
+ if (similarity < threshold)
589
+ return null;
590
+ const meta = results.metadatas[0][0];
591
+ return { data: JSON.parse(meta.data), similarity };
592
+ }
593
+ async embed(text) {
594
+ const key = normalizeText(text);
595
+ if (this.embeddingCache.has(key))
596
+ return this.embeddingCache.get(key);
597
+ const axios = (await Promise.resolve().then(() => __importStar(require('axios')))).default;
598
+ const res = await axios.post(`${this.ollamaUrl}/api/embeddings`, {
599
+ model: this.model,
600
+ prompt: text,
601
+ });
602
+ const embedding = res.data.embedding;
603
+ this.embeddingCache.set(key, embedding);
604
+ return embedding;
605
+ }
606
+ size() {
607
+ return 0; // ChromaDB doesn't expose sync count
608
+ }
609
+ getEvictedCount() {
610
+ return 0;
611
+ }
612
+ getLastCleanupAt() {
613
+ return 0;
614
+ }
615
+ stop() {
616
+ // No cleanup needed for ChromaDB
617
+ }
618
+ clear() {
619
+ this.embeddingCache.clear();
620
+ }
621
+ }
622
+ // ─── Cloud Backend ────────────────────────────────────────────────────────────
623
+ class CloudBackend {
624
+ constructor(apiKey, cloudUrl) {
625
+ this.axios = null;
626
+ this.apiKey = apiKey;
627
+ this.cloudUrl = cloudUrl.replace(/\/$/, '');
628
+ }
629
+ async initialize() {
630
+ this.axios = (await Promise.resolve().then(() => __importStar(require('axios')))).default;
631
+ // Validate key on startup
632
+ try {
633
+ await this.axios.get(`${this.cloudUrl}/v1/ping`, {
634
+ headers: { Authorization: `Bearer ${this.apiKey}` },
635
+ timeout: 5000,
636
+ });
637
+ }
638
+ catch (err) {
639
+ const status = err.response?.status;
640
+ if (status === 401)
641
+ throw new Error('Lemma Cloud: Invalid API key. Check your key at https://lemma.dev');
642
+ if (status === 403)
643
+ throw new Error('Lemma Cloud: API key suspended or plan limit reached.');
644
+ throw new Error(`Lemma Cloud: Could not connect to ${this.cloudUrl}. ${err.message}`);
645
+ }
646
+ }
647
+ async set(key, input, data, ttl) {
648
+ await this.axios.post(`${this.cloudUrl}/v1/cache`, { key, input, data, ttl }, { headers: { Authorization: `Bearer ${this.apiKey}` }, timeout: 10000 });
649
+ }
650
+ async findSimilar(input, threshold) {
651
+ try {
652
+ const res = await this.axios.post(`${this.cloudUrl}/v1/query`, { input, threshold }, { headers: { Authorization: `Bearer ${this.apiKey}` }, timeout: 10000 });
653
+ if (res.data?.hit) {
654
+ return { data: res.data.data, similarity: res.data.similarity };
655
+ }
656
+ return null;
657
+ }
658
+ catch (err) {
659
+ // On cloud error, degrade gracefully — treat as miss
660
+ if (err.response?.status === 429)
661
+ throw new Error('Lemma Cloud: Rate limit exceeded. Upgrade your plan at https://lemma.dev');
662
+ return null;
663
+ }
664
+ }
665
+ size() { return -1; }
666
+ getEvictedCount() { return 0; }
667
+ getLastCleanupAt() { return 0; }
668
+ stop() {
669
+ // No cleanup needed for cloud backend
670
+ }
671
+ clear() { }
672
+ }
673
+ class Lemma extends events_1.EventEmitter {
674
+ constructor(config) {
675
+ super();
676
+ this.metrics = { hits: 0, misses: 0, totalLatency: 0 };
677
+ this.ready = false;
678
+ this.config = config;
679
+ }
680
+ /**
681
+ * Create and initialize a Lemma instance.
682
+ *
683
+ * @example
684
+ * // Zero config — in-memory cache
685
+ * const lemma = await Lemma.create();
686
+ *
687
+ * @example
688
+ * // Semantic cache with lightweight embeddings
689
+ * const lemma = await Lemma.create({
690
+ * storage: 'semantic',
691
+ * threshold: 0.85,
692
+ * });
693
+ *
694
+ * @example
695
+ * // Persistent semantic cache with ChromaDB
696
+ * const lemma = await Lemma.create({
697
+ * storage: 'chroma',
698
+ * threshold: 0.90,
699
+ * });
700
+ */
701
+ static async create(config = {}) {
702
+ const resolved = {
703
+ storage: config.storage ?? 'memory',
704
+ threshold: config.threshold ?? 0.92,
705
+ apiKey: config.apiKey ?? '',
706
+ cloudUrl: config.cloudUrl ?? 'https://api.lemma.dev',
707
+ chromaUrl: config.chromaUrl ?? 'http://localhost:8000',
708
+ ollamaUrl: config.ollamaUrl ?? 'http://localhost:11434',
709
+ ollamaModel: config.ollamaModel ?? 'llama3',
710
+ embeddingModel: config.embeddingModel ?? 'Xenova/all-MiniLM-L6-v2',
711
+ collection: config.collection ?? 'lemma_cache',
712
+ ttl: config.ttl ?? 0,
713
+ maxSize: config.maxSize ?? 10000,
714
+ cleanupInterval: config.cleanupInterval ?? 60000,
715
+ debug: config.debug ?? false,
716
+ enableFallback: config.enableFallback ?? true,
717
+ maxRetries: config.maxRetries ?? 3,
718
+ retryDelay: config.retryDelay ?? 1000,
719
+ };
720
+ const instance = new Lemma(resolved);
721
+ await instance.init();
722
+ return instance;
723
+ }
724
+ async init() {
725
+ let primary;
726
+ const fallbacks = [];
727
+ // Initialize primary backend based on storage config
728
+ if (this.config.storage === 'cloud') {
729
+ if (!this.config.apiKey) {
730
+ throw new Error('Lemma Cloud requires an API key. Get yours at https://lemma.dev\nUsage: Lemma.create({ storage: \'cloud\', apiKey: \'lk_...\' })');
731
+ }
732
+ const cloudBackend = new CloudBackend(this.config.apiKey, this.config.cloudUrl);
733
+ await cloudBackend.initialize();
734
+ primary = cloudBackend;
735
+ this.log('✅ Primary backend: cloud');
736
+ // Add fallbacks: Cloud → Chroma → Memory
737
+ if (this.config.enableFallback) {
738
+ try {
739
+ const chromaBackend = new ChromaBackend(this.config.chromaUrl, this.config.ollamaUrl, this.config.ollamaModel, this.config.collection);
740
+ await chromaBackend.initialize();
741
+ fallbacks.push(chromaBackend);
742
+ this.log('✅ Fallback backend: chroma');
743
+ }
744
+ catch (err) {
745
+ this.log(`⚠️ Chroma fallback unavailable: ${err.message}`);
746
+ }
747
+ const memoryBackend = new MemoryBackend(this.config.maxSize, this.config.cleanupInterval, this.config.debug);
748
+ fallbacks.push(memoryBackend);
749
+ this.log('✅ Fallback backend: memory');
750
+ }
751
+ }
752
+ else if (this.config.storage === 'semantic') {
753
+ // Try to use semantic backend, fallback to memory if transformers not available
754
+ try {
755
+ const semanticBackend = new SemanticMemoryBackend(this.config.maxSize, this.config.embeddingModel);
756
+ await semanticBackend.initialize();
757
+ primary = semanticBackend;
758
+ this.log(`✅ Primary backend: semantic (model: ${this.config.embeddingModel})`);
759
+ }
760
+ catch (err) {
761
+ this.log(`⚠️ Semantic backend unavailable: ${err.message}`);
762
+ this.log('⚠️ Falling back to exact-match memory backend');
763
+ primary = new MemoryBackend(this.config.maxSize, this.config.cleanupInterval, this.config.debug);
764
+ this.log('✅ Primary backend: memory (fallback mode)');
765
+ }
766
+ // Add memory fallback for semantic
767
+ if (this.config.enableFallback && !(primary instanceof MemoryBackend)) {
768
+ const memoryBackend = new MemoryBackend(this.config.maxSize, this.config.cleanupInterval, this.config.debug);
769
+ fallbacks.push(memoryBackend);
770
+ this.log('✅ Fallback backend: memory');
771
+ }
772
+ }
773
+ else if (this.config.storage === 'chroma') {
774
+ const chromaBackend = new ChromaBackend(this.config.chromaUrl, this.config.ollamaUrl, this.config.ollamaModel, this.config.collection);
775
+ await chromaBackend.initialize();
776
+ primary = chromaBackend;
777
+ this.log('✅ Primary backend: chroma');
778
+ // Add memory fallback for chroma
779
+ if (this.config.enableFallback) {
780
+ const memoryBackend = new MemoryBackend(this.config.maxSize, this.config.cleanupInterval, this.config.debug);
781
+ fallbacks.push(memoryBackend);
782
+ this.log('✅ Fallback backend: memory');
783
+ }
784
+ }
785
+ else {
786
+ primary = new MemoryBackend(this.config.maxSize, this.config.cleanupInterval, this.config.debug);
787
+ this.log('✅ Primary backend: memory');
788
+ }
789
+ // Wrap primary backend with ResilientBackend (only if needed)
790
+ if (this.config.enableFallback || (this.config.maxRetries && this.config.maxRetries > 0)) {
791
+ this.backend = new ResilientBackend(primary, fallbacks, {
792
+ enableFallback: this.config.enableFallback,
793
+ maxRetries: this.config.maxRetries,
794
+ retryDelay: this.config.retryDelay,
795
+ });
796
+ // Forward backend events to Lemma instance
797
+ this.backend.on('backend-error', (data) => {
798
+ this.log(`❌ Backend error: ${data.operation} (attempt ${data.attempt}/${data.maxRetries})`);
799
+ this.emit('backend-error', data);
800
+ });
801
+ this.backend.on('backend-degraded', (data) => {
802
+ this.log(`⚠️ Backend degraded: ${data.from} → ${data.to}`);
803
+ this.emit('backend-degraded', data);
804
+ });
805
+ this.backend.on('backend-recovered', (data) => {
806
+ this.log(`✅ Backend recovered: ${data.backend}`);
807
+ this.emit('backend-recovered', data);
808
+ });
809
+ this.log('✅ Lemma ready with resilient backend');
810
+ }
811
+ else {
812
+ // Use primary backend directly without resilience wrapper
813
+ this.backend = primary;
814
+ this.log('✅ Lemma ready (direct backend, no resilience)');
815
+ }
816
+ this.ready = true;
817
+ }
818
+ /**
819
+ * Wrap any async function with semantic caching.
820
+ * The first argument of the function is used as the cache key.
821
+ *
822
+ * @example
823
+ * const cachedSuggest = lemma.wrap(async (ingredients: string) => {
824
+ * return await openai.chat.completions.create({ ... });
825
+ * });
826
+ *
827
+ * await cachedSuggest('pollo y arroz'); // calls OpenAI
828
+ * await cachedSuggest('arroz con pollo'); // returns from cache ⚡
829
+ */
830
+ wrap(fn) {
831
+ return async (...args) => {
832
+ const input = args[0];
833
+ return this.run(input, () => fn(...args));
834
+ };
835
+ }
836
+ /**
837
+ * Manually check cache and run function if miss.
838
+ *
839
+ * @example
840
+ * const result = await lemma.run(
841
+ * userMessage,
842
+ * () => openai.chat.completions.create({ ... })
843
+ * );
844
+ * if (result.fromCache) console.log('⚡ Saved an API call!');
845
+ */
846
+ async run(input, fn) {
847
+ this.assertReady();
848
+ const start = Date.now();
849
+ // Check cache
850
+ const cached = await this.backend.findSimilar(input, this.config.threshold);
851
+ if (cached) {
852
+ const latencyMs = Date.now() - start;
853
+ this.metrics.hits++;
854
+ this.metrics.totalLatency += latencyMs;
855
+ this.log(`⚡ Cache hit (similarity: ${cached.similarity.toFixed(3)}, ${latencyMs}ms)`);
856
+ this.emit('hit', { input, similarity: cached.similarity, latencyMs });
857
+ return { data: cached.data, fromCache: true, similarity: cached.similarity, latencyMs };
858
+ }
859
+ // Cache miss — run the function
860
+ this.metrics.misses++;
861
+ const data = await fn();
862
+ const latencyMs = Date.now() - start;
863
+ this.metrics.totalLatency += latencyMs;
864
+ // Store result (await to ensure it's stored before returning)
865
+ const key = generateKey(input);
866
+ try {
867
+ await this.backend.set(key, input, data, this.config.ttl);
868
+ }
869
+ catch (err) {
870
+ this.log(`⚠️ Failed to store in cache: ${err.message}`);
871
+ }
872
+ this.log(`🔄 Cache miss (${latencyMs}ms) — stored for future use`);
873
+ this.emit('miss', { input, latencyMs });
874
+ return { data, fromCache: false, latencyMs };
875
+ }
876
+ /**
877
+ * Manually get a value from cache.
878
+ * Returns null if not found.
879
+ */
880
+ async get(input) {
881
+ this.assertReady();
882
+ const start = Date.now();
883
+ const cached = await this.backend.findSimilar(input, this.config.threshold);
884
+ if (!cached)
885
+ return null;
886
+ return {
887
+ data: cached.data,
888
+ fromCache: true,
889
+ similarity: cached.similarity,
890
+ latencyMs: Date.now() - start,
891
+ };
892
+ }
893
+ /**
894
+ * Manually store a value in cache.
895
+ */
896
+ async set(input, data) {
897
+ this.assertReady();
898
+ const key = generateKey(input);
899
+ await this.backend.set(key, input, data, this.config.ttl);
900
+ this.log(`📦 Stored: "${input.slice(0, 50)}..."`);
901
+ }
902
+ /**
903
+ * Get performance metrics.
904
+ */
905
+ getMetrics() {
906
+ const total = this.metrics.hits + this.metrics.misses;
907
+ const health = this.backend.getHealth();
908
+ // Determine backend health status
909
+ let backendHealth = 'healthy';
910
+ if (health.state === 'OPEN') {
911
+ backendHealth = 'down';
912
+ }
913
+ else if (health.state === 'HALF_OPEN' || health.currentBackend !== this.getStorageType()) {
914
+ backendHealth = 'degraded';
915
+ }
916
+ return {
917
+ hits: this.metrics.hits,
918
+ misses: this.metrics.misses,
919
+ total,
920
+ hitRate: total > 0 ? this.metrics.hits / total : 0,
921
+ avgLatencyMs: total > 0 ? Math.round(this.metrics.totalLatency / total) : 0,
922
+ cacheSize: this.backend.size(),
923
+ backendHealth,
924
+ failureCount: health.totalFailures,
925
+ evictedCount: 0, // Will be implemented per backend
926
+ lastCleanupAt: 0, // Will be implemented per backend
927
+ };
928
+ }
929
+ /**
930
+ * Get backend health information.
931
+ */
932
+ getBackendHealth() {
933
+ return this.backend.getHealth();
934
+ }
935
+ /**
936
+ * Get the configured storage type.
937
+ */
938
+ getStorageType() {
939
+ return this.config.storage;
940
+ }
941
+ /**
942
+ * Clear all cached entries and reset metrics.
943
+ */
944
+ clear() {
945
+ this.backend.clear();
946
+ this.metrics = { hits: 0, misses: 0, totalLatency: 0 };
947
+ this.log('🗑️ Cache cleared');
948
+ }
949
+ /**
950
+ * Update similarity threshold at runtime.
951
+ */
952
+ setThreshold(threshold) {
953
+ if (threshold < 0 || threshold > 1)
954
+ throw new Error('Threshold must be 0–1');
955
+ this.config.threshold = threshold;
956
+ }
957
+ /**
958
+ * Stop cleanup timer and perform graceful shutdown.
959
+ * Call this before your application exits to prevent memory leaks.
960
+ *
961
+ * @example
962
+ * const lemma = await Lemma.create();
963
+ * // ... use lemma ...
964
+ * lemma.stop(); // cleanup before exit
965
+ */
966
+ stop() {
967
+ this.backend.stop();
968
+ this.log('🛑 Lemma stopped');
969
+ }
970
+ assertReady() {
971
+ if (!this.ready)
972
+ throw new Error('Lemma not initialized. Use Lemma.create()');
973
+ }
974
+ log(msg) {
975
+ if (this.config.debug)
976
+ console.log(`[Lemma] ${msg}`);
977
+ }
978
+ }
979
+ exports.Lemma = Lemma;
980
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
981
+ function normalizeText(text) {
982
+ return text.trim().toLowerCase().replace(/\s+/g, ' ');
983
+ }
984
+ function generateKey(input) {
985
+ return crypto_1.default.createHash('sha256').update(normalizeText(input)).digest('hex').slice(0, 16);
986
+ }
987
+ // ─── Default export ───────────────────────────────────────────────────────────
988
+ exports.default = Lemma;
989
+ //# sourceMappingURL=index.js.map