@ixo/common 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/.eslintrc.js +9 -0
  2. package/.prettierignore +3 -0
  3. package/.prettierrc.cjs +4 -0
  4. package/.turbo/turbo-build.log +4 -0
  5. package/CHANGELOG.md +76 -0
  6. package/README.md +245 -0
  7. package/dist/ai/checkpointer/index.d.ts +2 -0
  8. package/dist/ai/checkpointer/index.d.ts.map +1 -0
  9. package/dist/ai/checkpointer/index.js +2 -0
  10. package/dist/ai/checkpointer/index.js.map +1 -0
  11. package/dist/ai/index.d.ts +9 -0
  12. package/dist/ai/index.d.ts.map +1 -0
  13. package/dist/ai/index.js +9 -0
  14. package/dist/ai/index.js.map +1 -0
  15. package/dist/ai/models/index.d.ts +2 -0
  16. package/dist/ai/models/index.d.ts.map +1 -0
  17. package/dist/ai/models/index.js +2 -0
  18. package/dist/ai/models/index.js.map +1 -0
  19. package/dist/ai/models/openai.d.ts +10 -0
  20. package/dist/ai/models/openai.d.ts.map +1 -0
  21. package/dist/ai/models/openai.js +38 -0
  22. package/dist/ai/models/openai.js.map +1 -0
  23. package/dist/ai/models/openai.test.d.ts +2 -0
  24. package/dist/ai/models/openai.test.d.ts.map +1 -0
  25. package/dist/ai/models/openai.test.js +58 -0
  26. package/dist/ai/models/openai.test.js.map +1 -0
  27. package/dist/ai/nodes/create-fake-node.d.ts +2 -0
  28. package/dist/ai/nodes/create-fake-node.d.ts.map +1 -0
  29. package/dist/ai/nodes/create-fake-node.js +2 -0
  30. package/dist/ai/nodes/create-fake-node.js.map +1 -0
  31. package/dist/ai/nodes/find-docs/find-docs.prompt.d.ts +3 -0
  32. package/dist/ai/nodes/find-docs/find-docs.prompt.d.ts.map +1 -0
  33. package/dist/ai/nodes/find-docs/find-docs.prompt.js +61 -0
  34. package/dist/ai/nodes/find-docs/find-docs.prompt.js.map +1 -0
  35. package/dist/ai/nodes/find-docs/index.d.ts +3 -0
  36. package/dist/ai/nodes/find-docs/index.d.ts.map +1 -0
  37. package/dist/ai/nodes/find-docs/index.js +3 -0
  38. package/dist/ai/nodes/find-docs/index.js.map +1 -0
  39. package/dist/ai/nodes/find-docs/node.d.ts +17 -0
  40. package/dist/ai/nodes/find-docs/node.d.ts.map +1 -0
  41. package/dist/ai/nodes/find-docs/node.js +46 -0
  42. package/dist/ai/nodes/find-docs/node.js.map +1 -0
  43. package/dist/ai/nodes/generic-chat/generic-chat.node.d.ts +12 -0
  44. package/dist/ai/nodes/generic-chat/generic-chat.node.d.ts.map +1 -0
  45. package/dist/ai/nodes/generic-chat/generic-chat.node.js +34 -0
  46. package/dist/ai/nodes/generic-chat/generic-chat.node.js.map +1 -0
  47. package/dist/ai/nodes/generic-chat/generic-chat.prompt.d.ts +10 -0
  48. package/dist/ai/nodes/generic-chat/generic-chat.prompt.d.ts.map +1 -0
  49. package/dist/ai/nodes/generic-chat/generic-chat.prompt.js +58 -0
  50. package/dist/ai/nodes/generic-chat/generic-chat.prompt.js.map +1 -0
  51. package/dist/ai/nodes/generic-chat/index.d.ts +2 -0
  52. package/dist/ai/nodes/generic-chat/index.d.ts.map +1 -0
  53. package/dist/ai/nodes/generic-chat/index.js +2 -0
  54. package/dist/ai/nodes/generic-chat/index.js.map +1 -0
  55. package/dist/ai/nodes/index.d.ts +4 -0
  56. package/dist/ai/nodes/index.d.ts.map +1 -0
  57. package/dist/ai/nodes/index.js +4 -0
  58. package/dist/ai/nodes/index.js.map +1 -0
  59. package/dist/ai/semantic-router-factory/create-semantic-router.d.ts +7 -0
  60. package/dist/ai/semantic-router-factory/create-semantic-router.d.ts.map +1 -0
  61. package/dist/ai/semantic-router-factory/create-semantic-router.js +71 -0
  62. package/dist/ai/semantic-router-factory/create-semantic-router.js.map +1 -0
  63. package/dist/ai/semantic-router-factory/create-semantic-router.test.d.ts +2 -0
  64. package/dist/ai/semantic-router-factory/create-semantic-router.test.d.ts.map +1 -0
  65. package/dist/ai/semantic-router-factory/create-semantic-router.test.js +68 -0
  66. package/dist/ai/semantic-router-factory/create-semantic-router.test.js.map +1 -0
  67. package/dist/ai/semantic-router-factory/index.d.ts +4 -0
  68. package/dist/ai/semantic-router-factory/index.d.ts.map +1 -0
  69. package/dist/ai/semantic-router-factory/index.js +4 -0
  70. package/dist/ai/semantic-router-factory/index.js.map +1 -0
  71. package/dist/ai/semantic-router-factory/semantic-router-prompt.d.ts +2 -0
  72. package/dist/ai/semantic-router-factory/semantic-router-prompt.d.ts.map +1 -0
  73. package/dist/ai/semantic-router-factory/semantic-router-prompt.js +169 -0
  74. package/dist/ai/semantic-router-factory/semantic-router-prompt.js.map +1 -0
  75. package/dist/ai/semantic-router-factory/validate-routes.d.ts +2 -0
  76. package/dist/ai/semantic-router-factory/validate-routes.d.ts.map +1 -0
  77. package/dist/ai/semantic-router-factory/validate-routes.js +16 -0
  78. package/dist/ai/semantic-router-factory/validate-routes.js.map +1 -0
  79. package/dist/ai/tools/action-caller.d.ts +14 -0
  80. package/dist/ai/tools/action-caller.d.ts.map +1 -0
  81. package/dist/ai/tools/action-caller.js +12 -0
  82. package/dist/ai/tools/action-caller.js.map +1 -0
  83. package/dist/ai/tools/ask-ixo-guru/ask-ixo-guru.d.ts +25 -0
  84. package/dist/ai/tools/ask-ixo-guru/ask-ixo-guru.d.ts.map +1 -0
  85. package/dist/ai/tools/ask-ixo-guru/ask-ixo-guru.js +46 -0
  86. package/dist/ai/tools/ask-ixo-guru/ask-ixo-guru.js.map +1 -0
  87. package/dist/ai/tools/ask-ixo-guru/index.d.ts +2 -0
  88. package/dist/ai/tools/ask-ixo-guru/index.d.ts.map +1 -0
  89. package/dist/ai/tools/ask-ixo-guru/index.js +2 -0
  90. package/dist/ai/tools/ask-ixo-guru/index.js.map +1 -0
  91. package/dist/ai/tools/browser-tool-caller.d.ts +14 -0
  92. package/dist/ai/tools/browser-tool-caller.d.ts.map +1 -0
  93. package/dist/ai/tools/browser-tool-caller.js +12 -0
  94. package/dist/ai/tools/browser-tool-caller.js.map +1 -0
  95. package/dist/ai/tools/frontend-tool-caller.d.ts +10 -0
  96. package/dist/ai/tools/frontend-tool-caller.d.ts.map +1 -0
  97. package/dist/ai/tools/frontend-tool-caller.js +50 -0
  98. package/dist/ai/tools/frontend-tool-caller.js.map +1 -0
  99. package/dist/ai/tools/index.d.ts +11 -0
  100. package/dist/ai/tools/index.d.ts.map +1 -0
  101. package/dist/ai/tools/index.js +11 -0
  102. package/dist/ai/tools/index.js.map +1 -0
  103. package/dist/ai/tools/log-action-to-matrix.d.ts +13 -0
  104. package/dist/ai/tools/log-action-to-matrix.d.ts.map +1 -0
  105. package/dist/ai/tools/log-action-to-matrix.js +14 -0
  106. package/dist/ai/tools/log-action-to-matrix.js.map +1 -0
  107. package/dist/ai/tools/parser-action-tool.d.ts +8 -0
  108. package/dist/ai/tools/parser-action-tool.d.ts.map +1 -0
  109. package/dist/ai/tools/parser-action-tool.js +40 -0
  110. package/dist/ai/tools/parser-action-tool.js.map +1 -0
  111. package/dist/ai/tools/parser-browser-tool.d.ts +8 -0
  112. package/dist/ai/tools/parser-browser-tool.d.ts.map +1 -0
  113. package/dist/ai/tools/parser-browser-tool.js +38 -0
  114. package/dist/ai/tools/parser-browser-tool.js.map +1 -0
  115. package/dist/ai/tools/retriever-tool/index.d.ts +2 -0
  116. package/dist/ai/tools/retriever-tool/index.d.ts.map +1 -0
  117. package/dist/ai/tools/retriever-tool/index.js +2 -0
  118. package/dist/ai/tools/retriever-tool/index.js.map +1 -0
  119. package/dist/ai/tools/retriever-tool/retriever-tool.d.ts +18 -0
  120. package/dist/ai/tools/retriever-tool/retriever-tool.d.ts.map +1 -0
  121. package/dist/ai/tools/retriever-tool/retriever-tool.js +62 -0
  122. package/dist/ai/tools/retriever-tool/retriever-tool.js.map +1 -0
  123. package/dist/ai/tools/retriever-tool/retriever-tool.test.d.ts +2 -0
  124. package/dist/ai/tools/retriever-tool/retriever-tool.test.d.ts.map +1 -0
  125. package/dist/ai/tools/retriever-tool/retriever-tool.test.js +119 -0
  126. package/dist/ai/tools/retriever-tool/retriever-tool.test.js.map +1 -0
  127. package/dist/ai/tools/scrape-web-page.d.ts +7 -0
  128. package/dist/ai/tools/scrape-web-page.d.ts.map +1 -0
  129. package/dist/ai/tools/scrape-web-page.js +65 -0
  130. package/dist/ai/tools/scrape-web-page.js.map +1 -0
  131. package/dist/ai/tools/web-search-tool.d.ts +10 -0
  132. package/dist/ai/tools/web-search-tool.d.ts.map +1 -0
  133. package/dist/ai/tools/web-search-tool.js +30 -0
  134. package/dist/ai/tools/web-search-tool.js.map +1 -0
  135. package/dist/ai/types.d.ts +4 -0
  136. package/dist/ai/types.d.ts.map +1 -0
  137. package/dist/ai/types.js +2 -0
  138. package/dist/ai/types.js.map +1 -0
  139. package/dist/ai/utils/__tests__/chunk-arr.test.d.ts +2 -0
  140. package/dist/ai/utils/__tests__/chunk-arr.test.d.ts.map +1 -0
  141. package/dist/ai/utils/__tests__/chunk-arr.test.js +37 -0
  142. package/dist/ai/utils/__tests__/chunk-arr.test.js.map +1 -0
  143. package/dist/ai/utils/__tests__/doc-relevance-checker.test.d.ts +2 -0
  144. package/dist/ai/utils/__tests__/doc-relevance-checker.test.d.ts.map +1 -0
  145. package/dist/ai/utils/__tests__/doc-relevance-checker.test.js +80 -0
  146. package/dist/ai/utils/__tests__/doc-relevance-checker.test.js.map +1 -0
  147. package/dist/ai/utils/__tests__/doc-splitter.test.d.ts +2 -0
  148. package/dist/ai/utils/__tests__/doc-splitter.test.d.ts.map +1 -0
  149. package/dist/ai/utils/__tests__/doc-splitter.test.js +35 -0
  150. package/dist/ai/utils/__tests__/doc-splitter.test.js.map +1 -0
  151. package/dist/ai/utils/__tests__/filter-similarity-search-results.test.d.ts +2 -0
  152. package/dist/ai/utils/__tests__/filter-similarity-search-results.test.d.ts.map +1 -0
  153. package/dist/ai/utils/__tests__/filter-similarity-search-results.test.js +47 -0
  154. package/dist/ai/utils/__tests__/filter-similarity-search-results.test.js.map +1 -0
  155. package/dist/ai/utils/__tests__/json-to-yaml.test.d.ts +2 -0
  156. package/dist/ai/utils/__tests__/json-to-yaml.test.d.ts.map +1 -0
  157. package/dist/ai/utils/__tests__/json-to-yaml.test.js +63 -0
  158. package/dist/ai/utils/__tests__/json-to-yaml.test.js.map +1 -0
  159. package/dist/ai/utils/__tests__/stringify-docs.test.d.ts +2 -0
  160. package/dist/ai/utils/__tests__/stringify-docs.test.d.ts.map +1 -0
  161. package/dist/ai/utils/__tests__/stringify-docs.test.js +54 -0
  162. package/dist/ai/utils/__tests__/stringify-docs.test.js.map +1 -0
  163. package/dist/ai/utils/chunk-arr.d.ts +3 -0
  164. package/dist/ai/utils/chunk-arr.d.ts.map +1 -0
  165. package/dist/ai/utils/chunk-arr.js +13 -0
  166. package/dist/ai/utils/chunk-arr.js.map +1 -0
  167. package/dist/ai/utils/doc-relevance-checker.d.ts +10 -0
  168. package/dist/ai/utils/doc-relevance-checker.d.ts.map +1 -0
  169. package/dist/ai/utils/doc-relevance-checker.js +37 -0
  170. package/dist/ai/utils/doc-relevance-checker.js.map +1 -0
  171. package/dist/ai/utils/doc-splitter.d.ts +3 -0
  172. package/dist/ai/utils/doc-splitter.d.ts.map +1 -0
  173. package/dist/ai/utils/doc-splitter.js +20 -0
  174. package/dist/ai/utils/doc-splitter.js.map +1 -0
  175. package/dist/ai/utils/filter-similarity-search-results.d.ts +4 -0
  176. package/dist/ai/utils/filter-similarity-search-results.d.ts.map +1 -0
  177. package/dist/ai/utils/filter-similarity-search-results.js +11 -0
  178. package/dist/ai/utils/filter-similarity-search-results.js.map +1 -0
  179. package/dist/ai/utils/generate-questions-from-chunks.d.ts +15 -0
  180. package/dist/ai/utils/generate-questions-from-chunks.d.ts.map +1 -0
  181. package/dist/ai/utils/generate-questions-from-chunks.js +101 -0
  182. package/dist/ai/utils/generate-questions-from-chunks.js.map +1 -0
  183. package/dist/ai/utils/index.d.ts +11 -0
  184. package/dist/ai/utils/index.d.ts.map +1 -0
  185. package/dist/ai/utils/index.js +11 -0
  186. package/dist/ai/utils/index.js.map +1 -0
  187. package/dist/ai/utils/json-to-yaml.d.ts +2 -0
  188. package/dist/ai/utils/json-to-yaml.d.ts.map +1 -0
  189. package/dist/ai/utils/json-to-yaml.js +25 -0
  190. package/dist/ai/utils/json-to-yaml.js.map +1 -0
  191. package/dist/ai/utils/load-file.d.ts +3 -0
  192. package/dist/ai/utils/load-file.d.ts.map +1 -0
  193. package/dist/ai/utils/load-file.js +133 -0
  194. package/dist/ai/utils/load-file.js.map +1 -0
  195. package/dist/ai/utils/stringify-docs.d.ts +3 -0
  196. package/dist/ai/utils/stringify-docs.d.ts.map +1 -0
  197. package/dist/ai/utils/stringify-docs.js +6 -0
  198. package/dist/ai/utils/stringify-docs.js.map +1 -0
  199. package/dist/ai/utils/transformGraphStateMessageToListMessageResponse.d.ts +35 -0
  200. package/dist/ai/utils/transformGraphStateMessageToListMessageResponse.d.ts.map +1 -0
  201. package/dist/ai/utils/transformGraphStateMessageToListMessageResponse.js +55 -0
  202. package/dist/ai/utils/transformGraphStateMessageToListMessageResponse.js.map +1 -0
  203. package/dist/ai/utils/verify-matrix-openId-token.d.ts +6 -0
  204. package/dist/ai/utils/verify-matrix-openId-token.d.ts.map +1 -0
  205. package/dist/ai/utils/verify-matrix-openId-token.js +36 -0
  206. package/dist/ai/utils/verify-matrix-openId-token.js.map +1 -0
  207. package/dist/index.d.ts +4 -0
  208. package/dist/index.d.ts.map +1 -0
  209. package/dist/index.js +4 -0
  210. package/dist/index.js.map +1 -0
  211. package/dist/services/env/env-service.test.d.ts +2 -0
  212. package/dist/services/env/env-service.test.d.ts.map +1 -0
  213. package/dist/services/env/env-service.test.js +99 -0
  214. package/dist/services/env/env-service.test.js.map +1 -0
  215. package/dist/services/env/env.service.d.ts +11 -0
  216. package/dist/services/env/env.service.d.ts.map +1 -0
  217. package/dist/services/env/env.service.js +42 -0
  218. package/dist/services/env/env.service.js.map +1 -0
  219. package/dist/services/env/index.d.ts +2 -0
  220. package/dist/services/env/index.d.ts.map +1 -0
  221. package/dist/services/env/index.js +2 -0
  222. package/dist/services/env/index.js.map +1 -0
  223. package/dist/services/index.d.ts +5 -0
  224. package/dist/services/index.d.ts.map +1 -0
  225. package/dist/services/index.js +5 -0
  226. package/dist/services/index.js.map +1 -0
  227. package/dist/services/memory-engine/memory-engine.service.d.ts +35 -0
  228. package/dist/services/memory-engine/memory-engine.service.d.ts.map +1 -0
  229. package/dist/services/memory-engine/memory-engine.service.js +295 -0
  230. package/dist/services/memory-engine/memory-engine.service.js.map +1 -0
  231. package/dist/services/memory-engine/types.d.ts +88 -0
  232. package/dist/services/memory-engine/types.d.ts.map +1 -0
  233. package/dist/services/memory-engine/types.js +2 -0
  234. package/dist/services/memory-engine/types.js.map +1 -0
  235. package/dist/services/session-manager/dto.d.ts +40 -0
  236. package/dist/services/session-manager/dto.d.ts.map +1 -0
  237. package/dist/services/session-manager/dto.js +170 -0
  238. package/dist/services/session-manager/dto.js.map +1 -0
  239. package/dist/services/session-manager/errors.d.ts +22 -0
  240. package/dist/services/session-manager/errors.d.ts.map +1 -0
  241. package/dist/services/session-manager/errors.js +41 -0
  242. package/dist/services/session-manager/errors.js.map +1 -0
  243. package/dist/services/session-manager/index.d.ts +4 -0
  244. package/dist/services/session-manager/index.d.ts.map +1 -0
  245. package/dist/services/session-manager/index.js +4 -0
  246. package/dist/services/session-manager/index.js.map +1 -0
  247. package/dist/services/session-manager/session-manager.service.d.ts +40 -0
  248. package/dist/services/session-manager/session-manager.service.d.ts.map +1 -0
  249. package/dist/services/session-manager/session-manager.service.js +251 -0
  250. package/dist/services/session-manager/session-manager.service.js.map +1 -0
  251. package/dist/utils/get-user-subscription.d.ts +21 -0
  252. package/dist/utils/get-user-subscription.d.ts.map +1 -0
  253. package/dist/utils/get-user-subscription.js +44 -0
  254. package/dist/utils/get-user-subscription.js.map +1 -0
  255. package/dist/utils/index.d.ts +2 -0
  256. package/dist/utils/index.d.ts.map +1 -0
  257. package/dist/utils/index.js +2 -0
  258. package/dist/utils/index.js.map +1 -0
  259. package/docs/ai-module.md +84 -0
  260. package/docs/services.md +168 -0
  261. package/docs/tools.md +325 -0
  262. package/jest.config.js +6 -0
  263. package/package.json +81 -0
  264. package/src/ai/checkpointer/index.ts +1 -0
  265. package/src/ai/index.ts +8 -0
  266. package/src/ai/models/index.ts +1 -0
  267. package/src/ai/models/openai.test.ts +72 -0
  268. package/src/ai/models/openai.ts +54 -0
  269. package/src/ai/nodes/create-fake-node.ts +1 -0
  270. package/src/ai/nodes/find-docs/find-docs.prompt.ts +61 -0
  271. package/src/ai/nodes/find-docs/index.ts +2 -0
  272. package/src/ai/nodes/find-docs/node.ts +83 -0
  273. package/src/ai/nodes/generic-chat/generic-chat.node.ts +58 -0
  274. package/src/ai/nodes/generic-chat/generic-chat.prompt.ts +66 -0
  275. package/src/ai/nodes/generic-chat/index.ts +1 -0
  276. package/src/ai/nodes/index.ts +3 -0
  277. package/src/ai/semantic-router-factory/create-semantic-router.test.ts +98 -0
  278. package/src/ai/semantic-router-factory/create-semantic-router.ts +136 -0
  279. package/src/ai/semantic-router-factory/index.ts +3 -0
  280. package/src/ai/semantic-router-factory/semantic-router-prompt.ts +168 -0
  281. package/src/ai/semantic-router-factory/validate-routes.ts +26 -0
  282. package/src/ai/tools/action-caller.ts +37 -0
  283. package/src/ai/tools/ask-ixo-guru/ask-ixo-guru.ts +73 -0
  284. package/src/ai/tools/ask-ixo-guru/index.ts +1 -0
  285. package/src/ai/tools/browser-tool-caller.ts +37 -0
  286. package/src/ai/tools/frontend-tool-caller.ts +86 -0
  287. package/src/ai/tools/index.ts +10 -0
  288. package/src/ai/tools/log-action-to-matrix.ts +30 -0
  289. package/src/ai/tools/parser-action-tool.ts +61 -0
  290. package/src/ai/tools/parser-browser-tool.ts +55 -0
  291. package/src/ai/tools/retriever-tool/index.ts +1 -0
  292. package/src/ai/tools/retriever-tool/retriever-tool.test.ts +156 -0
  293. package/src/ai/tools/retriever-tool/retriever-tool.ts +107 -0
  294. package/src/ai/tools/scrape-web-page.ts +75 -0
  295. package/src/ai/tools/web-search-tool.ts +38 -0
  296. package/src/ai/types.ts +6 -0
  297. package/src/ai/utils/__tests__/chunk-arr.test.ts +46 -0
  298. package/src/ai/utils/__tests__/doc-relevance-checker.test.ts +90 -0
  299. package/src/ai/utils/__tests__/doc-splitter.test.ts +42 -0
  300. package/src/ai/utils/__tests__/filter-similarity-search-results.test.ts +57 -0
  301. package/src/ai/utils/__tests__/json-to-yaml.test.ts +70 -0
  302. package/src/ai/utils/__tests__/stringify-docs.test.ts +61 -0
  303. package/src/ai/utils/chunk-arr.ts +13 -0
  304. package/src/ai/utils/doc-relevance-checker.ts +58 -0
  305. package/src/ai/utils/doc-splitter.ts +28 -0
  306. package/src/ai/utils/filter-similarity-search-results.ts +15 -0
  307. package/src/ai/utils/generate-questions-from-chunks.ts +114 -0
  308. package/src/ai/utils/index.ts +10 -0
  309. package/src/ai/utils/json-to-yaml.ts +32 -0
  310. package/src/ai/utils/load-file.ts +170 -0
  311. package/src/ai/utils/stringify-docs.ts +14 -0
  312. package/src/ai/utils/transformGraphStateMessageToListMessageResponse.ts +108 -0
  313. package/src/ai/utils/verify-matrix-openId-token.ts +46 -0
  314. package/src/index.ts +3 -0
  315. package/src/services/env/env-service.test.ts +153 -0
  316. package/src/services/env/env.service.ts +65 -0
  317. package/src/services/env/index.ts +1 -0
  318. package/src/services/index.ts +4 -0
  319. package/src/services/memory-engine/memory-engine.service.ts +486 -0
  320. package/src/services/memory-engine/types.ts +208 -0
  321. package/src/services/session-manager/dto.ts +120 -0
  322. package/src/services/session-manager/errors.ts +56 -0
  323. package/src/services/session-manager/index.ts +3 -0
  324. package/src/services/session-manager/session-manager.service.ts +405 -0
  325. package/src/utils/get-user-subscription.ts +84 -0
  326. package/src/utils/index.ts +1 -0
  327. package/tsconfig.json +16 -0
  328. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,41 @@
