@measureoneinc/savant 1.0.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 (398) hide show
  1. package/README-SDK.md +148 -0
  2. package/dist/ai/agents/domain-identifier.agent.d.ts +34 -0
  3. package/dist/ai/agents/domain-identifier.agent.d.ts.map +1 -0
  4. package/dist/ai/agents/domain-identifier.agent.js +176 -0
  5. package/dist/ai/agents/domain-identifier.agent.js.map +1 -0
  6. package/dist/ai/agents/dynamic-agent.d.ts +105 -0
  7. package/dist/ai/agents/dynamic-agent.d.ts.map +1 -0
  8. package/dist/ai/agents/dynamic-agent.js +505 -0
  9. package/dist/ai/agents/dynamic-agent.js.map +1 -0
  10. package/dist/ai/agents/executor.agent.d.ts +25 -0
  11. package/dist/ai/agents/executor.agent.d.ts.map +1 -0
  12. package/dist/ai/agents/executor.agent.js +44 -0
  13. package/dist/ai/agents/executor.agent.js.map +1 -0
  14. package/dist/ai/agents/index.d.ts +17 -0
  15. package/dist/ai/agents/index.d.ts.map +1 -0
  16. package/dist/ai/agents/index.js +29 -0
  17. package/dist/ai/agents/index.js.map +1 -0
  18. package/dist/ai/agents/knowledge.agent.d.ts +25 -0
  19. package/dist/ai/agents/knowledge.agent.d.ts.map +1 -0
  20. package/dist/ai/agents/knowledge.agent.js +42 -0
  21. package/dist/ai/agents/knowledge.agent.js.map +1 -0
  22. package/dist/ai/agents/learning.agent.d.ts +63 -0
  23. package/dist/ai/agents/learning.agent.d.ts.map +1 -0
  24. package/dist/ai/agents/learning.agent.js +288 -0
  25. package/dist/ai/agents/learning.agent.js.map +1 -0
  26. package/dist/ai/agents/orchestrator.agent.d.ts +26 -0
  27. package/dist/ai/agents/orchestrator.agent.d.ts.map +1 -0
  28. package/dist/ai/agents/orchestrator.agent.js +42 -0
  29. package/dist/ai/agents/orchestrator.agent.js.map +1 -0
  30. package/dist/ai/agents/planner.agent.d.ts +25 -0
  31. package/dist/ai/agents/planner.agent.d.ts.map +1 -0
  32. package/dist/ai/agents/planner.agent.js +36 -0
  33. package/dist/ai/agents/planner.agent.js.map +1 -0
  34. package/dist/ai/agents/response-parser.d.ts +23 -0
  35. package/dist/ai/agents/response-parser.d.ts.map +1 -0
  36. package/dist/ai/agents/response-parser.js +313 -0
  37. package/dist/ai/agents/response-parser.js.map +1 -0
  38. package/dist/ai/agents/summarizer.agent.d.ts +38 -0
  39. package/dist/ai/agents/summarizer.agent.d.ts.map +1 -0
  40. package/dist/ai/agents/summarizer.agent.js +245 -0
  41. package/dist/ai/agents/summarizer.agent.js.map +1 -0
  42. package/dist/ai/instructions/domain-identifier.instructions.d.ts +10 -0
  43. package/dist/ai/instructions/domain-identifier.instructions.d.ts.map +1 -0
  44. package/dist/ai/instructions/domain-identifier.instructions.js +63 -0
  45. package/dist/ai/instructions/domain-identifier.instructions.js.map +1 -0
  46. package/dist/ai/instructions/executor.instructions.d.ts +11 -0
  47. package/dist/ai/instructions/executor.instructions.d.ts.map +1 -0
  48. package/dist/ai/instructions/executor.instructions.js +218 -0
  49. package/dist/ai/instructions/executor.instructions.js.map +1 -0
  50. package/dist/ai/instructions/knowledge.instructions.d.ts +11 -0
  51. package/dist/ai/instructions/knowledge.instructions.d.ts.map +1 -0
  52. package/dist/ai/instructions/knowledge.instructions.js +145 -0
  53. package/dist/ai/instructions/knowledge.instructions.js.map +1 -0
  54. package/dist/ai/instructions/learning.instructions.d.ts +11 -0
  55. package/dist/ai/instructions/learning.instructions.d.ts.map +1 -0
  56. package/dist/ai/instructions/learning.instructions.js +226 -0
  57. package/dist/ai/instructions/learning.instructions.js.map +1 -0
  58. package/dist/ai/instructions/orchestrator.instructions.d.ts +11 -0
  59. package/dist/ai/instructions/orchestrator.instructions.d.ts.map +1 -0
  60. package/dist/ai/instructions/orchestrator.instructions.js +148 -0
  61. package/dist/ai/instructions/orchestrator.instructions.js.map +1 -0
  62. package/dist/ai/instructions/planner.instructions.d.ts +12 -0
  63. package/dist/ai/instructions/planner.instructions.d.ts.map +1 -0
  64. package/dist/ai/instructions/planner.instructions.js +129 -0
  65. package/dist/ai/instructions/planner.instructions.js.map +1 -0
  66. package/dist/ai/instructions/summarizer.instructions.d.ts +11 -0
  67. package/dist/ai/instructions/summarizer.instructions.d.ts.map +1 -0
  68. package/dist/ai/instructions/summarizer.instructions.js +84 -0
  69. package/dist/ai/instructions/summarizer.instructions.js.map +1 -0
  70. package/dist/ai/learning/execution-learner.d.ts +79 -0
  71. package/dist/ai/learning/execution-learner.d.ts.map +1 -0
  72. package/dist/ai/learning/execution-learner.js +536 -0
  73. package/dist/ai/learning/execution-learner.js.map +1 -0
  74. package/dist/ai/response_handlers/base-handler.d.ts +73 -0
  75. package/dist/ai/response_handlers/base-handler.d.ts.map +1 -0
  76. package/dist/ai/response_handlers/base-handler.js +153 -0
  77. package/dist/ai/response_handlers/base-handler.js.map +1 -0
  78. package/dist/ai/response_handlers/direct-response-handler.d.ts +18 -0
  79. package/dist/ai/response_handlers/direct-response-handler.d.ts.map +1 -0
  80. package/dist/ai/response_handlers/direct-response-handler.js +86 -0
  81. package/dist/ai/response_handlers/direct-response-handler.js.map +1 -0
  82. package/dist/ai/response_handlers/error-handler.d.ts +13 -0
  83. package/dist/ai/response_handlers/error-handler.d.ts.map +1 -0
  84. package/dist/ai/response_handlers/error-handler.js +72 -0
  85. package/dist/ai/response_handlers/error-handler.js.map +1 -0
  86. package/dist/ai/response_handlers/handler-registry.d.ts +51 -0
  87. package/dist/ai/response_handlers/handler-registry.d.ts.map +1 -0
  88. package/dist/ai/response_handlers/handler-registry.js +268 -0
  89. package/dist/ai/response_handlers/handler-registry.js.map +1 -0
  90. package/dist/ai/response_handlers/index.d.ts +16 -0
  91. package/dist/ai/response_handlers/index.d.ts.map +1 -0
  92. package/dist/ai/response_handlers/index.js +29 -0
  93. package/dist/ai/response_handlers/index.js.map +1 -0
  94. package/dist/ai/response_handlers/message-handler.d.ts +23 -0
  95. package/dist/ai/response_handlers/message-handler.d.ts.map +1 -0
  96. package/dist/ai/response_handlers/message-handler.js +193 -0
  97. package/dist/ai/response_handlers/message-handler.js.map +1 -0
  98. package/dist/ai/response_handlers/plan-ready-handler.d.ts +26 -0
  99. package/dist/ai/response_handlers/plan-ready-handler.d.ts.map +1 -0
  100. package/dist/ai/response_handlers/plan-ready-handler.js +394 -0
  101. package/dist/ai/response_handlers/plan-ready-handler.js.map +1 -0
  102. package/dist/ai/response_handlers/request-input-handler.d.ts +14 -0
  103. package/dist/ai/response_handlers/request-input-handler.d.ts.map +1 -0
  104. package/dist/ai/response_handlers/request-input-handler.js +87 -0
  105. package/dist/ai/response_handlers/request-input-handler.js.map +1 -0
  106. package/dist/ai/response_handlers/request-plan-handler.d.ts +18 -0
  107. package/dist/ai/response_handlers/request-plan-handler.d.ts.map +1 -0
  108. package/dist/ai/response_handlers/request-plan-handler.js +143 -0
  109. package/dist/ai/response_handlers/request-plan-handler.js.map +1 -0
  110. package/dist/ai/response_handlers/step-complete-handler.d.ts +22 -0
  111. package/dist/ai/response_handlers/step-complete-handler.d.ts.map +1 -0
  112. package/dist/ai/response_handlers/step-complete-handler.js +307 -0
  113. package/dist/ai/response_handlers/step-complete-handler.js.map +1 -0
  114. package/dist/ai/response_handlers/unknown-handler.d.ts +12 -0
  115. package/dist/ai/response_handlers/unknown-handler.d.ts.map +1 -0
  116. package/dist/ai/response_handlers/unknown-handler.js +27 -0
  117. package/dist/ai/response_handlers/unknown-handler.js.map +1 -0
  118. package/dist/ai/response_handlers/user-input-handler.d.ts +20 -0
  119. package/dist/ai/response_handlers/user-input-handler.d.ts.map +1 -0
  120. package/dist/ai/response_handlers/user-input-handler.js +69 -0
  121. package/dist/ai/response_handlers/user-input-handler.js.map +1 -0
  122. package/dist/ai/tools/log-step.d.ts +29 -0
  123. package/dist/ai/tools/log-step.d.ts.map +1 -0
  124. package/dist/ai/tools/log-step.js +47 -0
  125. package/dist/ai/tools/log-step.js.map +1 -0
  126. package/dist/app.d.ts +15 -0
  127. package/dist/app.d.ts.map +1 -0
  128. package/dist/app.js +223 -0
  129. package/dist/app.js.map +1 -0
  130. package/dist/config/environment/local.d.ts +12 -0
  131. package/dist/config/environment/local.d.ts.map +1 -0
  132. package/dist/config/environment/local.js +124 -0
  133. package/dist/config/environment/local.js.map +1 -0
  134. package/dist/config/environment/production.d.ts +7 -0
  135. package/dist/config/environment/production.d.ts.map +1 -0
  136. package/dist/config/environment/production.js +105 -0
  137. package/dist/config/environment/production.js.map +1 -0
  138. package/dist/config/environment/test.d.ts +7 -0
  139. package/dist/config/environment/test.d.ts.map +1 -0
  140. package/dist/config/environment/test.js +97 -0
  141. package/dist/config/environment/test.js.map +1 -0
  142. package/dist/config/index.d.ts +219 -0
  143. package/dist/config/index.d.ts.map +1 -0
  144. package/dist/config/index.js +360 -0
  145. package/dist/config/index.js.map +1 -0
  146. package/dist/controllers/agent_request.controller.d.ts +43 -0
  147. package/dist/controllers/agent_request.controller.d.ts.map +1 -0
  148. package/dist/controllers/agent_request.controller.js +141 -0
  149. package/dist/controllers/agent_request.controller.js.map +1 -0
  150. package/dist/controllers/base.controller.d.ts +208 -0
  151. package/dist/controllers/base.controller.d.ts.map +1 -0
  152. package/dist/controllers/base.controller.js +378 -0
  153. package/dist/controllers/base.controller.js.map +1 -0
  154. package/dist/controllers/conversations.controller.d.ts +31 -0
  155. package/dist/controllers/conversations.controller.d.ts.map +1 -0
  156. package/dist/controllers/conversations.controller.js +138 -0
  157. package/dist/controllers/conversations.controller.js.map +1 -0
  158. package/dist/controllers/knowledge.controller.d.ts +63 -0
  159. package/dist/controllers/knowledge.controller.d.ts.map +1 -0
  160. package/dist/controllers/knowledge.controller.js +311 -0
  161. package/dist/controllers/knowledge.controller.js.map +1 -0
  162. package/dist/controllers/mcp.controller.d.ts +25 -0
  163. package/dist/controllers/mcp.controller.d.ts.map +1 -0
  164. package/dist/controllers/mcp.controller.js +93 -0
  165. package/dist/controllers/mcp.controller.js.map +1 -0
  166. package/dist/index.d.ts +12 -0
  167. package/dist/index.d.ts.map +1 -0
  168. package/dist/index.js +25 -0
  169. package/dist/index.js.map +1 -0
  170. package/dist/lib/app-constants.d.ts +231 -0
  171. package/dist/lib/app-constants.d.ts.map +1 -0
  172. package/dist/lib/app-constants.js +240 -0
  173. package/dist/lib/app-constants.js.map +1 -0
  174. package/dist/lib/controller-utils.d.ts +48 -0
  175. package/dist/lib/controller-utils.d.ts.map +1 -0
  176. package/dist/lib/controller-utils.js +70 -0
  177. package/dist/lib/controller-utils.js.map +1 -0
  178. package/dist/lib/exceptions/app-exceptions.d.ts +158 -0
  179. package/dist/lib/exceptions/app-exceptions.d.ts.map +1 -0
  180. package/dist/lib/exceptions/app-exceptions.js +287 -0
  181. package/dist/lib/exceptions/app-exceptions.js.map +1 -0
  182. package/dist/lib/middleware/upload.middleware.d.ts +13 -0
  183. package/dist/lib/middleware/upload.middleware.d.ts.map +1 -0
  184. package/dist/lib/middleware/upload.middleware.js +35 -0
  185. package/dist/lib/middleware/upload.middleware.js.map +1 -0
  186. package/dist/lib/middleware/validation.middleware.d.ts +29 -0
  187. package/dist/lib/middleware/validation.middleware.d.ts.map +1 -0
  188. package/dist/lib/middleware/validation.middleware.js +219 -0
  189. package/dist/lib/middleware/validation.middleware.js.map +1 -0
  190. package/dist/lib/model/validation-schema/submit-message.schema.d.ts +3 -0
  191. package/dist/lib/model/validation-schema/submit-message.schema.d.ts.map +1 -0
  192. package/dist/lib/model/validation-schema/submit-message.schema.js +40 -0
  193. package/dist/lib/model/validation-schema/submit-message.schema.js.map +1 -0
  194. package/dist/lib/model/validation-schema/update-knowledge.schema.d.ts +3 -0
  195. package/dist/lib/model/validation-schema/update-knowledge.schema.d.ts.map +1 -0
  196. package/dist/lib/model/validation-schema/update-knowledge.schema.js +35 -0
  197. package/dist/lib/model/validation-schema/update-knowledge.schema.js.map +1 -0
  198. package/dist/lib/open-ai-event-processor.d.ts +101 -0
  199. package/dist/lib/open-ai-event-processor.d.ts.map +1 -0
  200. package/dist/lib/open-ai-event-processor.js +426 -0
  201. package/dist/lib/open-ai-event-processor.js.map +1 -0
  202. package/dist/lib/schemas/ai-responses.schema.d.ts +617 -0
  203. package/dist/lib/schemas/ai-responses.schema.d.ts.map +1 -0
  204. package/dist/lib/schemas/ai-responses.schema.js +377 -0
  205. package/dist/lib/schemas/ai-responses.schema.js.map +1 -0
  206. package/dist/lib/schemas/common.schemas.d.ts +84 -0
  207. package/dist/lib/schemas/common.schemas.d.ts.map +1 -0
  208. package/dist/lib/schemas/common.schemas.js +87 -0
  209. package/dist/lib/schemas/common.schemas.js.map +1 -0
  210. package/dist/lib/schemas/conversation.schema.d.ts +28 -0
  211. package/dist/lib/schemas/conversation.schema.d.ts.map +1 -0
  212. package/dist/lib/schemas/conversation.schema.js +31 -0
  213. package/dist/lib/schemas/conversation.schema.js.map +1 -0
  214. package/dist/lib/schemas/http-client.schema.d.ts +39 -0
  215. package/dist/lib/schemas/http-client.schema.d.ts.map +1 -0
  216. package/dist/lib/schemas/http-client.schema.js +36 -0
  217. package/dist/lib/schemas/http-client.schema.js.map +1 -0
  218. package/dist/lib/schemas/index.d.ts +95 -0
  219. package/dist/lib/schemas/index.d.ts.map +1 -0
  220. package/dist/lib/schemas/index.js +32 -0
  221. package/dist/lib/schemas/index.js.map +1 -0
  222. package/dist/lib/schemas/knowledge.schema.d.ts +145 -0
  223. package/dist/lib/schemas/knowledge.schema.d.ts.map +1 -0
  224. package/dist/lib/schemas/knowledge.schema.js +81 -0
  225. package/dist/lib/schemas/knowledge.schema.js.map +1 -0
  226. package/dist/lib/schemas/orchestration.schema.d.ts +168 -0
  227. package/dist/lib/schemas/orchestration.schema.d.ts.map +1 -0
  228. package/dist/lib/schemas/orchestration.schema.js +133 -0
  229. package/dist/lib/schemas/orchestration.schema.js.map +1 -0
  230. package/dist/lib/schemas/plan.schema.d.ts +103 -0
  231. package/dist/lib/schemas/plan.schema.d.ts.map +1 -0
  232. package/dist/lib/schemas/plan.schema.js +58 -0
  233. package/dist/lib/schemas/plan.schema.js.map +1 -0
  234. package/dist/lib/sequelize-service.d.ts +23 -0
  235. package/dist/lib/sequelize-service.d.ts.map +1 -0
  236. package/dist/lib/sequelize-service.js +446 -0
  237. package/dist/lib/sequelize-service.js.map +1 -0
  238. package/dist/lib/source-hash.d.ts +39 -0
  239. package/dist/lib/source-hash.d.ts.map +1 -0
  240. package/dist/lib/source-hash.js +56 -0
  241. package/dist/lib/source-hash.js.map +1 -0
  242. package/dist/lib/stable-stringify.d.ts +32 -0
  243. package/dist/lib/stable-stringify.d.ts.map +1 -0
  244. package/dist/lib/stable-stringify.js +72 -0
  245. package/dist/lib/stable-stringify.js.map +1 -0
  246. package/dist/lib/streaming-utils.d.ts +60 -0
  247. package/dist/lib/streaming-utils.d.ts.map +1 -0
  248. package/dist/lib/streaming-utils.js +190 -0
  249. package/dist/lib/streaming-utils.js.map +1 -0
  250. package/dist/lib/utils/conversation-builder.d.ts +36 -0
  251. package/dist/lib/utils/conversation-builder.d.ts.map +1 -0
  252. package/dist/lib/utils/conversation-builder.js +132 -0
  253. package/dist/lib/utils/conversation-builder.js.map +1 -0
  254. package/dist/lib/utils/domain-matcher.d.ts +25 -0
  255. package/dist/lib/utils/domain-matcher.d.ts.map +1 -0
  256. package/dist/lib/utils/domain-matcher.js +42 -0
  257. package/dist/lib/utils/domain-matcher.js.map +1 -0
  258. package/dist/lib/utils/file-util.d.ts +157 -0
  259. package/dist/lib/utils/file-util.d.ts.map +1 -0
  260. package/dist/lib/utils/file-util.js +373 -0
  261. package/dist/lib/utils/file-util.js.map +1 -0
  262. package/dist/lib/utils/html-summarizer.d.ts +27 -0
  263. package/dist/lib/utils/html-summarizer.d.ts.map +1 -0
  264. package/dist/lib/utils/html-summarizer.js +189 -0
  265. package/dist/lib/utils/html-summarizer.js.map +1 -0
  266. package/dist/lib/utils/http-client.d.ts +108 -0
  267. package/dist/lib/utils/http-client.d.ts.map +1 -0
  268. package/dist/lib/utils/http-client.js +298 -0
  269. package/dist/lib/utils/http-client.js.map +1 -0
  270. package/dist/lib/utils/index.d.ts +12 -0
  271. package/dist/lib/utils/index.d.ts.map +1 -0
  272. package/dist/lib/utils/index.js +28 -0
  273. package/dist/lib/utils/index.js.map +1 -0
  274. package/dist/lib/utils/logger.d.ts +30 -0
  275. package/dist/lib/utils/logger.d.ts.map +1 -0
  276. package/dist/lib/utils/logger.js +88 -0
  277. package/dist/lib/utils/logger.js.map +1 -0
  278. package/dist/lib/utils/mcp-utils.d.ts +208 -0
  279. package/dist/lib/utils/mcp-utils.d.ts.map +1 -0
  280. package/dist/lib/utils/mcp-utils.js +451 -0
  281. package/dist/lib/utils/mcp-utils.js.map +1 -0
  282. package/dist/lib/utils/sequelize-service.d.ts +153 -0
  283. package/dist/lib/utils/sequelize-service.d.ts.map +1 -0
  284. package/dist/lib/utils/sequelize-service.js +339 -0
  285. package/dist/lib/utils/sequelize-service.js.map +1 -0
  286. package/dist/lib/utils/tool-call-extractor.d.ts +36 -0
  287. package/dist/lib/utils/tool-call-extractor.d.ts.map +1 -0
  288. package/dist/lib/utils/tool-call-extractor.js +121 -0
  289. package/dist/lib/utils/tool-call-extractor.js.map +1 -0
  290. package/dist/lib/utils/zod-to-json-schema.d.ts +17 -0
  291. package/dist/lib/utils/zod-to-json-schema.d.ts.map +1 -0
  292. package/dist/lib/utils/zod-to-json-schema.js +53 -0
  293. package/dist/lib/utils/zod-to-json-schema.js.map +1 -0
  294. package/dist/models/AgentRequest.d.ts +33 -0
  295. package/dist/models/AgentRequest.d.ts.map +1 -0
  296. package/dist/models/AgentRequest.js +49 -0
  297. package/dist/models/AgentRequest.js.map +1 -0
  298. package/dist/models/AgentRun.d.ts +44 -0
  299. package/dist/models/AgentRun.d.ts.map +1 -0
  300. package/dist/models/AgentRun.js +53 -0
  301. package/dist/models/AgentRun.js.map +1 -0
  302. package/dist/models/AuditLog.d.ts +37 -0
  303. package/dist/models/AuditLog.d.ts.map +1 -0
  304. package/dist/models/AuditLog.js +46 -0
  305. package/dist/models/AuditLog.js.map +1 -0
  306. package/dist/models/Conversation.d.ts +39 -0
  307. package/dist/models/Conversation.d.ts.map +1 -0
  308. package/dist/models/Conversation.js +49 -0
  309. package/dist/models/Conversation.js.map +1 -0
  310. package/dist/models/Embedding.d.ts +56 -0
  311. package/dist/models/Embedding.d.ts.map +1 -0
  312. package/dist/models/Embedding.js +36 -0
  313. package/dist/models/Embedding.js.map +1 -0
  314. package/dist/models/ExecutionPattern.d.ts +57 -0
  315. package/dist/models/ExecutionPattern.d.ts.map +1 -0
  316. package/dist/models/ExecutionPattern.js +61 -0
  317. package/dist/models/ExecutionPattern.js.map +1 -0
  318. package/dist/models/Knowledge.d.ts +49 -0
  319. package/dist/models/Knowledge.d.ts.map +1 -0
  320. package/dist/models/Knowledge.js +67 -0
  321. package/dist/models/Knowledge.js.map +1 -0
  322. package/dist/models/KnowledgeRevision.d.ts +35 -0
  323. package/dist/models/KnowledgeRevision.d.ts.map +1 -0
  324. package/dist/models/KnowledgeRevision.js +51 -0
  325. package/dist/models/KnowledgeRevision.js.map +1 -0
  326. package/dist/models/Plan.d.ts +34 -0
  327. package/dist/models/Plan.d.ts.map +1 -0
  328. package/dist/models/Plan.js +43 -0
  329. package/dist/models/Plan.js.map +1 -0
  330. package/dist/models/PlanStep.d.ts +56 -0
  331. package/dist/models/PlanStep.d.ts.map +1 -0
  332. package/dist/models/PlanStep.js +65 -0
  333. package/dist/models/PlanStep.js.map +1 -0
  334. package/dist/models/SourceData.d.ts +39 -0
  335. package/dist/models/SourceData.d.ts.map +1 -0
  336. package/dist/models/SourceData.js +18 -0
  337. package/dist/models/SourceData.js.map +1 -0
  338. package/dist/models/index.d.ts +36 -0
  339. package/dist/models/index.d.ts.map +1 -0
  340. package/dist/models/index.js +179 -0
  341. package/dist/models/index.js.map +1 -0
  342. package/dist/routes/agent.routes.d.ts +13 -0
  343. package/dist/routes/agent.routes.d.ts.map +1 -0
  344. package/dist/routes/agent.routes.js +27 -0
  345. package/dist/routes/agent.routes.js.map +1 -0
  346. package/dist/routes/agent_request.routes.d.ts +13 -0
  347. package/dist/routes/agent_request.routes.d.ts.map +1 -0
  348. package/dist/routes/agent_request.routes.js +65 -0
  349. package/dist/routes/agent_request.routes.js.map +1 -0
  350. package/dist/routes/knowledge.routes.d.ts +13 -0
  351. package/dist/routes/knowledge.routes.d.ts.map +1 -0
  352. package/dist/routes/knowledge.routes.js +91 -0
  353. package/dist/routes/knowledge.routes.js.map +1 -0
  354. package/dist/routes/mcp.routes.d.ts +14 -0
  355. package/dist/routes/mcp.routes.d.ts.map +1 -0
  356. package/dist/routes/mcp.routes.js +27 -0
  357. package/dist/routes/mcp.routes.js.map +1 -0
  358. package/dist/sdk/index.d.ts +13 -0
  359. package/dist/sdk/index.d.ts.map +1 -0
  360. package/dist/sdk/index.js +35 -0
  361. package/dist/sdk/index.js.map +1 -0
  362. package/dist/sdk/savant.sdk.d.ts +53 -0
  363. package/dist/sdk/savant.sdk.d.ts.map +1 -0
  364. package/dist/sdk/savant.sdk.js +120 -0
  365. package/dist/sdk/savant.sdk.js.map +1 -0
  366. package/dist/services/agent-request-service.d.ts +104 -0
  367. package/dist/services/agent-request-service.d.ts.map +1 -0
  368. package/dist/services/agent-request-service.js +319 -0
  369. package/dist/services/agent-request-service.js.map +1 -0
  370. package/dist/services/audit_log.service.d.ts +104 -0
  371. package/dist/services/audit_log.service.d.ts.map +1 -0
  372. package/dist/services/audit_log.service.js +339 -0
  373. package/dist/services/audit_log.service.js.map +1 -0
  374. package/dist/services/conversation.service.d.ts +90 -0
  375. package/dist/services/conversation.service.d.ts.map +1 -0
  376. package/dist/services/conversation.service.js +552 -0
  377. package/dist/services/conversation.service.js.map +1 -0
  378. package/dist/services/domain.service.d.ts +58 -0
  379. package/dist/services/domain.service.d.ts.map +1 -0
  380. package/dist/services/domain.service.js +244 -0
  381. package/dist/services/domain.service.js.map +1 -0
  382. package/dist/services/embedding.service.d.ts +132 -0
  383. package/dist/services/embedding.service.d.ts.map +1 -0
  384. package/dist/services/embedding.service.js +587 -0
  385. package/dist/services/embedding.service.js.map +1 -0
  386. package/dist/services/file_upload.service.d.ts +50 -0
  387. package/dist/services/file_upload.service.d.ts.map +1 -0
  388. package/dist/services/file_upload.service.js +172 -0
  389. package/dist/services/file_upload.service.js.map +1 -0
  390. package/dist/services/knowledge.service.d.ts +200 -0
  391. package/dist/services/knowledge.service.d.ts.map +1 -0
  392. package/dist/services/knowledge.service.js +784 -0
  393. package/dist/services/knowledge.service.js.map +1 -0
  394. package/dist/types/responses-api.types.d.ts +181 -0
  395. package/dist/types/responses-api.types.d.ts.map +1 -0
  396. package/dist/types/responses-api.types.js +12 -0
  397. package/dist/types/responses-api.types.js.map +1 -0
  398. package/package.json +145 -0