1
+ export var SessionManagerErrorCodes;
2
+ (function (SessionManagerErrorCodes) {
3
+ SessionManagerErrorCodes["NO_USER_ROOMS_FOUND"] = "NO_USER_ROOMS_FOUND";
4
+ SessionManagerErrorCodes["ROOM_NOT_FOUND"] = "ROOM_NOT_FOUND";
5
+ SessionManagerErrorCodes["USER_NOT_IN_ROOM"] = "USER_NOT_IN_ROOM";
6
+ })(SessionManagerErrorCodes || (SessionManagerErrorCodes = {}));
7
+ export class SessionManagerError extends Error {
8
+ code;
9
+ constructor(message, code) {
10
+ super(message);
11
+ this.code = code;
12
+ }
13
+ }
14
+ export class NoUserRoomsFoundError extends SessionManagerError {
15
+ constructor(did) {
16
+ super(`No user rooms found for the given did ${did}`, SessionManagerErrorCodes.NO_USER_ROOMS_FOUND);
17
+ }
18
+ isNoUserRoomsFoundError(error) {
19
+ return (error instanceof NoUserRoomsFoundError &&
20
+ error.code === SessionManagerErrorCodes.NO_USER_ROOMS_FOUND);
21
+ }
22
+ }
23
+ export class RoomNotFoundError extends SessionManagerError {
24
+ constructor(roomId) {
25
+ super(`Room ${roomId} not found`, SessionManagerErrorCodes.ROOM_NOT_FOUND);
26
+ }
27
+ isRoomNotFoundError(error) {
28
+ return (error instanceof RoomNotFoundError &&
29
+ error.code === SessionManagerErrorCodes.ROOM_NOT_FOUND);
30
+ }
31
+ }
32
+ export class UserNotInRoomError extends SessionManagerError {
33
+ constructor(did, roomId) {
34
+ super(`User ${did} not in room ${roomId}`, SessionManagerErrorCodes.USER_NOT_IN_ROOM);
35
+ }
36
+ isUserNotInRoomError(error) {
37
+ return (error instanceof UserNotInRoomError &&
38
+ error.code === SessionManagerErrorCodes.USER_NOT_IN_ROOM);
39
+ }
40
+ }
41
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/services/session-manager/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,wBAIX;AAJD,WAAY,wBAAwB;IAClC,uEAA2C,CAAA;IAC3C,6DAAiC,CAAA;IACjC,iEAAqC,CAAA;AACvC,CAAC,EAJW,wBAAwB,KAAxB,wBAAwB,QAInC;AAED,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAG1B;IAFlB,YACE,OAAe,EACC,IAA8B;QAE9C,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,SAAI,GAAJ,IAAI,CAA0B;IAGhD,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,mBAAmB;IAC5D,YAAY,GAAW;QACrB,KAAK,CACH,yCAAyC,GAAG,EAAE,EAC9C,wBAAwB,CAAC,mBAAmB,CAC7C,CAAC;IACJ,CAAC;IACD,uBAAuB,CAAC,KAAc;QACpC,OAAO,CACL,KAAK,YAAY,qBAAqB;YACtC,KAAK,CAAC,IAAI,KAAK,wBAAwB,CAAC,mBAAmB,CAC5D,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,mBAAmB;IACxD,YAAY,MAAc;QACxB,KAAK,CAAC,QAAQ,MAAM,YAAY,EAAE,wBAAwB,CAAC,cAAc,CAAC,CAAC;IAC7E,CAAC;IACD,mBAAmB,CAAC,KAAc;QAChC,OAAO,CACL,KAAK,YAAY,iBAAiB;YAClC,KAAK,CAAC,IAAI,KAAK,wBAAwB,CAAC,cAAc,CACvD,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,mBAAmB;IACzD,YAAY,GAAW,EAAE,MAAc;QACrC,KAAK,CACH,QAAQ,GAAG,gBAAgB,MAAM,EAAE,EACnC,wBAAwB,CAAC,gBAAgB,CAC1C,CAAC;IACJ,CAAC;IACD,oBAAoB,CAAC,KAAc;QACjC,OAAO,CACL,KAAK,YAAY,kBAAkB;YACnC,KAAK,CAAC,IAAI,KAAK,wBAAwB,CAAC,gBAAgB,CACzD,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export * from './dto.js';
2
+ export * from './errors.js';
3
+ export * from './session-manager.service.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/session-manager/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,8BAA8B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './dto.js';
2
+ export * from './errors.js';
3
+ export * from './session-manager.service.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/session-manager/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,8BAA8B,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { MatrixManager } from '@ixo/matrix';
2
+ import { Database } from 'better-sqlite3';
3
+ import { MemoryEngineService } from '../memory-engine/memory-engine.service.js';
4
+ import { type UserContextData } from '../memory-engine/types.js';
5
+ import { type ChatSession, type CreateChatSessionDto, type CreateChatSessionResponseDto, type DeleteChatSessionDto, type ListChatSessionsDto, type ListChatSessionsResponseDto } from './dto.js';
6
+ export interface IDatabaseSyncService {
7
+ getUserDatabase(userDid: string): Promise<Database>;
8
+ }
9
+ export declare class SessionManagerService {
10
+ private readonly syncService;
11
+ readonly matrixManger: MatrixManager;
12
+ private readonly memoryEngineService?;
13
+ constructor(syncService: IDatabaseSyncService, matrixManger?: MatrixManager, memoryEngineService?: MemoryEngineService | undefined);
14
+ getSessionsStateKey({ oracleEntityDid, }: {
15
+ oracleEntityDid: string;
16
+ }): `${string}_${string}`;
17
+ private createMessageTitle;
18
+ updateLastProcessedCount({ sessionId, did, lastProcessedCount, }: {
19
+ sessionId: string;
20
+ did: string;
21
+ lastProcessedCount: number;
22
+ }): Promise<void>;
23
+ syncSessionSet({ sessionId, did, messages, oracleEntityDid, oracleName, roomId: _roomId, lastProcessedCount, oracleDid, userContext, slackThreadTs, }: {
24
+ sessionId: string;
25
+ did: string;
26
+ messages: string[];
27
+ oracleEntityDid: string;
28
+ oracleName: string;
29
+ roomId?: string;
30
+ lastProcessedCount?: number;
31
+ oracleDid: string;
32
+ userContext?: UserContextData;
33
+ slackThreadTs?: string;
34
+ }): Promise<ChatSession>;
35
+ getSession(sessionId: string, did: string, throwOnNotFound?: boolean): Promise<ChatSession | undefined>;
36
+ listSessions(listSessionsDto: ListChatSessionsDto): Promise<ListChatSessionsResponseDto>;
37
+ createSession(createSessionDto: CreateChatSessionDto): Promise<CreateChatSessionResponseDto>;
38
+ deleteSession(deleteSessionDto: DeleteChatSessionDto): Promise<void>;
39
+ }
40
+ //# sourceMappingURL=session-manager.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.service.d.ts","sourceRoot":"","sources":["../../../src/services/session-manager/session-manager.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EACjC,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,oBAAoB;IACnC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACrD;AAED,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,WAAW;aACZ,YAAY;IAC5B,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBAFpB,WAAW,EAAE,oBAAoB,EAClC,YAAY,gBAA8B,EACzC,mBAAmB,CAAC,EAAE,mBAAmB,YAAA;IAGrD,mBAAmB,CAAC,EACzB,eAAe,GAChB,EAAE;QACD,eAAe,EAAE,MAAM,CAAC;KACzB,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE;YAIX,kBAAkB;IAsEnB,wBAAwB,CAAC,EACpC,SAAS,EACT,GAAG,EACH,kBAAkB,GACnB,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,kBAAkB,EAAE,MAAM,CAAC;KAC5B,GAAG,OAAO,CAAC,IAAI,CAAC;IAQJ,cAAc,CAAC,EAC1B,SAAS,EACT,GAAG,EACH,QAAQ,EACR,eAAe,EACf,UAAU,EACV,MAAM,EAAE,OAAO,EACf,kBAAkB,EAClB,SAAS,EACT,WAAW,EACX,aAAa,GACd,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,eAAe,CAAC;QAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,WAAW,CAAC;IAwFX,UAAU,CACrB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,eAAe,GAAE,OAAc,GAC9B,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAuDtB,YAAY,CACvB,eAAe,EAAE,mBAAmB,GACnC,OAAO,CAAC,2BAA2B,CAAC;IAsD1B,aAAa,CACxB,gBAAgB,EAAE,oBAAoB,GACrC,OAAO,CAAC,4BAA4B,CAAC;IAgD3B,aAAa,CACxB,gBAAgB,EAAE,oBAAoB,GACrC,OAAO,CAAC,IAAI,CAAC;CAMjB"}
@@ -0,0 +1,251 @@
1
+ import { Logger } from '@ixo/logger';
2
+ import { MatrixManager } from '@ixo/matrix';
3
+ import { getMatrixHomeServerCroppedForDid } from '@ixo/oracles-chain-client';
4
+ import { getChatOpenAiModel } from '../../ai/index.js';
5
+ export class SessionManagerService {
6
+ syncService;
7
+ matrixManger;
8
+ memoryEngineService;
9
+ constructor(syncService, matrixManger = MatrixManager.getInstance(), memoryEngineService) {
10
+ this.syncService = syncService;
11
+ this.matrixManger = matrixManger;
12
+ this.memoryEngineService = memoryEngineService;
13
+ }
14
+ getSessionsStateKey({ oracleEntityDid, }) {
15
+ return `${oracleEntityDid}_sessions`;
16
+ }
17
+ async createMessageTitle({ messages, }) {
18
+ if (messages.length === 0) {
19
+ return 'Untitled';
20
+ }
21
+ const llm = getChatOpenAiModel({
22
+ model: 'meta-llama/llama-3.1-8b-instruct',
23
+ temperature: 0.3,
24
+ apiKey: process.env.OPEN_ROUTER_API_KEY,
25
+ timeout: 20 * 1000 * 60,
26
+ configuration: {
27
+ baseURL: 'https://openrouter.ai/api/v1',
28
+ },
29
+ });
30
+ const response = await llm.invoke(`Based on this messages messages, Add a title for this convo and only based on the messages? MAKE SURE TO ONLY RESPOND WITH THE TITLE.
31
+
32
+ ## RESPONSE FORMAT
33
+ ONLY RESPOND WITH THE TITLE not anything else that title will be saved to the store directly from your response so generated based on the messages.
34
+
35
+ EXample
36
+
37
+ Input:
38
+ <messages>
39
+ Hello, how are you?
40
+ I'm good, thank you!
41
+ did u see the new feature i added?
42
+ yes but i didn't like it
43
+ </messages>
44
+
45
+ Output:
46
+ Conversation about a new feature
47
+
48
+ ___________________________________________________________
49
+
50
+ Input:
51
+ <messages>
52
+ What are the store opening hours?
53
+ We are open from 9am to 5pm, Monday to Friday.
54
+ </messages>
55
+
56
+ Output:
57
+ Store Opening Hours Information
58
+ ___________________________________________________________
59
+ Input:
60
+ <messages>
61
+ Can you help me reset my password?
62
+ Sure, I can assist you with that.
63
+ </messages>
64
+
65
+ Output:
66
+ Password Reset Assistance
67
+
68
+ ___________________________________________________________
69
+ # the out put should be only the title not anything else that title will be saved to the store directly from your response so generated based on the messages.
70
+
71
+ USER MESSAGES:
72
+ <messages>
73
+ ${messages.join('\n\n')}
74
+ </messages>
75
+ `);
76
+ const title = response.content.toString();
77
+ return title;
78
+ }
79
+ async updateLastProcessedCount({ sessionId, did, lastProcessedCount, }) {
80
+ const db = await this.syncService.getUserDatabase(did);
81
+ db.prepare('UPDATE sessions SET last_processed_count = ? WHERE session_id = ?').run(lastProcessedCount, sessionId);
82
+ return;
83
+ }
84
+ async syncSessionSet({ sessionId, did, messages, oracleEntityDid, oracleName, roomId: _roomId, lastProcessedCount, oracleDid, userContext, slackThreadTs, }) {
85
+ const db = await this.syncService.getUserDatabase(did);
86
+ const selectedSession = await this.getSession(sessionId, did, false);
87
+ if (!selectedSession) {
88
+ const session = {
89
+ sessionId,
90
+ oracleName,
91
+ title: await this.createMessageTitle({
92
+ messages,
93
+ }),
94
+ lastUpdatedAt: new Date().toISOString(),
95
+ createdAt: new Date().toISOString(),
96
+ oracleEntityDid,
97
+ oracleDid,
98
+ userContext,
99
+ slackThreadTs,
100
+ };
101
+ db.prepare(`
102
+ INSERT INTO sessions (
103
+ session_id, title, last_updated_at, created_at, oracle_name,
104
+ oracle_did, oracle_entity_did, last_processed_count,
105
+ user_context, room_id, slack_thread_ts
106
+ )
107
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
108
+ `).run(session.sessionId, session.title ?? null, session.lastUpdatedAt, session.createdAt, session.oracleName, session.oracleDid, session.oracleEntityDid, session.lastProcessedCount ?? null, session.userContext ? JSON.stringify(session.userContext) : null, session.roomId ?? null, session.slackThreadTs ?? null);
109
+ return session;
110
+ }
111
+ const hasEnoughMessages = messages.length >= 2;
112
+ const needsTitleUpdate = !selectedSession.title ||
113
+ selectedSession.title.toLowerCase() === 'untitled' ||
114
+ (selectedSession.title && selectedSession.title.trim() === '');
115
+ const allowTitleUpdate = hasEnoughMessages && needsTitleUpdate;
116
+ const title = allowTitleUpdate
117
+ ? await this.createMessageTitle({
118
+ messages,
119
+ })
120
+ : selectedSession.title;
121
+ const lastUpdatedAt = new Date().toISOString();
122
+ const updatedSession = {
123
+ ...selectedSession,
124
+ title,
125
+ lastUpdatedAt,
126
+ lastProcessedCount,
127
+ slackThreadTs,
128
+ };
129
+ db.prepare(`
130
+ UPDATE sessions
131
+ SET title = ?, last_updated_at = ?, last_processed_count = ?, slack_thread_ts = ?
132
+ WHERE session_id = ?
133
+ `).run(updatedSession.title ?? null, lastUpdatedAt, updatedSession.lastProcessedCount ?? null, updatedSession.slackThreadTs ?? null, sessionId);
134
+ return updatedSession;
135
+ }
136
+ async getSession(sessionId, did, throwOnNotFound = true) {
137
+ const db = await this.syncService.getUserDatabase(did);
138
+ const row = db
139
+ .prepare(`SELECT
140
+ session_id, title, last_updated_at, created_at, oracle_name,
141
+ oracle_did, oracle_entity_did, last_processed_count,
142
+ user_context, room_id, slack_thread_ts
143
+ FROM sessions
144
+ WHERE session_id = ?`)
145
+ .get(sessionId);
146
+ const selectedSession = row
147
+ ? {
148
+ sessionId: row.session_id,
149
+ title: row.title ?? undefined,
150
+ lastUpdatedAt: row.last_updated_at,
151
+ createdAt: row.created_at,
152
+ oracleName: row.oracle_name,
153
+ oracleDid: row.oracle_did,
154
+ oracleEntityDid: row.oracle_entity_did,
155
+ lastProcessedCount: row.last_processed_count ?? undefined,
156
+ userContext: row.user_context
157
+ ? JSON.parse(row.user_context)
158
+ : undefined,
159
+ roomId: row.room_id ?? undefined,
160
+ slackThreadTs: row.slack_thread_ts ?? undefined,
161
+ }
162
+ : undefined;
163
+ if (!selectedSession) {
164
+ if (throwOnNotFound) {
165
+ throw new Error('Session not found');
166
+ }
167
+ return undefined;
168
+ }
169
+ return selectedSession;
170
+ }
171
+ async listSessions(listSessionsDto) {
172
+ const db = await this.syncService.getUserDatabase(listSessionsDto.did);
173
+ const limit = listSessionsDto.limit ?? 20;
174
+ const offset = listSessionsDto.offset ?? 0;
175
+ const rows = db
176
+ .prepare(`SELECT
177
+ session_id, title, last_updated_at, created_at, oracle_name,
178
+ oracle_did, oracle_entity_did, last_processed_count,
179
+ user_context, room_id, slack_thread_ts,
180
+ COUNT(*) OVER() as total
181
+ FROM sessions
182
+ ORDER BY last_updated_at DESC
183
+ LIMIT ? OFFSET ?`)
184
+ .all(limit, offset);
185
+ const total = rows[0]?.total ?? 0;
186
+ const sessions = rows.map((row) => ({
187
+ sessionId: row.session_id,
188
+ title: row.title ?? undefined,
189
+ lastUpdatedAt: row.last_updated_at,
190
+ createdAt: row.created_at,
191
+ oracleName: row.oracle_name,
192
+ oracleDid: row.oracle_did,
193
+ oracleEntityDid: row.oracle_entity_did,
194
+ lastProcessedCount: row.last_processed_count ?? undefined,
195
+ userContext: row.user_context
196
+ ? JSON.parse(row.user_context)
197
+ : undefined,
198
+ roomId: row.room_id ?? undefined,
199
+ slackThreadTs: row.slack_thread_ts ?? undefined,
200
+ }));
201
+ return { sessions, total };
202
+ }
203
+ async createSession(createSessionDto) {
204
+ const userHomeServer = createSessionDto.homeServer || await getMatrixHomeServerCroppedForDid(createSessionDto.did);
205
+ const { roomId } = await this.matrixManger.getOracleRoomIdWithHomeServer({
206
+ userDid: createSessionDto.did,
207
+ oracleEntityDid: createSessionDto.oracleEntityDid,
208
+ userHomeServer,
209
+ });
210
+ if (!roomId) {
211
+ throw new Error('Room ID not found');
212
+ }
213
+ const eventId = await this.matrixManger.sendMessage({
214
+ message: 'New Conversation Started',
215
+ roomId,
216
+ isOracleAdmin: true,
217
+ });
218
+ let userContext;
219
+ if (this.memoryEngineService) {
220
+ try {
221
+ Logger.debug('Gathering user context from Memory Engine');
222
+ userContext = await this.memoryEngineService.gatherUserContext({
223
+ oracleDid: createSessionDto.oracleDid,
224
+ userDid: createSessionDto.did,
225
+ roomId,
226
+ });
227
+ }
228
+ catch (error) {
229
+ Logger.error('Failed to gather user context:', error);
230
+ throw error;
231
+ }
232
+ }
233
+ const session = await this.syncSessionSet({
234
+ sessionId: eventId,
235
+ oracleName: createSessionDto.oracleName,
236
+ did: createSessionDto.did,
237
+ oracleEntityDid: createSessionDto.oracleEntityDid,
238
+ oracleDid: createSessionDto.oracleDid,
239
+ messages: [],
240
+ roomId,
241
+ userContext,
242
+ slackThreadTs: createSessionDto.slackThreadTs,
243
+ });
244
+ return session;
245
+ }
246
+ async deleteSession(deleteSessionDto) {
247
+ const db = await this.syncService.getUserDatabase(deleteSessionDto.did);
248
+ db.prepare('DELETE FROM sessions WHERE session_id = ?').run(deleteSessionDto.sessionId);
249
+ }
250
+ }
251
+ //# sourceMappingURL=session-manager.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.service.js","sourceRoot":"","sources":["../../../src/services/session-manager/session-manager.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export declare const getSubscriptionUrlByNetwork: (network: "mainnet" | "testnet" | "devnet") => string;
2
+ export interface ClaimCollectionsDto {
3
+ oracleClaimsCollectionId?: string;
4
+ subscriptionClaimsCollectionId?: string;
5
+ }
6
+ export interface GetMySubscriptionsResponseDto {
7
+ claimCollections: ClaimCollectionsDto;
8
+ currentPlan: string;
9
+ currentPlanName: string;
10
+ totalCredits: number;
11
+ planCredits: number;
12
+ status: 'active' | 'inactive' | 'processing' | 'trial';
13
+ adminAddress: string;
14
+ }
15
+ export interface GetUserSubscriptionParams {
16
+ network: 'mainnet' | 'testnet' | 'devnet';
17
+ bearerToken: string;
18
+ subscriptionUrl?: string;
19
+ }
20
+ export declare const getUserSubscription: ({ bearerToken, network, subscriptionUrl: _subscriptionUrl, }: GetUserSubscriptionParams) => Promise<GetMySubscriptionsResponseDto | null>;
21
+ //# sourceMappingURL=get-user-subscription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-user-subscription.d.ts","sourceRoot":"","sources":["../../src/utils/get-user-subscription.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,2BAA2B,GACtC,SAAS,SAAS,GAAG,SAAS,GAAG,QAAQ,WAO1C,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC,8BAA8B,CAAC,EAAE,MAAM,CAAC;CACzC;AAED,MAAM,WAAW,6BAA6B;IAC5C,gBAAgB,EAAE,mBAAmB,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;IACvD,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,mBAAmB,GAAU,8DAIvC,yBAAyB,KAAG,OAAO,CAAC,6BAA6B,GAAG,IAAI,CAyC1E,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { Logger } from '@ixo/logger';
2
+ export const getSubscriptionUrlByNetwork = (network) => {
3
+ return {
4
+ mainnet: 'https://subscriptions-api-mainnet.ixo-api.workers.dev',
5
+ testnet: 'https://subscriptions-api-testnet.ixo-api.workers.dev',
6
+ devnet: 'https://subscriptions-api.ixo-api.workers.dev',
7
+ }[network];
8
+ };
9
+ export const getUserSubscription = async ({ bearerToken, network, subscriptionUrl: _subscriptionUrl, }) => {
10
+ const subscriptionUrl = _subscriptionUrl ?? getSubscriptionUrlByNetwork(network);
11
+ try {
12
+ Logger.debug('Fetching user subscription from:', subscriptionUrl);
13
+ const response = await fetch(`${subscriptionUrl.endsWith('/') ? subscriptionUrl.slice(0, -1) : subscriptionUrl}/api/v1/subscriptions`, {
14
+ method: 'GET',
15
+ headers: {
16
+ Authorization: `Bearer ${bearerToken}`,
17
+ 'Content-Type': 'application/json',
18
+ },
19
+ });
20
+ if (!response.ok) {
21
+ console.error(`Failed to fetch user subscription: ${response.status} ${response.statusText}`);
22
+ return null;
23
+ }
24
+ const data = await response.json();
25
+ if (!data) {
26
+ return null;
27
+ }
28
+ const subscription = data;
29
+ return {
30
+ claimCollections: subscription.claimCollections,
31
+ currentPlan: subscription.currentPlan,
32
+ currentPlanName: subscription.currentPlanName,
33
+ totalCredits: subscription.totalCredits,
34
+ planCredits: subscription.planCredits,
35
+ status: subscription.status,
36
+ adminAddress: subscription.adminAddress,
37
+ };
38
+ }
39
+ catch (error) {
40
+ console.error('Error fetching user subscription:', error);
41
+ return null;
42
+ }
43
+ };
44
+ //# sourceMappingURL=get-user-subscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-user-subscription.js","sourceRoot":"","sources":["../../src/utils/get-user-subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,OAAyC,EACzC,EAAE;IACF,OAAO;QACL,OAAO,EAAE,uDAAuD;QAChE,OAAO,EAAE,uDAAuD;QAChE,MAAM,EAAE,+CAA+C;KACxD,CAAC,OAAO,CAAC,CAAC;AACb,CAAC,CAAC;AA4BF,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,EACxC,WAAW,EACX,OAAO,EACP,eAAe,EAAE,gBAAgB,GACP,EAAiD,EAAE;IAC7E,MAAM,eAAe,GACnB,gBAAgB,IAAI,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,eAAe,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,uBAAuB,EACxG;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,WAAW,EAAE;gBACtC,cAAc,EAAE,kBAAkB;aACnC;SACF,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CACX,sCAAsC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC/E,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,YAAY,GAAG,IAAmC,CAAC;QACzD,OAAO;YACL,gBAAgB,EAAE,YAAY,CAAC,gBAAgB;YAC/C,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,eAAe,EAAE,YAAY,CAAC,eAAe;YAC7C,YAAY,EAAE,YAAY,CAAC,YAAY;YACvC,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,YAAY,EAAE,YAAY,CAAC,YAAY;SACxC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './get-user-subscription.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './get-user-subscription.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,84 @@
1
+ # AI Module Documentation
2
+
3
+ ## Overview
4
+
5
+ The AI module in `@ixo/common` provides a suite of AI-powered tools and utilities designed to extend the capabilities of ixo oracles. It integrates with OpenAI and LangChain for language model interactions, document processing, semantic routing, and includes various utility functions.
6
+
7
+ ## Components
8
+
9
+ ### 1. Checkpointing
10
+
11
+ The checkpointing system enables persistence of LangChain graph states using SQLite. Optionally, you can also integrate with Matrix-based checkpointing by importing from `@ixo/matrix`.
12
+
13
+ ```typescript
14
+ import { SqliteSaver } from '@ixo/common/ai';
15
+
16
+ const checkpointer = new SqliteSaver('./checkpoints');
17
+ const graph = workflow.compile({
18
+ checkpointer,
19
+ });
20
+ ```
21
+
22
+ ### 2. Nodes
23
+
24
+ #### Find Docs Node
25
+
26
+ this node to be used to find the most relevant documents from a vector database with langgraph
27
+
28
+ #### Fake Node
29
+
30
+ this node is a fake node to pass the state to the next node
31
+
32
+ ### 3. Semantic Routing
33
+
34
+ The semantic router creates intelligent routing based on content analysis using OpenAI:
35
+
36
+ ```typescript
37
+ import { createSemanticRouter } from '@ixo/common/ai';
38
+
39
+ const routes = {
40
+ generateBlog: 'if the intent is blog',
41
+ generateSocialMediaPost: 'if the intent is post',
42
+ };
43
+
44
+ const router = createSemanticRouter(routes, ['intent'], 'gpt-4o-mini');
45
+
46
+ // Use the router
47
+ const nextRoute = await router({
48
+ intent: 'Create a blog post about AI',
49
+ });
50
+ ```
51
+
52
+ Features:
53
+
54
+ - Type-safe route creation and validation
55
+ - Supports 'gpt-4o-mini' and 'gpt-4o' models
56
+ - Handles complex routing scenarios
57
+ - Integrated with LangSmith for tracing
58
+
59
+ ### 4. OpenAI Integration
60
+
61
+ The module provides convenient OpenAI model factories:
62
+
63
+ ```typescript
64
+ import {
65
+ getChatOpenAiModel,
66
+ getOpenAiEmbeddings,
67
+ getOpenAiClient,
68
+ } from '@ixo/common/ai/models';
69
+
70
+ // Get a ChatOpenAI instance
71
+ const chatModel = getChatOpenAiModel();
72
+
73
+ // Get embeddings model
74
+ const embeddings = getOpenAiEmbeddings({
75
+ model: 'text-embedding-3-small',
76
+ });
77
+
78
+ // Get raw OpenAI client
79
+ const openai = getOpenAiClient();
80
+ ```
81
+
82
+ ### 5. Tools & Utilities
83
+
84
+ For detailed documentation on available tools, please refer to the [Tools Documentation](./tools.md).