@@ -0,0 +1,587 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Embedding Service
4
+ *
5
+ * Service for generating embeddings using Gemini and storing them in the database.
6
+ *
7
+ * @author MeasureOne, Inc.
8
+ * @version 1.0.0
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.EmbeddingService = void 0;
12
+ const genai_1 = require("@google/genai");
13
+ const logger_1 = require("../lib/utils/logger");
14
+ const models_1 = require("../models");
15
+ const uuid_1 = require("uuid");
16
+ const config_1 = require("../config");
17
+ const sequelize_service_1 = require("../lib/sequelize-service");
18
+ const sequelize_1 = require("sequelize");
19
+ const faiss_node_1 = require("faiss-node");
20
+ const logger = (0, logger_1.create_default_logger)("embedding-service");
21
+ /**
22
+ * Chunk text into smaller pieces with overlap
23
+ */
24
+ function create_chunks(text, chunk_size = 1200, overlap = 150) {
25
+ const chunks = [];
26
+ let start = 0;
27
+ while (start < text.length) {
28
+ const end = Math.min(start + chunk_size, text.length);
29
+ chunks.push(text.slice(start, end));
30
+ if (end >= text.length)
31
+ break;
32
+ start = Math.max(start + 1, end - overlap);
33
+ }
34
+ return chunks;
35
+ }
36
+ class EmbeddingService {
37
+ constructor() {
38
+ this.default_model = "text-embedding-004"; // Gemini embedding model
39
+ // Query embedding cache (Phase 1 optimization)
40
+ // Primary strategy: Semantic similarity (embeddings indexed by hash)
41
+ // Secondary strategy: Exact text match (fast path, but rare for user queries)
42
+ this.query_embedding_cache = new Map();
43
+ this.EMBEDDING_CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
44
+ this.MAX_EMBEDDING_CACHE_SIZE = 1000;
45
+ this.SEMANTIC_SIMILARITY_THRESHOLD = 0.92; // Lower threshold for better cache hits (was 0.95)
46
+ this.MAX_SEMANTIC_CHECKS = 50; // Limit similarity checks to prevent O(n) on large cache
47
+ // In-memory Faiss index for fast vector search
48
+ this.faiss_index_cache = new Map();
49
+ this.is_index_building = false;
50
+ const api_key = config_1.config_utils.get("GEMINI_API_KEY");
51
+ if (!api_key) {
52
+ throw new Error("GEMINI_API_KEY not configured");
53
+ }
54
+ this.gemini = new genai_1.GoogleGenAI({ apiKey: api_key });
55
+ }
56
+ /**
57
+ * Builds or retrieves a cached Faiss index for a given model.
58
+ * This is the core of the search optimization.
59
+ * @param model - The embedding model name (e.g., "text-embedding-004")
60
+ */
61
+ async get_or_build_faiss_index(model) {
62
+ if (this.faiss_index_cache.has(model)) {
63
+ return this.faiss_index_cache.get(model);
64
+ }
65
+ if (this.is_index_building) {
66
+ logger.info("Faiss index is already being built, waiting...");
67
+ // Simple wait loop, can be improved with event emitters for production
68
+ await new Promise(resolve => setTimeout(resolve, 2000));
69
+ return this.get_or_build_faiss_index(model);
70
+ }
71
+ try {
72
+ this.is_index_building = true;
73
+ logger.info(`Building Faiss index for model: ${model}...`);
74
+ const embeddings = await models_1.EmbeddingModel.findAll({
75
+ where: { model },
76
+ attributes: ['id', 'embedding', 'text', 'knowledge_id', 'knowledge_revision_id', 'source_data_id', 'chunk_index', 'type', 'domain'],
77
+ });
78
+ if (embeddings.length === 0) {
79
+ logger.warn(`No embeddings found for model ${model} to build index.`);
80
+ return null;
81
+ }
82
+ const dimension = JSON.parse(embeddings[0].embedding).length;
83
+ const index = new faiss_node_1.Index(dimension);
84
+ const vectors = [];
85
+ const metadata = [];
86
+ for (const emb of embeddings) {
87
+ try {
88
+ const vector = JSON.parse(emb.embedding);
89
+ // Validate vector dimension
90
+ if (!Array.isArray(vector) || vector.length !== dimension) {
91
+ logger.warn(`Skipping embedding with invalid dimension: ${emb.id} (expected ${dimension}, got ${Array.isArray(vector) ? vector.length : 'not an array'})`);
92
+ continue;
93
+ }
94
+ vectors.push(vector);
95
+ metadata.push({
96
+ id: emb.id,
97
+ text: emb.text,
98
+ knowledge_id: emb.knowledge_id,
99
+ knowledge_revision_id: emb.knowledge_revision_id,
100
+ source_data_id: emb.source_data_id,
101
+ chunk_index: emb.chunk_index,
102
+ type: emb.type,
103
+ domain: emb.domain,
104
+ });
105
+ }
106
+ catch (e) {
107
+ logger.warn(`Skipping invalid embedding record: ${emb.id}`, { error: e instanceof Error ? e.message : String(e) });
108
+ }
109
+ }
110
+ if (vectors.length > 0) {
111
+ // Add vectors one at a time (faiss-node add method expects single vector)
112
+ for (const vector of vectors) {
113
+ index.add(vector);
114
+ }
115
+ const index_data = { index, metadata };
116
+ this.faiss_index_cache.set(model, index_data);
117
+ logger.info(`✅ Faiss index built for model ${model} with ${index.ntotal()} vectors.`);
118
+ return index_data;
119
+ }
120
+ return null;
121
+ }
122
+ catch (error) {
123
+ logger.error(`❌ Failed to build Faiss index for model ${model}`, { error });
124
+ return null;
125
+ }
126
+ finally {
127
+ this.is_index_building = false;
128
+ }
129
+ }
130
+ /**
131
+ * Generate embedding with caching (Phase 1 optimization)
132
+ * Caches query embeddings to avoid redundant API calls
133
+ *
134
+ * Cache strategy (optimized for user-generated queries):
135
+ * 1. Quick exact text check (O(1) - fast path, but rare for user queries)
136
+ * 2. Generate embedding and check semantic similarity (primary strategy)
137
+ * 3. Cache by semantic similarity, not exact text (since exact matches are rare)
138
+ *
139
+ * Rationale: User queries are semantically similar but textually different.
140
+ * Exact text caching has low hit rate, so we prioritize semantic similarity.
141
+ */
142
+ async generate_embedding_cached(text, model) {
143
+ const normalized_text = text.toLowerCase().trim();
144
+ const exact_cache_key = `${model}:${normalized_text}`;
145
+ // Step 1: Quick exact text check (O(1) - worth checking but expect low hit rate)
146
+ const exact_cached = this.query_embedding_cache.get(exact_cache_key);
147
+ if (exact_cached && Date.now() - exact_cached.timestamp < this.EMBEDDING_CACHE_TTL_MS) {
148
+ logger.debug('Query embedding cache hit (exact match)', {
149
+ cache_key: exact_cache_key.substring(0, 50) + '...',
150
+ cache_size: this.query_embedding_cache.size
151
+ });
152
+ return exact_cached.embedding;
153
+ }
154
+ // Step 2: Generate embedding (we need it anyway for semantic comparison)
155
+ const query_embedding = await this.generate_embedding(text, model);
156
+ const query_norm = Math.sqrt(query_embedding.reduce((sum, val) => sum + val * val, 0));
157
+ // Step 3: Check for semantically similar cached embeddings (primary strategy)
158
+ // Only check if cache has entries
159
+ if (this.query_embedding_cache.size > 0) {
160
+ const similar_match = this.find_similar_cached_embedding_sync(query_embedding, query_norm, model, this.SEMANTIC_SIMILARITY_THRESHOLD);
161
+ if (similar_match) {
162
+ logger.debug('Query embedding cache hit (semantic match)', {
163
+ query_text: text.substring(0, 50) + '...',
164
+ cache_size: this.query_embedding_cache.size,
165
+ threshold: this.SEMANTIC_SIMILARITY_THRESHOLD
166
+ });
167
+ // Cache exact text too (in case same user retries exact query)
168
+ // But don't duplicate the embedding - just reference it
169
+ this.set_cache_entry(exact_cache_key, query_embedding, query_norm, text);
170
+ return similar_match;
171
+ }
172
+ }
173
+ // Step 4: No match found - cache the new embedding
174
+ logger.debug('Query embedding cache miss, caching new embedding', {
175
+ cache_key: exact_cache_key.substring(0, 50) + '...',
176
+ cache_size: this.query_embedding_cache.size
177
+ });
178
+ this.set_cache_entry(exact_cache_key, query_embedding, query_norm, text);
179
+ return query_embedding;
180
+ }
181
+ /**
182
+ * Set cache entry with LRU eviction
183
+ * Stores embedding with pre-computed norm for faster similarity calculations
184
+ */
185
+ set_cache_entry(cache_key, embedding, embedding_norm, original_text) {
186
+ // Pre-compute norm if not provided
187
+ const norm = embedding_norm || Math.sqrt(embedding.reduce((sum, val) => sum + val * val, 0));
188
+ // LRU eviction: Remove oldest entry if cache is full
189
+ if (this.query_embedding_cache.size >= this.MAX_EMBEDDING_CACHE_SIZE) {
190
+ const oldest_key = Array.from(this.query_embedding_cache.entries())
191
+ .sort((a, b) => a[1].timestamp - b[1].timestamp)[0][0];
192
+ this.query_embedding_cache.delete(oldest_key);
193
+ logger.debug('Evicted oldest cache entry', {
194
+ evicted_key: oldest_key.substring(0, 50) + '...',
195
+ remaining_size: this.query_embedding_cache.size
196
+ });
197
+ }
198
+ this.query_embedding_cache.set(cache_key, {
199
+ embedding,
200
+ embedding_norm: norm,
201
+ timestamp: Date.now(),
202
+ original_text: original_text || cache_key
203
+ });
204
+ }
205
+ /**
206
+ * Find semantically similar cached embedding (synchronous version)
207
+ * Checks cached embeddings for high similarity (>= threshold)
208
+ *
209
+ * Optimization: Limits checks to prevent O(n) performance on large cache
210
+ * Uses pre-computed norms for faster similarity calculation
211
+ *
212
+ * @param query_embedding - Pre-computed query embedding vector
213
+ * @param query_norm - Pre-computed query embedding norm
214
+ * @param model - Embedding model
215
+ * @param similarity_threshold - Minimum similarity threshold
216
+ * @returns Matching embedding or null
217
+ */
218
+ find_similar_cached_embedding_sync(query_embedding, query_norm, model, similarity_threshold) {
219
+ const now = Date.now();
220
+ let checked_count = 0;
221
+ let best_match = null;
222
+ // Check cached embeddings (limit checks for performance)
223
+ for (const [cache_key, cached] of this.query_embedding_cache.entries()) {
224
+ // Only check embeddings from the same model
225
+ if (!cache_key.startsWith(`${model}:`)) {
226
+ continue;
227
+ }
228
+ // Skip if cache entry is expired
229
+ if (now - cached.timestamp >= this.EMBEDDING_CACHE_TTL_MS) {
230
+ continue;
231
+ }
232
+ // Limit number of similarity checks to prevent O(n) on large cache
233
+ if (checked_count >= this.MAX_SEMANTIC_CHECKS) {
234
+ break;
235
+ }
236
+ // Calculate similarity using pre-computed norms
237
+ const similarity = this.cosine_similarity_optimized(query_embedding, cached.embedding, query_norm, cached.embedding_norm);
238
+ checked_count++;
239
+ // Track best match (even if below threshold, in case we want to lower threshold later)
240
+ if (!best_match || similarity > best_match.similarity) {
241
+ best_match = { embedding: cached.embedding, similarity };
242
+ }
243
+ // Return immediately if we find a match above threshold
244
+ if (similarity >= similarity_threshold) {
245
+ logger.debug('Found semantically similar cached embedding', {
246
+ cache_key: cache_key.substring(0, 50) + '...',
247
+ similarity: similarity.toFixed(4),
248
+ checked_count
249
+ });
250
+ return cached.embedding;
251
+ }
252
+ }
253
+ // Log if we checked but didn't find a match
254
+ if (checked_count > 0 && best_match) {
255
+ logger.debug('No semantic match found above threshold', {
256
+ best_similarity: best_match.similarity.toFixed(4),
257
+ threshold: similarity_threshold,
258
+ checked_count,
259
+ cache_size: this.query_embedding_cache.size
260
+ });
261
+ }
262
+ return null;
263
+ }
264
+ /**
265
+ * Generate embedding for a single text using Gemini
266
+ *
267
+ * @param text - Text to embed
268
+ * @param model - Embedding model (default: text-embedding-004)
269
+ * @returns Promise resolving to embedding vector
270
+ */
271
+ async generate_embedding(text, model) {
272
+ try {
273
+ const embedding_model = model || this.default_model;
274
+ logger.debug("Generating embedding using Gemini", {
275
+ model: embedding_model,
276
+ text_length: text.length,
277
+ });
278
+ // Use Gemini's embedding API
279
+ // The @google/genai package uses models.embedContent method
280
+ const result = await this.gemini.models.embedContent({
281
+ model: embedding_model,
282
+ contents: [{
283
+ parts: [{ text }]
284
+ }]
285
+ });
286
+ // Extract embedding values from the response
287
+ // Gemini returns embeddings array, get the first one
288
+ const embedding_values = result.embeddings?.[0]?.values;
289
+ if (!embedding_values || embedding_values.length === 0) {
290
+ throw new Error("No embedding returned from Gemini");
291
+ }
292
+ logger.debug("Embedding generated successfully", {
293
+ model: embedding_model,
294
+ embedding_dimension: embedding_values.length,
295
+ });
296
+ return embedding_values;
297
+ }
298
+ catch (error) {
299
+ logger.error("Failed to generate embedding", { error });
300
+ throw new Error(`Failed to generate embedding: ${error instanceof Error ? error.message : "Unknown error"}`);
301
+ }
302
+ }
303
+ /**
304
+ * Create embeddings for a document (works for both SEED and LEARNING types)
305
+ * This method chunks text, generates embeddings, and stores them in the database.
306
+ *
307
+ * @param knowledge_id - Required knowledge ID (must exist)
308
+ * @param knowledge_revision_id - Required revision ID (must exist)
309
+ * @param text - Text content to create embeddings for
310
+ * @param source_data_id - Optional source data ID
311
+ * @param model - Optional embedding model (defaults to default_model)
312
+ * @param type - Embedding type (SEED or LEARNING)
313
+ * @param domain - Required domain (normalized to lowercase)
314
+ *
315
+ * Note: This does NOT search for similar documents or create knowledge/revision.
316
+ * The caller must ensure knowledge_id and knowledge_revision_id already exist.
317
+ */
318
+ async create_embeddings_for_document(knowledge_id, knowledge_revision_id, text, source_data_id, model, type, domain) {
319
+ // Validate required parameters
320
+ if (!knowledge_id || !knowledge_revision_id) {
321
+ throw new Error("knowledge_id and knowledge_revision_id are required for all embedding types");
322
+ }
323
+ // Validate domain
324
+ if (!domain || domain.trim().length === 0) {
325
+ throw new Error("Domain is required for all embedding types (SEED and LEARNING)");
326
+ }
327
+ // Normalize domain to lowercase for consistency
328
+ const normalized_domain = domain.trim().toLowerCase();
329
+ const embedding_model = model || this.default_model;
330
+ logger.info("Processing document for embeddings", {
331
+ knowledge_id,
332
+ knowledge_revision_id,
333
+ chunks_count: 0, // Will be set after chunking
334
+ model: embedding_model,
335
+ domain: normalized_domain
336
+ });
337
+ // Chunk the text
338
+ const chunks = create_chunks(text, 1200, 150);
339
+ logger.info("Document chunked", {
340
+ knowledge_id,
341
+ chunks_count: chunks.length,
342
+ domain: normalized_domain
343
+ });
344
+ // STEP 1: Generate all embeddings FIRST (outside transaction)
345
+ // This is the slow part (API calls) and should NOT hold a database lock
346
+ const all_embedding_records = [];
347
+ const batch_size = 10;
348
+ for (let i = 0; i < chunks.length; i += batch_size) {
349
+ const batch = chunks.slice(i, i + batch_size);
350
+ // Generate embeddings for batch (API calls - can take seconds/minutes)
351
+ const embedding_promises = batch.map((chunk, index) => this.generate_embedding(chunk, embedding_model).then((embedding) => ({
352
+ chunk_index: i + index,
353
+ text: chunk,
354
+ embedding,
355
+ })));
356
+ const results = await Promise.all(embedding_promises);
357
+ // Prepare embedding records for batch insert
358
+ for (const result of results) {
359
+ const embedding_record = {
360
+ id: (0, uuid_1.v4)(),
361
+ knowledge_id,
362
+ knowledge_revision_id,
363
+ source_data_id,
364
+ text: result.text,
365
+ embedding: JSON.stringify(result.embedding),
366
+ model: embedding_model,
367
+ chunk_index: result.chunk_index,
368
+ type: type, // Use the type parameter (SEED or LEARNING)
369
+ };
370
+ // Domain is required and guaranteed to be valid at this point
371
+ // Use normalized_domain to ensure lowercase storage
372
+ embedding_record.domain = normalized_domain;
373
+ all_embedding_records.push(embedding_record);
374
+ }
375
+ logger.debug('Prepared embedding records', {
376
+ total_records: all_embedding_records.length,
377
+ domain
378
+ });
379
+ }
380
+ // STEP 2: Only NOW start transaction for database writes
381
+ // Transaction is held open only for the brief database write operation
382
+ const sequelize = (0, sequelize_service_1.get_sequelize_service)();
383
+ const transaction = await sequelize.transaction();
384
+ try {
385
+ let embeddings_created = 0;
386
+ // Batch insert all embeddings in a single transaction (fast operation)
387
+ if (all_embedding_records.length > 0) {
388
+ await models_1.EmbeddingModel.bulkCreate(all_embedding_records, { transaction });
389
+ embeddings_created = all_embedding_records.length;
390
+ }
391
+ await transaction.commit();
392
+ logger.info("Document processed successfully", {
393
+ knowledge_id,
394
+ knowledge_revision_id,
395
+ embeddings_created,
396
+ });
397
+ return { embeddings_created, knowledge_id, knowledge_revision_id };
398
+ }
399
+ catch (error) {
400
+ await transaction.rollback();
401
+ logger.error("Failed to process document", { knowledge_id, knowledge_revision_id, error });
402
+ throw error;
403
+ }
404
+ }
405
+ /**
406
+ * Find knowledge ID for learned patterns
407
+ */
408
+ async find_learned_patterns_knowledge_id() {
409
+ try {
410
+ const app_id = config_1.config_utils.get("APPLICATION_ID") || "savant-orchestration";
411
+ const requester_id = config_1.config_utils.get("REQUESTER_ID") || "execution-learner";
412
+ const knowledge_records = await models_1.KnowledgeModel.findAll({
413
+ where: {
414
+ application_id: app_id,
415
+ requester_id: requester_id,
416
+ metadata: {
417
+ [sequelize_1.Op.like]: '%"purpose"%learned-patterns%'
418
+ }
419
+ },
420
+ limit: 1,
421
+ order: [["created_at", "DESC"]]
422
+ });
423
+ return knowledge_records.length > 0 ? knowledge_records[0].id : null;
424
+ }
425
+ catch (error) {
426
+ logger.debug("Could not find learned patterns KB", { error });
427
+ return null;
428
+ }
429
+ }
430
+ /**
431
+ * Search embeddings by similarity using a two-pass top-k approach
432
+ *
433
+ * @param query_text - Query text to search for
434
+ * @param knowledge_id - Optional knowledge ID to filter by (learned knowledge from LEARNING embeddings is ALWAYS included)
435
+ * @param limit - Maximum number of results (default: 10)
436
+ * @param model - Embedding model (default: text-embedding-004)
437
+ * @returns Promise resolving to array of similar embeddings with scores
438
+ *
439
+ * This optimized version uses a pre-built in-memory Faiss index for fast vector search.
440
+ */
441
+ async search_embeddings(query_text, knowledge_id, limit = 10, model, type, domain) {
442
+ try {
443
+ const embedding_model = model || this.default_model;
444
+ // If filters are provided, query database first to get matching embedding IDs
445
+ // This allows us to filter Faiss results more efficiently
446
+ let allowed_embedding_ids = null;
447
+ if (knowledge_id || type || domain) {
448
+ const where_clause = { model: embedding_model };
449
+ if (knowledge_id) {
450
+ where_clause.knowledge_id = knowledge_id;
451
+ }
452
+ if (type) {
453
+ where_clause.type = type;
454
+ }
455
+ if (domain) {
456
+ // Domains are stored in lowercase, so we can use simple equality
457
+ where_clause.domain = domain.trim().toLowerCase();
458
+ }
459
+ const matching_embeddings = await models_1.EmbeddingModel.findAll({
460
+ where: where_clause,
461
+ attributes: ['id'],
462
+ });
463
+ if (matching_embeddings.length === 0) {
464
+ logger.debug("No embeddings found matching filters", { knowledge_id, type, domain });
465
+ return [];
466
+ }
467
+ allowed_embedding_ids = new Set(matching_embeddings.map(e => e.id));
468
+ logger.debug("Filtered embeddings by criteria", {
469
+ matching_count: allowed_embedding_ids.size,
470
+ knowledge_id,
471
+ type,
472
+ domain
473
+ });
474
+ }
475
+ // Build or get the cached Faiss index for the model.
476
+ const index_data = await this.get_or_build_faiss_index(embedding_model);
477
+ if (!index_data) {
478
+ logger.warn(`Faiss index not available for model ${embedding_model}. Cannot perform search.`);
479
+ return [];
480
+ }
481
+ // Generate embedding for query (using cached version)
482
+ const query_embedding = await this.generate_embedding_cached(query_text, embedding_model);
483
+ // Find learned patterns KB
484
+ const learned_patterns_knowledge_id = await this.find_learned_patterns_knowledge_id();
485
+ // Perform the search against the Faiss index
486
+ // Search for more results if we have filters (to account for filtering)
487
+ // But ensure we don't exceed the total number of vectors in the index
488
+ const index_ntotal = index_data.index.ntotal();
489
+ const requested_limit = allowed_embedding_ids ? limit * 3 : limit * 2;
490
+ const search_limit = Math.min(requested_limit, index_ntotal);
491
+ if (search_limit === 0) {
492
+ logger.debug("Index is empty, returning empty results");
493
+ return [];
494
+ }
495
+ const { labels, distances } = index_data.index.search(query_embedding, search_limit);
496
+ // Map results back to our metadata and filter by allowed IDs if filters were provided
497
+ const all_results = labels
498
+ .map((label, i) => {
499
+ const metadata = index_data.metadata[label];
500
+ // Faiss returns distance, convert to similarity (1 - distance for cosine)
501
+ const score = 1 - distances[i];
502
+ return { ...metadata, score };
503
+ })
504
+ .filter((result) => {
505
+ // If we have a filter set, only include results whose embedding ID is in the allowed set
506
+ if (allowed_embedding_ids && !allowed_embedding_ids.has(result.id)) {
507
+ return false;
508
+ }
509
+ return true;
510
+ });
511
+ // Sort by score and return top-k
512
+ const final_results = all_results
513
+ .sort((a, b) => b.score - a.score)
514
+ .slice(0, limit);
515
+ if (final_results.length === 0) {
516
+ logger.warn("No similar embeddings found in Faiss index", { knowledge_id, type, domain });
517
+ return [];
518
+ }
519
+ logger.debug("Faiss index search completed", {
520
+ initial_found: labels.length,
521
+ filtered_count: all_results.length,
522
+ final_count: final_results.length,
523
+ limit,
524
+ had_filters: !!allowed_embedding_ids
525
+ });
526
+ return final_results;
527
+ }
528
+ catch (error) {
529
+ logger.error("Failed to search embeddings", { error });
530
+ throw error;
531
+ }
532
+ }
533
+ /**
534
+ * Calculate cosine similarity between two vectors
535
+ *
536
+ * @param vec_a - First vector
537
+ * @param vec_b - Second vector
538
+ * @returns Cosine similarity score (0-1)
539
+ */
540
+ cosine_similarity(vec_a, vec_b) {
541
+ if (vec_a.length !== vec_b.length) {
542
+ throw new Error("Vectors must have the same length");
543
+ }
544
+ let dot_product = 0;
545
+ let norm_a = 0;
546
+ let norm_b = 0;
547
+ for (let i = 0; i < vec_a.length; i++) {
548
+ dot_product += vec_a[i] * vec_b[i];
549
+ norm_a += vec_a[i] * vec_a[i];
550
+ norm_b += vec_b[i] * vec_b[i];
551
+ }
552
+ const denominator = Math.sqrt(norm_a) * Math.sqrt(norm_b);
553
+ if (denominator === 0) {
554
+ return 0;
555
+ }
556
+ return dot_product / denominator;
557
+ }
558
+ /**
559
+ * Optimized cosine similarity calculation that reuses pre-computed norms
560
+ * This avoids recalculating norms for every comparison
561
+ *
562
+ * @param vec_a - Query vector
563
+ * @param vec_b - Embedding vector to compare
564
+ * @param vec_a_norm - Pre-computed norm of vec_a (sqrt of sum of squares)
565
+ * @param vec_b_norm - Optional pre-computed norm of vec_b (if not provided, calculates it)
566
+ * @returns Cosine similarity score (0-1)
567
+ */
568
+ cosine_similarity_optimized(vec_a, vec_b, vec_a_norm, vec_b_norm) {
569
+ if (vec_a.length !== vec_b.length) {
570
+ throw new Error("Vectors must have the same length");
571
+ }
572
+ let dot_product = 0;
573
+ // Calculate dot product
574
+ for (let i = 0; i < vec_a.length; i++) {
575
+ dot_product += vec_a[i] * vec_b[i];
576
+ }
577
+ // Use pre-computed norm if provided, otherwise calculate it
578
+ const norm_b = vec_b_norm || Math.sqrt(vec_b.reduce((sum, val) => sum + val * val, 0));
579
+ const denominator = vec_a_norm * norm_b;
580
+ if (denominator === 0) {
581
+ return 0;
582
+ }
583
+ return dot_product / denominator;
584
+ }
585
+ }
586
+ exports.EmbeddingService = EmbeddingService;
587
+ //# sourceMappingURL=embedding.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.service.js","sourceRoot":"","sources":["../../src/services/embedding.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @fileoverview File Upload Service
3
+ *
4
+ * Service for handling file uploads and storing metadata in source_data table.
5
+ *
6
+ * @author MeasureOne, Inc.
7
+ * @version 1.0.0
8
+ */
9
+ import { SourceDataModel } from "../models";
10
+ export declare class FileUploadService {
11
+ private uploads_dir;
12
+ constructor();
13
+ /**
14
+ * Ensure uploads directory exists
15
+ */
16
+ private ensure_uploads_directory;
17
+ /**
18
+ * Save uploaded file and create source_data record
19
+ *
20
+ * @param file - Multer file object
21
+ * @param application_id - Optional application ID
22
+ * @param requester_id - Optional requester ID
23
+ * @returns Promise resolving to file_id
24
+ */
25
+ save_file(file: Express.Multer.File, application_id?: string, requester_id?: string): Promise<{
26
+ file_id: string;
27
+ }>;
28
+ /**
29
+ * Get file path by file_id
30
+ *
31
+ * @param file_id - Source data ID
32
+ * @returns Promise resolving to file path
33
+ */
34
+ get_file_path(file_id: string): Promise<string>;
35
+ /**
36
+ * Read file content by file_id
37
+ *
38
+ * @param file_id - Source data ID
39
+ * @returns Promise resolving to file content as string
40
+ */
41
+ read_file_content(file_id: string): Promise<string>;
42
+ /**
43
+ * Get source data by ID
44
+ *
45
+ * @param file_id - Source data ID
46
+ * @returns Promise resolving to source data
47
+ */
48
+ get_source_data(file_id: string): Promise<SourceDataModel>;
49
+ }
50
+ //# sourceMappingURL=file_upload.service.d.ts.map