@debian777/kairos-mcp 3.0.1-beta.14

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 (502) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +108 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/cli/api-client.d.ts +31 -0
  5. package/dist/cli/api-client.d.ts.map +1 -0
  6. package/dist/cli/api-client.js +110 -0
  7. package/dist/cli/api-client.js.map +1 -0
  8. package/dist/cli/commands/attest.d.ts +6 -0
  9. package/dist/cli/commands/attest.d.ts.map +1 -0
  10. package/dist/cli/commands/attest.js +52 -0
  11. package/dist/cli/commands/attest.js.map +1 -0
  12. package/dist/cli/commands/begin.d.ts +6 -0
  13. package/dist/cli/commands/begin.d.ts.map +1 -0
  14. package/dist/cli/commands/begin.js +32 -0
  15. package/dist/cli/commands/begin.js.map +1 -0
  16. package/dist/cli/commands/delete.d.ts +6 -0
  17. package/dist/cli/commands/delete.d.ts.map +1 -0
  18. package/dist/cli/commands/delete.js +32 -0
  19. package/dist/cli/commands/delete.js.map +1 -0
  20. package/dist/cli/commands/mint.d.ts +6 -0
  21. package/dist/cli/commands/mint.d.ts.map +1 -0
  22. package/dist/cli/commands/mint.js +48 -0
  23. package/dist/cli/commands/mint.js.map +1 -0
  24. package/dist/cli/commands/next.d.ts +6 -0
  25. package/dist/cli/commands/next.d.ts.map +1 -0
  26. package/dist/cli/commands/next.js +89 -0
  27. package/dist/cli/commands/next.js.map +1 -0
  28. package/dist/cli/commands/search.d.ts +6 -0
  29. package/dist/cli/commands/search.d.ts.map +1 -0
  30. package/dist/cli/commands/search.js +32 -0
  31. package/dist/cli/commands/search.js.map +1 -0
  32. package/dist/cli/commands/update.d.ts +6 -0
  33. package/dist/cli/commands/update.d.ts.map +1 -0
  34. package/dist/cli/commands/update.js +72 -0
  35. package/dist/cli/commands/update.js.map +1 -0
  36. package/dist/cli/config.d.ts +9 -0
  37. package/dist/cli/config.d.ts.map +1 -0
  38. package/dist/cli/config.js +14 -0
  39. package/dist/cli/config.js.map +1 -0
  40. package/dist/cli/index.d.ts +6 -0
  41. package/dist/cli/index.d.ts.map +1 -0
  42. package/dist/cli/index.js +40 -0
  43. package/dist/cli/index.js.map +1 -0
  44. package/dist/cli/output.d.ts +10 -0
  45. package/dist/cli/output.d.ts.map +1 -0
  46. package/dist/cli/output.js +20 -0
  47. package/dist/cli/output.js.map +1 -0
  48. package/dist/config.d.ts +58 -0
  49. package/dist/config.d.ts.map +1 -0
  50. package/dist/config.js +165 -0
  51. package/dist/config.js.map +1 -0
  52. package/dist/embed-docs/mem/00000000-0000-0000-0000-000000002001.md +324 -0
  53. package/dist/embed-docs/mem/00000000-0000-0000-0000-000000002002.md +48 -0
  54. package/dist/http/bearer-validate.d.ts +14 -0
  55. package/dist/http/bearer-validate.d.ts.map +1 -0
  56. package/dist/http/bearer-validate.js +111 -0
  57. package/dist/http/bearer-validate.js.map +1 -0
  58. package/dist/http/http-api-attest.d.ts +7 -0
  59. package/dist/http/http-api-attest.d.ts.map +1 -0
  60. package/dist/http/http-api-attest.js +103 -0
  61. package/dist/http/http-api-attest.js.map +1 -0
  62. package/dist/http/http-api-begin-step.d.ts +8 -0
  63. package/dist/http/http-api-begin-step.d.ts.map +1 -0
  64. package/dist/http/http-api-begin-step.js +108 -0
  65. package/dist/http/http-api-begin-step.js.map +1 -0
  66. package/dist/http/http-api-begin.d.ts +8 -0
  67. package/dist/http/http-api-begin.d.ts.map +1 -0
  68. package/dist/http/http-api-begin.js +167 -0
  69. package/dist/http/http-api-begin.js.map +1 -0
  70. package/dist/http/http-api-delete.d.ts +9 -0
  71. package/dist/http/http-api-delete.d.ts.map +1 -0
  72. package/dist/http/http-api-delete.js +67 -0
  73. package/dist/http/http-api-delete.js.map +1 -0
  74. package/dist/http/http-api-dump.d.ts +8 -0
  75. package/dist/http/http-api-dump.d.ts.map +1 -0
  76. package/dist/http/http-api-dump.js +34 -0
  77. package/dist/http/http-api-dump.js.map +1 -0
  78. package/dist/http/http-api-mint.d.ts +9 -0
  79. package/dist/http/http-api-mint.d.ts.map +1 -0
  80. package/dist/http/http-api-mint.js +100 -0
  81. package/dist/http/http-api-mint.js.map +1 -0
  82. package/dist/http/http-api-next.d.ts +9 -0
  83. package/dist/http/http-api-next.d.ts.map +1 -0
  84. package/dist/http/http-api-next.js +237 -0
  85. package/dist/http/http-api-next.js.map +1 -0
  86. package/dist/http/http-api-routes.d.ts +13 -0
  87. package/dist/http/http-api-routes.d.ts.map +1 -0
  88. package/dist/http/http-api-routes.js +28 -0
  89. package/dist/http/http-api-routes.js.map +1 -0
  90. package/dist/http/http-api-snapshot.d.ts +4 -0
  91. package/dist/http/http-api-snapshot.d.ts.map +1 -0
  92. package/dist/http/http-api-snapshot.js +36 -0
  93. package/dist/http/http-api-snapshot.js.map +1 -0
  94. package/dist/http/http-api-update.d.ts +9 -0
  95. package/dist/http/http-api-update.d.ts.map +1 -0
  96. package/dist/http/http-api-update.js +105 -0
  97. package/dist/http/http-api-update.js.map +1 -0
  98. package/dist/http/http-auth-callback.d.ts +6 -0
  99. package/dist/http/http-auth-callback.d.ts.map +1 -0
  100. package/dist/http/http-auth-callback.js +183 -0
  101. package/dist/http/http-auth-callback.js.map +1 -0
  102. package/dist/http/http-auth-middleware.d.ts +30 -0
  103. package/dist/http/http-auth-middleware.d.ts.map +1 -0
  104. package/dist/http/http-auth-middleware.js +224 -0
  105. package/dist/http/http-auth-middleware.js.map +1 -0
  106. package/dist/http/http-error-handlers.d.ts +7 -0
  107. package/dist/http/http-error-handlers.d.ts.map +1 -0
  108. package/dist/http/http-error-handlers.js +35 -0
  109. package/dist/http/http-error-handlers.js.map +1 -0
  110. package/dist/http/http-health-routes.d.ts +9 -0
  111. package/dist/http/http-health-routes.d.ts.map +1 -0
  112. package/dist/http/http-health-routes.js +117 -0
  113. package/dist/http/http-health-routes.js.map +1 -0
  114. package/dist/http/http-mcp-handler.d.ts +8 -0
  115. package/dist/http/http-mcp-handler.d.ts.map +1 -0
  116. package/dist/http/http-mcp-handler.js +136 -0
  117. package/dist/http/http-mcp-handler.js.map +1 -0
  118. package/dist/http/http-metrics-middleware.d.ts +7 -0
  119. package/dist/http/http-metrics-middleware.d.ts.map +1 -0
  120. package/dist/http/http-metrics-middleware.js +56 -0
  121. package/dist/http/http-metrics-middleware.js.map +1 -0
  122. package/dist/http/http-server-config.d.ts +11 -0
  123. package/dist/http/http-server-config.d.ts.map +1 -0
  124. package/dist/http/http-server-config.js +15 -0
  125. package/dist/http/http-server-config.js.map +1 -0
  126. package/dist/http/http-server-startup.d.ts +9 -0
  127. package/dist/http/http-server-startup.d.ts.map +1 -0
  128. package/dist/http/http-server-startup.js +26 -0
  129. package/dist/http/http-server-startup.js.map +1 -0
  130. package/dist/http/http-server.d.ts +4 -0
  131. package/dist/http/http-server.d.ts.map +1 -0
  132. package/dist/http/http-server.js +39 -0
  133. package/dist/http/http-server.js.map +1 -0
  134. package/dist/http/http-well-known.d.ts +13 -0
  135. package/dist/http/http-well-known.d.ts.map +1 -0
  136. package/dist/http/http-well-known.js +32 -0
  137. package/dist/http/http-well-known.js.map +1 -0
  138. package/dist/index.d.ts +7 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +100 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/metrics-server.d.ts +14 -0
  143. package/dist/metrics-server.d.ts.map +1 -0
  144. package/dist/metrics-server.js +41 -0
  145. package/dist/metrics-server.js.map +1 -0
  146. package/dist/resources/docs-resources.d.ts +2 -0
  147. package/dist/resources/docs-resources.d.ts.map +1 -0
  148. package/dist/resources/docs-resources.js +47 -0
  149. package/dist/resources/docs-resources.js.map +1 -0
  150. package/dist/resources/embedded-mcp-resources.d.ts +73 -0
  151. package/dist/resources/embedded-mcp-resources.d.ts.map +1 -0
  152. package/dist/resources/embedded-mcp-resources.js +132 -0
  153. package/dist/resources/embedded-mcp-resources.js.map +1 -0
  154. package/dist/resources/mem-resources-boot.d.ts +10 -0
  155. package/dist/resources/mem-resources-boot.d.ts.map +1 -0
  156. package/dist/resources/mem-resources-boot.js +164 -0
  157. package/dist/resources/mem-resources-boot.js.map +1 -0
  158. package/dist/resources/prompt-resources.d.ts +5 -0
  159. package/dist/resources/prompt-resources.d.ts.map +1 -0
  160. package/dist/resources/prompt-resources.js +42 -0
  161. package/dist/resources/prompt-resources.js.map +1 -0
  162. package/dist/resources/resource-bootstrap.d.ts +7 -0
  163. package/dist/resources/resource-bootstrap.d.ts.map +1 -0
  164. package/dist/resources/resource-bootstrap.js +33 -0
  165. package/dist/resources/resource-bootstrap.js.map +1 -0
  166. package/dist/server.d.ts +4 -0
  167. package/dist/server.d.ts.map +1 -0
  168. package/dist/server.js +79 -0
  169. package/dist/server.js.map +1 -0
  170. package/dist/services/chain-utils.d.ts +22 -0
  171. package/dist/services/chain-utils.d.ts.map +1 -0
  172. package/dist/services/chain-utils.js +95 -0
  173. package/dist/services/chain-utils.js.map +1 -0
  174. package/dist/services/code-block-processor.d.ts +40 -0
  175. package/dist/services/code-block-processor.d.ts.map +1 -0
  176. package/dist/services/code-block-processor.js +169 -0
  177. package/dist/services/code-block-processor.js.map +1 -0
  178. package/dist/services/embedding/config.d.ts +5 -0
  179. package/dist/services/embedding/config.d.ts.map +1 -0
  180. package/dist/services/embedding/config.js +13 -0
  181. package/dist/services/embedding/config.js.map +1 -0
  182. package/dist/services/embedding/providers.d.ts +5 -0
  183. package/dist/services/embedding/providers.d.ts.map +1 -0
  184. package/dist/services/embedding/providers.js +141 -0
  185. package/dist/services/embedding/providers.js.map +1 -0
  186. package/dist/services/embedding/service.d.ts +39 -0
  187. package/dist/services/embedding/service.d.ts.map +1 -0
  188. package/dist/services/embedding/service.js +302 -0
  189. package/dist/services/embedding/service.js.map +1 -0
  190. package/dist/services/embedding/types.d.ts +17 -0
  191. package/dist/services/embedding/types.d.ts.map +1 -0
  192. package/dist/services/embedding/types.js +2 -0
  193. package/dist/services/embedding/types.js.map +1 -0
  194. package/dist/services/id-generator.d.ts +63 -0
  195. package/dist/services/id-generator.d.ts.map +1 -0
  196. package/dist/services/id-generator.js +101 -0
  197. package/dist/services/id-generator.js.map +1 -0
  198. package/dist/services/key-value-store-factory.d.ts +7 -0
  199. package/dist/services/key-value-store-factory.d.ts.map +1 -0
  200. package/dist/services/key-value-store-factory.js +15 -0
  201. package/dist/services/key-value-store-factory.js.map +1 -0
  202. package/dist/services/key-value-store.d.ts +24 -0
  203. package/dist/services/key-value-store.d.ts.map +1 -0
  204. package/dist/services/key-value-store.js +6 -0
  205. package/dist/services/key-value-store.js.map +1 -0
  206. package/dist/services/memory/chain-builder-proof.d.ts +18 -0
  207. package/dist/services/memory/chain-builder-proof.d.ts.map +1 -0
  208. package/dist/services/memory/chain-builder-proof.js +78 -0
  209. package/dist/services/memory/chain-builder-proof.js.map +1 -0
  210. package/dist/services/memory/chain-builder.d.ts +4 -0
  211. package/dist/services/memory/chain-builder.d.ts.map +1 -0
  212. package/dist/services/memory/chain-builder.js +185 -0
  213. package/dist/services/memory/chain-builder.js.map +1 -0
  214. package/dist/services/memory/store-chain-default-handler.d.ts +9 -0
  215. package/dist/services/memory/store-chain-default-handler.d.ts.map +1 -0
  216. package/dist/services/memory/store-chain-default-handler.js +118 -0
  217. package/dist/services/memory/store-chain-default-handler.js.map +1 -0
  218. package/dist/services/memory/store-chain-header-handler.d.ts +8 -0
  219. package/dist/services/memory/store-chain-header-handler.d.ts.map +1 -0
  220. package/dist/services/memory/store-chain-header-handler.js +98 -0
  221. package/dist/services/memory/store-chain-header-handler.js.map +1 -0
  222. package/dist/services/memory/store-chain-helpers.d.ts +27 -0
  223. package/dist/services/memory/store-chain-helpers.d.ts.map +1 -0
  224. package/dist/services/memory/store-chain-helpers.js +102 -0
  225. package/dist/services/memory/store-chain-helpers.js.map +1 -0
  226. package/dist/services/memory/store-chain.d.ts +15 -0
  227. package/dist/services/memory/store-chain.d.ts.map +1 -0
  228. package/dist/services/memory/store-chain.js +56 -0
  229. package/dist/services/memory/store-chain.js.map +1 -0
  230. package/dist/services/memory/store-init.d.ts +3 -0
  231. package/dist/services/memory/store-init.d.ts.map +1 -0
  232. package/dist/services/memory/store-init.js +127 -0
  233. package/dist/services/memory/store-init.js.map +1 -0
  234. package/dist/services/memory/store-methods.d.ts +35 -0
  235. package/dist/services/memory/store-methods.d.ts.map +1 -0
  236. package/dist/services/memory/store-methods.js +308 -0
  237. package/dist/services/memory/store-methods.js.map +1 -0
  238. package/dist/services/memory/store.d.ts +36 -0
  239. package/dist/services/memory/store.d.ts.map +1 -0
  240. package/dist/services/memory/store.js +119 -0
  241. package/dist/services/memory/store.js.map +1 -0
  242. package/dist/services/memory-store.d.ts +33 -0
  243. package/dist/services/memory-store.d.ts.map +1 -0
  244. package/dist/services/memory-store.js +158 -0
  245. package/dist/services/memory-store.js.map +1 -0
  246. package/dist/services/metrics/agent-metrics.d.ts +12 -0
  247. package/dist/services/metrics/agent-metrics.d.ts.map +1 -0
  248. package/dist/services/metrics/agent-metrics.js +34 -0
  249. package/dist/services/metrics/agent-metrics.js.map +1 -0
  250. package/dist/services/metrics/embedding-metrics.d.ts +12 -0
  251. package/dist/services/metrics/embedding-metrics.d.ts.map +1 -0
  252. package/dist/services/metrics/embedding-metrics.js +41 -0
  253. package/dist/services/metrics/embedding-metrics.js.map +1 -0
  254. package/dist/services/metrics/http-metrics.d.ts +12 -0
  255. package/dist/services/metrics/http-metrics.d.ts.map +1 -0
  256. package/dist/services/metrics/http-metrics.js +41 -0
  257. package/dist/services/metrics/http-metrics.js.map +1 -0
  258. package/dist/services/metrics/mcp-metrics.d.ts +16 -0
  259. package/dist/services/metrics/mcp-metrics.d.ts.map +1 -0
  260. package/dist/services/metrics/mcp-metrics.js +55 -0
  261. package/dist/services/metrics/mcp-metrics.js.map +1 -0
  262. package/dist/services/metrics/memory-metrics.d.ts +10 -0
  263. package/dist/services/metrics/memory-metrics.d.ts.map +1 -0
  264. package/dist/services/metrics/memory-metrics.js +28 -0
  265. package/dist/services/metrics/memory-metrics.js.map +1 -0
  266. package/dist/services/metrics/qdrant-metrics.d.ts +11 -0
  267. package/dist/services/metrics/qdrant-metrics.d.ts.map +1 -0
  268. package/dist/services/metrics/qdrant-metrics.js +35 -0
  269. package/dist/services/metrics/qdrant-metrics.js.map +1 -0
  270. package/dist/services/metrics/registry.d.ts +9 -0
  271. package/dist/services/metrics/registry.d.ts.map +1 -0
  272. package/dist/services/metrics/registry.js +19 -0
  273. package/dist/services/metrics/registry.js.map +1 -0
  274. package/dist/services/metrics/system-metrics.d.ts +10 -0
  275. package/dist/services/metrics/system-metrics.d.ts.map +1 -0
  276. package/dist/services/metrics/system-metrics.js +35 -0
  277. package/dist/services/metrics/system-metrics.js.map +1 -0
  278. package/dist/services/proof-of-work-store.d.ts +66 -0
  279. package/dist/services/proof-of-work-store.d.ts.map +1 -0
  280. package/dist/services/proof-of-work-store.js +141 -0
  281. package/dist/services/proof-of-work-store.js.map +1 -0
  282. package/dist/services/qdrant/connection.d.ts +24 -0
  283. package/dist/services/qdrant/connection.d.ts.map +1 -0
  284. package/dist/services/qdrant/connection.js +126 -0
  285. package/dist/services/qdrant/connection.js.map +1 -0
  286. package/dist/services/qdrant/index.d.ts +3 -0
  287. package/dist/services/qdrant/index.d.ts.map +1 -0
  288. package/dist/services/qdrant/index.js +4 -0
  289. package/dist/services/qdrant/index.js.map +1 -0
  290. package/dist/services/qdrant/initialization.d.ts +25 -0
  291. package/dist/services/qdrant/initialization.d.ts.map +1 -0
  292. package/dist/services/qdrant/initialization.js +170 -0
  293. package/dist/services/qdrant/initialization.js.map +1 -0
  294. package/dist/services/qdrant/listing.d.ts +26 -0
  295. package/dist/services/qdrant/listing.d.ts.map +1 -0
  296. package/dist/services/qdrant/listing.js +88 -0
  297. package/dist/services/qdrant/listing.js.map +1 -0
  298. package/dist/services/qdrant/memory-retrieval.d.ts +14 -0
  299. package/dist/services/qdrant/memory-retrieval.d.ts.map +1 -0
  300. package/dist/services/qdrant/memory-retrieval.js +110 -0
  301. package/dist/services/qdrant/memory-retrieval.js.map +1 -0
  302. package/dist/services/qdrant/memory-store.d.ts +16 -0
  303. package/dist/services/qdrant/memory-store.d.ts.map +1 -0
  304. package/dist/services/qdrant/memory-store.js +108 -0
  305. package/dist/services/qdrant/memory-store.js.map +1 -0
  306. package/dist/services/qdrant/memory-updates.d.ts +8 -0
  307. package/dist/services/qdrant/memory-updates.d.ts.map +1 -0
  308. package/dist/services/qdrant/memory-updates.js +206 -0
  309. package/dist/services/qdrant/memory-updates.js.map +1 -0
  310. package/dist/services/qdrant/protocol.d.ts +16 -0
  311. package/dist/services/qdrant/protocol.d.ts.map +1 -0
  312. package/dist/services/qdrant/protocol.js +48 -0
  313. package/dist/services/qdrant/protocol.js.map +1 -0
  314. package/dist/services/qdrant/quality.d.ts +14 -0
  315. package/dist/services/qdrant/quality.d.ts.map +1 -0
  316. package/dist/services/qdrant/quality.js +101 -0
  317. package/dist/services/qdrant/quality.js.map +1 -0
  318. package/dist/services/qdrant/resources.d.ts +7 -0
  319. package/dist/services/qdrant/resources.d.ts.map +1 -0
  320. package/dist/services/qdrant/resources.js +108 -0
  321. package/dist/services/qdrant/resources.js.map +1 -0
  322. package/dist/services/qdrant/search.d.ts +22 -0
  323. package/dist/services/qdrant/search.d.ts.map +1 -0
  324. package/dist/services/qdrant/search.js +75 -0
  325. package/dist/services/qdrant/search.js.map +1 -0
  326. package/dist/services/qdrant/service.d.ts +90 -0
  327. package/dist/services/qdrant/service.d.ts.map +1 -0
  328. package/dist/services/qdrant/service.js +95 -0
  329. package/dist/services/qdrant/service.js.map +1 -0
  330. package/dist/services/qdrant/snapshots.d.ts +19 -0
  331. package/dist/services/qdrant/snapshots.d.ts.map +1 -0
  332. package/dist/services/qdrant/snapshots.js +130 -0
  333. package/dist/services/qdrant/snapshots.js.map +1 -0
  334. package/dist/services/qdrant/types.d.ts +39 -0
  335. package/dist/services/qdrant/types.d.ts.map +1 -0
  336. package/dist/services/qdrant/types.js +2 -0
  337. package/dist/services/qdrant/types.js.map +1 -0
  338. package/dist/services/qdrant/utils.d.ts +20 -0
  339. package/dist/services/qdrant/utils.d.ts.map +1 -0
  340. package/dist/services/qdrant/utils.js +121 -0
  341. package/dist/services/qdrant/utils.js.map +1 -0
  342. package/dist/services/redis-cache.d.ts +43 -0
  343. package/dist/services/redis-cache.d.ts.map +1 -0
  344. package/dist/services/redis-cache.js +214 -0
  345. package/dist/services/redis-cache.js.map +1 -0
  346. package/dist/services/redis.d.ts +43 -0
  347. package/dist/services/redis.d.ts.map +1 -0
  348. package/dist/services/redis.js +234 -0
  349. package/dist/services/redis.js.map +1 -0
  350. package/dist/services/stats/bonuses.d.ts +28 -0
  351. package/dist/services/stats/bonuses.d.ts.map +1 -0
  352. package/dist/services/stats/bonuses.js +96 -0
  353. package/dist/services/stats/bonuses.js.map +1 -0
  354. package/dist/services/stats/healer.d.ts +6 -0
  355. package/dist/services/stats/healer.d.ts.map +1 -0
  356. package/dist/services/stats/healer.js +24 -0
  357. package/dist/services/stats/healer.js.map +1 -0
  358. package/dist/services/stats/model-stats.d.ts +53 -0
  359. package/dist/services/stats/model-stats.d.ts.map +1 -0
  360. package/dist/services/stats/model-stats.js +238 -0
  361. package/dist/services/stats/model-stats.js.map +1 -0
  362. package/dist/services/stats/protocol.d.ts +11 -0
  363. package/dist/services/stats/protocol.d.ts.map +1 -0
  364. package/dist/services/stats/protocol.js +55 -0
  365. package/dist/services/stats/protocol.js.map +1 -0
  366. package/dist/services/stats/scoring.d.ts +19 -0
  367. package/dist/services/stats/scoring.d.ts.map +1 -0
  368. package/dist/services/stats/scoring.js +102 -0
  369. package/dist/services/stats/scoring.js.map +1 -0
  370. package/dist/services/stats/types.d.ts +39 -0
  371. package/dist/services/stats/types.d.ts.map +1 -0
  372. package/dist/services/stats/types.js +8 -0
  373. package/dist/services/stats/types.js.map +1 -0
  374. package/dist/tools/kairos_attest.d.ts +7 -0
  375. package/dist/tools/kairos_attest.d.ts.map +1 -0
  376. package/dist/tools/kairos_attest.js +179 -0
  377. package/dist/tools/kairos_attest.js.map +1 -0
  378. package/dist/tools/kairos_begin.d.ts +9 -0
  379. package/dist/tools/kairos_begin.d.ts.map +1 -0
  380. package/dist/tools/kairos_begin.js +149 -0
  381. package/dist/tools/kairos_begin.js.map +1 -0
  382. package/dist/tools/kairos_begin_schema.d.ts +48 -0
  383. package/dist/tools/kairos_begin_schema.d.ts.map +1 -0
  384. package/dist/tools/kairos_begin_schema.js +48 -0
  385. package/dist/tools/kairos_begin_schema.js.map +1 -0
  386. package/dist/tools/kairos_delete.d.ts +2 -0
  387. package/dist/tools/kairos_delete.d.ts.map +1 -0
  388. package/dist/tools/kairos_delete.js +113 -0
  389. package/dist/tools/kairos_delete.js.map +1 -0
  390. package/dist/tools/kairos_dump.d.ts +14 -0
  391. package/dist/tools/kairos_dump.d.ts.map +1 -0
  392. package/dist/tools/kairos_dump.js +148 -0
  393. package/dist/tools/kairos_dump.js.map +1 -0
  394. package/dist/tools/kairos_mint.d.ts +7 -0
  395. package/dist/tools/kairos_mint.d.ts.map +1 -0
  396. package/dist/tools/kairos_mint.js +233 -0
  397. package/dist/tools/kairos_mint.js.map +1 -0
  398. package/dist/tools/kairos_next-missing-proof-payload.d.ts +24 -0
  399. package/dist/tools/kairos_next-missing-proof-payload.d.ts.map +1 -0
  400. package/dist/tools/kairos_next-missing-proof-payload.js +32 -0
  401. package/dist/tools/kairos_next-missing-proof-payload.js.map +1 -0
  402. package/dist/tools/kairos_next-pow-helpers.d.ts +57 -0
  403. package/dist/tools/kairos_next-pow-helpers.d.ts.map +1 -0
  404. package/dist/tools/kairos_next-pow-helpers.js +271 -0
  405. package/dist/tools/kairos_next-pow-helpers.js.map +1 -0
  406. package/dist/tools/kairos_next-previous-step.d.ts +36 -0
  407. package/dist/tools/kairos_next-previous-step.d.ts.map +1 -0
  408. package/dist/tools/kairos_next-previous-step.js +121 -0
  409. package/dist/tools/kairos_next-previous-step.js.map +1 -0
  410. package/dist/tools/kairos_next.d.ts +12 -0
  411. package/dist/tools/kairos_next.d.ts.map +1 -0
  412. package/dist/tools/kairos_next.js +285 -0
  413. package/dist/tools/kairos_next.js.map +1 -0
  414. package/dist/tools/kairos_next_schema.d.ts +80 -0
  415. package/dist/tools/kairos_next_schema.d.ts.map +1 -0
  416. package/dist/tools/kairos_next_schema.js +82 -0
  417. package/dist/tools/kairos_next_schema.js.map +1 -0
  418. package/dist/tools/kairos_search.d.ts +15 -0
  419. package/dist/tools/kairos_search.d.ts.map +1 -0
  420. package/dist/tools/kairos_search.js +262 -0
  421. package/dist/tools/kairos_search.js.map +1 -0
  422. package/dist/tools/kairos_spaces.d.ts +10 -0
  423. package/dist/tools/kairos_spaces.d.ts.map +1 -0
  424. package/dist/tools/kairos_spaces.js +129 -0
  425. package/dist/tools/kairos_spaces.js.map +1 -0
  426. package/dist/tools/kairos_update.d.ts +2 -0
  427. package/dist/tools/kairos_update.d.ts.map +1 -0
  428. package/dist/tools/kairos_update.js +158 -0
  429. package/dist/tools/kairos_update.js.map +1 -0
  430. package/dist/types/index.d.ts +60 -0
  431. package/dist/types/index.d.ts.map +1 -0
  432. package/dist/types/index.js +21 -0
  433. package/dist/types/index.js.map +1 -0
  434. package/dist/types/memory.d.ts +38 -0
  435. package/dist/types/memory.d.ts.map +1 -0
  436. package/dist/types/memory.js +2 -0
  437. package/dist/types/memory.js.map +1 -0
  438. package/dist/utils/build-version.d.ts +15 -0
  439. package/dist/utils/build-version.d.ts.map +1 -0
  440. package/dist/utils/build-version.js +46 -0
  441. package/dist/utils/build-version.js.map +1 -0
  442. package/dist/utils/global-error-handlers.d.ts +7 -0
  443. package/dist/utils/global-error-handlers.d.ts.map +1 -0
  444. package/dist/utils/global-error-handlers.js +61 -0
  445. package/dist/utils/global-error-handlers.js.map +1 -0
  446. package/dist/utils/log-core.d.ts +11 -0
  447. package/dist/utils/log-core.d.ts.map +1 -0
  448. package/dist/utils/log-core.js +78 -0
  449. package/dist/utils/log-core.js.map +1 -0
  450. package/dist/utils/logger.d.ts +22 -0
  451. package/dist/utils/logger.d.ts.map +1 -0
  452. package/dist/utils/logger.js +63 -0
  453. package/dist/utils/logger.js.map +1 -0
  454. package/dist/utils/memory-body.d.ts +6 -0
  455. package/dist/utils/memory-body.d.ts.map +1 -0
  456. package/dist/utils/memory-body.js +21 -0
  457. package/dist/utils/memory-body.js.map +1 -0
  458. package/dist/utils/memory-store-utils.d.ts +14 -0
  459. package/dist/utils/memory-store-utils.d.ts.map +1 -0
  460. package/dist/utils/memory-store-utils.js +83 -0
  461. package/dist/utils/memory-store-utils.js.map +1 -0
  462. package/dist/utils/qdrant-collection-utils.d.ts +11 -0
  463. package/dist/utils/qdrant-collection-utils.d.ts.map +1 -0
  464. package/dist/utils/qdrant-collection-utils.js +62 -0
  465. package/dist/utils/qdrant-collection-utils.js.map +1 -0
  466. package/dist/utils/qdrant-query-utils.d.ts +6 -0
  467. package/dist/utils/qdrant-query-utils.d.ts.map +1 -0
  468. package/dist/utils/qdrant-query-utils.js +23 -0
  469. package/dist/utils/qdrant-query-utils.js.map +1 -0
  470. package/dist/utils/qdrant-utils.d.ts +5 -0
  471. package/dist/utils/qdrant-utils.d.ts.map +1 -0
  472. package/dist/utils/qdrant-utils.js +5 -0
  473. package/dist/utils/qdrant-utils.js.map +1 -0
  474. package/dist/utils/qdrant-vector-management.d.ts +25 -0
  475. package/dist/utils/qdrant-vector-management.d.ts.map +1 -0
  476. package/dist/utils/qdrant-vector-management.js +284 -0
  477. package/dist/utils/qdrant-vector-management.js.map +1 -0
  478. package/dist/utils/qdrant-vector-types.d.ts +35 -0
  479. package/dist/utils/qdrant-vector-types.d.ts.map +1 -0
  480. package/dist/utils/qdrant-vector-types.js +42 -0
  481. package/dist/utils/qdrant-vector-types.js.map +1 -0
  482. package/dist/utils/space-display.d.ts +11 -0
  483. package/dist/utils/space-display.d.ts.map +1 -0
  484. package/dist/utils/space-display.js +25 -0
  485. package/dist/utils/space-display.js.map +1 -0
  486. package/dist/utils/space-filter.d.ts +15 -0
  487. package/dist/utils/space-filter.d.ts.map +1 -0
  488. package/dist/utils/space-filter.js +18 -0
  489. package/dist/utils/space-filter.js.map +1 -0
  490. package/dist/utils/structured-logger.d.ts +41 -0
  491. package/dist/utils/structured-logger.d.ts.map +1 -0
  492. package/dist/utils/structured-logger.js +133 -0
  493. package/dist/utils/structured-logger.js.map +1 -0
  494. package/dist/utils/tenant-context.d.ts +67 -0
  495. package/dist/utils/tenant-context.d.ts.map +1 -0
  496. package/dist/utils/tenant-context.js +154 -0
  497. package/dist/utils/tenant-context.js.map +1 -0
  498. package/dist/utils/uri-builder.d.ts +37 -0
  499. package/dist/utils/uri-builder.d.ts.map +1 -0
  500. package/dist/utils/uri-builder.js +60 -0
  501. package/dist/utils/uri-builder.js.map +1 -0
  502. package/package.json +121 -0
@@ -0,0 +1,214 @@
1
+ import { logger } from '../utils/logger.js';
2
+ import { keyValueStore } from './key-value-store-factory.js';
3
+ import { KAIROS_REDIS_PREFIX } from '../config.js';
4
+ import { getSpaceIdFromStorage } from '../utils/tenant-context.js';
5
+ export class RedisCacheService {
6
+ cachePrefix = 'search:';
7
+ invalidationChannel = 'cache:invalidation';
8
+ statsPrefix = 'stats:';
9
+ memoryPrefix = 'mem:';
10
+ constructor() {
11
+ logger.info('[RedisCacheService] Initialized with RedisService');
12
+ }
13
+ getCacheKey(query, limit, opts) {
14
+ const mode = opts && typeof opts.collapse === 'boolean' ? (opts.collapse ? 'collapsed' : 'natural') : 'collapsed';
15
+ return `${this.cachePrefix}${mode}:${query}:${limit}`;
16
+ }
17
+ async getSearchResult(query, limit, opts) {
18
+ try {
19
+ const key = this.getCacheKey(query, limit, opts);
20
+ const cached = await keyValueStore.getJson(key);
21
+ if (cached) {
22
+ logger.debug(`[RedisCacheService] Cache hit for query "${query}" limit ${limit}`);
23
+ await this.incrementHits();
24
+ return cached;
25
+ }
26
+ logger.debug(`[RedisCacheService] Cache miss for query "${query}" limit ${limit}`);
27
+ await this.incrementMisses();
28
+ return null;
29
+ }
30
+ catch (error) {
31
+ logger.error('[RedisCacheService] Failed to get search result from cache:', error);
32
+ return null;
33
+ }
34
+ }
35
+ async setSearchResult(query, limit, result, opts) {
36
+ try {
37
+ const key = this.getCacheKey(query, limit, opts);
38
+ const ttl = 300; // 5 minutes
39
+ const cachedResult = {
40
+ results: result.memories.map((memory, index) => ({
41
+ uri: `kairos://mem/${memory.memory_uuid}`,
42
+ label: memory.label,
43
+ score: result.scores[index] ?? 0
44
+ }))
45
+ };
46
+ await keyValueStore.setJson(key, cachedResult, ttl);
47
+ logger.debug(`[RedisCacheService] Cached search result for query "${query}" limit ${limit}`);
48
+ }
49
+ catch (error) {
50
+ logger.error('[RedisCacheService] Failed to set search result in cache:', error);
51
+ }
52
+ }
53
+ async invalidateSearchCache() {
54
+ try {
55
+ logger.info(`[RedisCacheService] Search cache invalidation requested`);
56
+ // Delete keys matching search cache pattern (all collapse modes)
57
+ const keys = await keyValueStore.keys(`${this.cachePrefix}*`);
58
+ if (!keys || keys.length === 0) {
59
+ logger.debug('[RedisCacheService] No search cache keys to delete');
60
+ // Still publish invalidation event even if no keys to delete
61
+ await this.publishInvalidation('search');
62
+ return;
63
+ }
64
+ // Keys returned are full Redis keys (prefix + spaceId + logicalKey); strip to get logicalKey for del()
65
+ const keyPrefix = `${KAIROS_REDIS_PREFIX}${getSpaceIdFromStorage()}:`;
66
+ const stripped = keys.map(k => k.startsWith(keyPrefix) ? k.slice(keyPrefix.length) : k);
67
+ await Promise.all(stripped.map(k => keyValueStore.del(k)));
68
+ logger.info(`[RedisCacheService] Invalidated ${stripped.length} search cache keys`);
69
+ // Publish invalidation event
70
+ await this.publishInvalidation('search');
71
+ }
72
+ catch (error) {
73
+ logger.error('[RedisCacheService] Failed to invalidate search cache:', error);
74
+ }
75
+ }
76
+ // Remove cached memory by UUID (kb:<prefix>mem:{uuid})
77
+ async invalidateMemoryCache(uuid) {
78
+ try {
79
+ if (!uuid || typeof uuid !== 'string') {
80
+ logger.warn('[RedisCacheService] invalidateMemoryCache called with invalid uuid');
81
+ return;
82
+ }
83
+ const key = `${this.memoryPrefix}${uuid}`;
84
+ await keyValueStore.del(key);
85
+ logger.debug(`[RedisCacheService] Invalidated memory cache for UUID ${uuid}`);
86
+ // Publish invalidation event
87
+ await this.publishInvalidation('memory');
88
+ }
89
+ catch (error) {
90
+ logger.error('[RedisCacheService] Failed to invalidate memory cache:', error);
91
+ }
92
+ }
93
+ async publishInvalidation(type) {
94
+ try {
95
+ const message = JSON.stringify({
96
+ type,
97
+ timestamp: Date.now()
98
+ });
99
+ const subscribers = await keyValueStore.publish(this.invalidationChannel, message);
100
+ logger.debug(`[RedisCacheService] Published invalidation event: ${type} to ${this.invalidationChannel} (${subscribers} subscribers notified)`);
101
+ }
102
+ catch (error) {
103
+ logger.error('[RedisCacheService] Failed to publish invalidation:', error);
104
+ }
105
+ }
106
+ async incrementHits() {
107
+ try {
108
+ await keyValueStore.incr(`${this.statsPrefix}hits`);
109
+ }
110
+ catch (error) {
111
+ logger.error('[RedisCacheService] Failed to increment hits:', error);
112
+ }
113
+ }
114
+ async incrementMisses() {
115
+ try {
116
+ await keyValueStore.incr(`${this.statsPrefix}misses`);
117
+ }
118
+ catch (error) {
119
+ logger.error('[RedisCacheService] Failed to increment misses:', error);
120
+ }
121
+ }
122
+ async getCacheStats() {
123
+ try {
124
+ const [hits, misses] = await Promise.all([
125
+ keyValueStore.get(`${this.statsPrefix}hits`),
126
+ keyValueStore.get(`${this.statsPrefix}misses`)
127
+ ]);
128
+ return {
129
+ hits: parseInt(hits || '0', 10),
130
+ misses: parseInt(misses || '0', 10)
131
+ };
132
+ }
133
+ catch (error) {
134
+ logger.error('[RedisCacheService] Failed to get cache stats:', error);
135
+ return { hits: 0, misses: 0 };
136
+ }
137
+ }
138
+ // Memory resource caching methods
139
+ async getMemoryResource(uuid) {
140
+ try {
141
+ const key = `${this.memoryPrefix}${uuid}`;
142
+ const cached = await keyValueStore.getJson(key);
143
+ if (cached) {
144
+ logger.debug(`[RedisCacheService] Memory cache hit for UUID ${uuid}`);
145
+ return cached;
146
+ }
147
+ return null;
148
+ }
149
+ catch (error) {
150
+ logger.error('[RedisCacheService] Failed to get memory from cache:', error);
151
+ return null;
152
+ }
153
+ }
154
+ async setMemoryResource(memory) {
155
+ try {
156
+ const key = `${this.memoryPrefix}${memory.memory_uuid}`;
157
+ // Store memories without TTL (permanent storage)
158
+ await keyValueStore.setJson(key, memory);
159
+ logger.debug(`[RedisCacheService] Cached memory resource for UUID ${memory.memory_uuid} (no TTL)`);
160
+ }
161
+ catch (error) {
162
+ logger.error('[RedisCacheService] Failed to cache memory resource:', error);
163
+ }
164
+ }
165
+ // Invalidate begin cache (kairos_begin tool results)
166
+ async invalidateBeginCache() {
167
+ try {
168
+ logger.info(`[RedisCacheService] Begin cache invalidation requested`);
169
+ // Delete keys matching begin cache pattern
170
+ const keys = await keyValueStore.keys('begin:*');
171
+ if (!keys || keys.length === 0) {
172
+ logger.debug('[RedisCacheService] No begin cache keys to delete');
173
+ return;
174
+ }
175
+ // Keys returned are full Redis keys (prefix + spaceId + logicalKey); strip to get logicalKey for del()
176
+ const keyPrefix = `${KAIROS_REDIS_PREFIX}${getSpaceIdFromStorage()}:`;
177
+ const stripped = keys.map(k => k.startsWith(keyPrefix) ? k.slice(keyPrefix.length) : k);
178
+ await Promise.all(stripped.map(k => keyValueStore.del(k)));
179
+ logger.info(`[RedisCacheService] Invalidated ${stripped.length} begin cache keys`);
180
+ }
181
+ catch (error) {
182
+ logger.error('[RedisCacheService] Failed to invalidate begin cache:', error);
183
+ }
184
+ }
185
+ // For atomic operations as per plan
186
+ // System is mostly read-heavy, so invalidate aggressively on writes
187
+ async invalidateAfterUpdate() {
188
+ logger.info('[RedisCacheService] Cache invalidation after Qdrant update - clearing all search and begin caches');
189
+ await Promise.all([
190
+ this.invalidateSearchCache(),
191
+ this.invalidateBeginCache()
192
+ ]);
193
+ }
194
+ // Generic get and set methods for arbitrary caching
195
+ async get(key) {
196
+ try {
197
+ return await keyValueStore.get(key);
198
+ }
199
+ catch (error) {
200
+ logger.error('[RedisCacheService] Failed to get from cache:', error);
201
+ return null;
202
+ }
203
+ }
204
+ async set(key, value, ttl) {
205
+ try {
206
+ await keyValueStore.set(key, value, ttl);
207
+ }
208
+ catch (error) {
209
+ logger.error('[RedisCacheService] Failed to set in cache:', error);
210
+ }
211
+ }
212
+ }
213
+ export const redisCacheService = new RedisCacheService();
214
+ //# sourceMappingURL=redis-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-cache.js","sourceRoot":"","sources":["../../src/services/redis-cache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAenE,MAAM,OAAO,iBAAiB;IACpB,WAAW,GAAG,SAAS,CAAC;IACxB,mBAAmB,GAAG,oBAAoB,CAAC;IAC3C,WAAW,GAAG,QAAQ,CAAC;IACvB,YAAY,GAAG,MAAM,CAAC;IAE9B;QACE,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACnE,CAAC;IAEO,WAAW,CAAC,KAAa,EAAE,KAAa,EAAE,IAA6B;QAC7E,MAAM,IAAI,GAAG,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QAClH,OAAO,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAa,EAAE,KAAa,EAAE,IAA6B;QAC/E,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAqB,GAAG,CAAC,CAAC;YACpE,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,CAAC,4CAA4C,KAAK,WAAW,KAAK,EAAE,CAAC,CAAC;gBAClF,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC3B,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,6CAA6C,KAAK,WAAW,KAAK,EAAE,CAAC,CAAC;YACnF,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,6DAA6D,EAAE,KAAK,CAAC,CAAC;YACnF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAa,EAAE,KAAa,EAAE,MAAoB,EAAE,IAA6B;QACrG,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACjD,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,YAAY;YAC7B,MAAM,YAAY,GAAuB;gBACvC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;oBAC/C,GAAG,EAAE,gBAAgB,MAAM,CAAC,WAAW,EAAE;oBACzC,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;iBACjC,CAAC,CAAC;aACJ,CAAC;YACF,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,uDAAuD,KAAK,WAAW,KAAK,EAAE,CAAC,CAAC;QAC/F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,2DAA2D,EAAE,KAAK,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;YACvE,iEAAiE;YACjE,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;YAC9D,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;gBACnE,6DAA6D;gBAC7D,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBACzC,OAAO;YACT,CAAC;YACD,uGAAuG;YACvG,MAAM,SAAS,GAAG,GAAG,mBAAmB,GAAG,qBAAqB,EAAE,GAAG,CAAC;YACtE,MAAM,QAAQ,GAAa,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACtC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CACxD,CAAC;YACF,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,mCAAmC,QAAQ,CAAC,MAAM,oBAAoB,CAAC,CAAC;YACpF,6BAA6B;YAC7B,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,wDAAwD,EAAE,KAAK,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,KAAK,CAAC,qBAAqB,CAAC,IAAY;QACtC,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;gBAClF,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE,CAAC;YAC1C,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC,yDAAyD,IAAI,EAAE,CAAC,CAAC;YAC9E,6BAA6B;YAC7B,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,wDAAwD,EAAE,KAAK,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAAY;QACpC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC7B,IAAI;gBACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;YACnF,MAAM,CAAC,KAAK,CAAC,qDAAqD,IAAI,OAAO,IAAI,CAAC,mBAAmB,KAAK,WAAW,wBAAwB,CAAC,CAAC;QACjJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,qDAAqD,EAAE,KAAK,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,MAAM,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,QAAQ,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,iDAAiD,EAAE,KAAK,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACvC,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,MAAM,CAAC;gBAC5C,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,QAAQ,CAAC;aAC/C,CAAC,CAAC;YACH,OAAO;gBACL,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC;gBAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC;aACpC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAC;YACtE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,KAAK,CAAC,iBAAiB,CAAC,IAAY;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAS,GAAG,CAAC,CAAC;YACxD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,CAAC,iDAAiD,IAAI,EAAE,CAAC,CAAC;gBACtE,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sDAAsD,EAAE,KAAK,CAAC,CAAC;YAC5E,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAc;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YACxD,iDAAiD;YACjD,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,uDAAuD,MAAM,CAAC,WAAW,WAAW,CAAC,CAAC;QACrG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sDAAsD,EAAE,KAAK,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,oBAAoB;QACxB,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACtE,2CAA2C;YAC3C,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBAClE,OAAO;YACT,CAAC;YACD,uGAAuG;YACvG,MAAM,SAAS,GAAG,GAAG,mBAAmB,GAAG,qBAAqB,EAAE,GAAG,CAAC;YACtE,MAAM,QAAQ,GAAa,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACtC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CACxD,CAAC;YACF,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,mCAAmC,QAAQ,CAAC,MAAM,mBAAmB,CAAC,CAAC;QACrF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,uDAAuD,EAAE,KAAK,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,oEAAoE;IACpE,KAAK,CAAC,qBAAqB;QACzB,MAAM,CAAC,IAAI,CAAC,mGAAmG,CAAC,CAAC;QACjH,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,CAAC,qBAAqB,EAAE;YAC5B,IAAI,CAAC,oBAAoB,EAAE;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC;YACH,OAAO,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,GAAY;QAChD,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Redis Service for KAIROS persistence
3
+ *
4
+ * Provides Redis-based persistence for game data and other shared state.
5
+ * Uses configurable key prefix (default: 'kb:') via KAIROS_REDIS_PREFIX env var for isolation.
6
+ * Use keyValueStore from key-value-store-factory.js unless you need Redis-specific behavior.
7
+ */
8
+ import type { IKeyValueStore } from './key-value-store.js';
9
+ export declare class RedisService implements IKeyValueStore {
10
+ private client;
11
+ private readonly prefix;
12
+ private connected;
13
+ private readonly redisUrl;
14
+ constructor();
15
+ connect(): Promise<void>;
16
+ disconnect(): Promise<void>;
17
+ /** Key is namespaced by current space (AsyncLocalStorage) so cache and proof-of-work do not collide across spaces. */
18
+ private getKey;
19
+ get(key: string): Promise<string | null>;
20
+ set(key: string, value: string, ttl?: number): Promise<void>;
21
+ del(key: string): Promise<void>;
22
+ hget(hash: string, field: string): Promise<string | null>;
23
+ hset(hash: string, field: string, value: string): Promise<void>;
24
+ hgetall(hash: string): Promise<Record<string, string> | null>;
25
+ hsetall(hash: string, data: Record<string, string>): Promise<void>;
26
+ incr(key: string): Promise<number>;
27
+ exists(key: string): Promise<boolean>;
28
+ keys(pattern: string): Promise<string[]>;
29
+ /**
30
+ * Publish a message to a Redis channel (pub/sub)
31
+ * Note: Channel names are NOT prefixed to allow cross-instance communication
32
+ * @param channel Channel name to publish to
33
+ * @param message Message to publish
34
+ * @returns Number of subscribers that received the message
35
+ */
36
+ publish(channel: string, message: string): Promise<number>;
37
+ getJson<T>(key: string): Promise<T | null>;
38
+ setJson<T>(key: string, value: T, ttl?: number): Promise<void>;
39
+ hgetJson<T>(hash: string, field: string): Promise<T | null>;
40
+ hsetJson<T>(hash: string, field: string, value: T): Promise<void>;
41
+ isConnected(): boolean;
42
+ }
43
+ //# sourceMappingURL=redis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/services/redis.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,qBAAa,YAAa,YAAW,cAAc;IAC/C,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;;IAuD5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC,sHAAsH;IACtH,OAAO,CAAC,MAAM;IAKR,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASzD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAS7D,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASlC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUrC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAS9C;;;;;;OAMG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY1D,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAW1C,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9D,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAW3D,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IASvE,WAAW,IAAI,OAAO;CAGzB"}
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Redis Service for KAIROS persistence
3
+ *
4
+ * Provides Redis-based persistence for game data and other shared state.
5
+ * Uses configurable key prefix (default: 'kb:') via KAIROS_REDIS_PREFIX env var for isolation.
6
+ * Use keyValueStore from key-value-store-factory.js unless you need Redis-specific behavior.
7
+ */
8
+ import { createClient } from 'redis';
9
+ import { logger } from '../utils/logger.js';
10
+ import { REDIS_URL, KAIROS_REDIS_PREFIX } from '../config.js';
11
+ import { getSpaceIdFromStorage } from '../utils/tenant-context.js';
12
+ export class RedisService {
13
+ client;
14
+ prefix;
15
+ connected = false;
16
+ redisUrl;
17
+ constructor() {
18
+ const redisUrl = REDIS_URL;
19
+ this.redisUrl = redisUrl;
20
+ this.prefix = KAIROS_REDIS_PREFIX;
21
+ logger.debug(`[RedisService] Initializing with REDIS_URL="${redisUrl}" and KAIROS_REDIS_PREFIX="${this.prefix}"`);
22
+ this.client = createClient({
23
+ url: redisUrl
24
+ });
25
+ this.client.on('error', (err) => {
26
+ logger.error('Redis Client Error', err);
27
+ logger.debug(`[RedisService] Error details: ${err?.message || err} | code=${(err && err.code) || 'n/a'} ` +
28
+ `errno=${(err && err.errno) || 'n/a'} address=${(err && err.address) || 'n/a'} ` +
29
+ `port=${(err && err.port) || 'n/a'} target="${this.redisUrl}"`);
30
+ // If this is an AggregateError, log each inner error for deep diagnostics
31
+ const innerErrors = err && typeof err === 'object' && 'errors' in err ? err.errors : undefined;
32
+ if (Array.isArray(innerErrors) && innerErrors.length > 0) {
33
+ innerErrors.forEach((inner, index) => {
34
+ logger.debug(`[RedisService] Inner error[${index}] code=${inner?.code || 'n/a'} ` +
35
+ `errno=${inner?.errno || 'n/a'} address=${inner?.address || 'n/a'} ` +
36
+ `port=${inner?.port || 'n/a'} message=${inner?.message || inner}`);
37
+ });
38
+ }
39
+ });
40
+ this.client.on('connect', () => {
41
+ logger.info('Connecting to Redis...');
42
+ logger.debug(`[RedisService] Attempting connection to ${redisUrl}`);
43
+ });
44
+ this.client.on('ready', () => {
45
+ logger.info('Redis client ready');
46
+ logger.debug('[RedisService] Redis client is ready and operational');
47
+ this.connected = true;
48
+ });
49
+ this.client.on('end', () => {
50
+ logger.info('Redis connection closed');
51
+ logger.debug('[RedisService] Redis connection ended');
52
+ this.connected = false;
53
+ });
54
+ }
55
+ async connect() {
56
+ if (!this.connected) {
57
+ logger.info(`[RedisService] connect() called, attempting connection to "${this.redisUrl}"`);
58
+ try {
59
+ await this.client.connect();
60
+ }
61
+ catch (error) {
62
+ logger.error(`[RedisService] connect() failed for "${this.redisUrl}"`, error);
63
+ throw error;
64
+ }
65
+ }
66
+ }
67
+ async disconnect() {
68
+ if (this.connected) {
69
+ await this.client.quit();
70
+ }
71
+ }
72
+ /** Key is namespaced by current space (AsyncLocalStorage) so cache and proof-of-work do not collide across spaces. */
73
+ getKey(key) {
74
+ const spaceId = getSpaceIdFromStorage();
75
+ return `${this.prefix}${spaceId}:${key}`;
76
+ }
77
+ async get(key) {
78
+ try {
79
+ return await this.client.get(this.getKey(key));
80
+ }
81
+ catch (error) {
82
+ logger.error(`Redis GET error for key ${key}:`, error);
83
+ return null;
84
+ }
85
+ }
86
+ async set(key, value, ttl) {
87
+ try {
88
+ if (ttl) {
89
+ await this.client.setEx(this.getKey(key), ttl, value);
90
+ }
91
+ else {
92
+ await this.client.set(this.getKey(key), value);
93
+ }
94
+ }
95
+ catch (error) {
96
+ logger.error(`Redis SET error for key ${key}:`, error);
97
+ }
98
+ }
99
+ async del(key) {
100
+ try {
101
+ await this.client.del(this.getKey(key));
102
+ }
103
+ catch (error) {
104
+ logger.error(`Redis DEL error for key ${key}:`, error);
105
+ }
106
+ }
107
+ async hget(hash, field) {
108
+ try {
109
+ return await this.client.hGet(this.getKey(hash), field);
110
+ }
111
+ catch (error) {
112
+ logger.error(`Redis HGET error for hash ${hash} field ${field}:`, error);
113
+ return null;
114
+ }
115
+ }
116
+ async hset(hash, field, value) {
117
+ try {
118
+ await this.client.hSet(this.getKey(hash), field, value);
119
+ }
120
+ catch (error) {
121
+ logger.error(`Redis HSET error for hash ${hash} field ${field}:`, error);
122
+ }
123
+ }
124
+ async hgetall(hash) {
125
+ try {
126
+ return await this.client.hGetAll(this.getKey(hash));
127
+ }
128
+ catch (error) {
129
+ logger.error(`Redis HGETALL error for hash ${hash}:`, error);
130
+ return null;
131
+ }
132
+ }
133
+ async hsetall(hash, data) {
134
+ try {
135
+ await this.client.hSet(this.getKey(hash), data);
136
+ }
137
+ catch (error) {
138
+ logger.error(`Redis HSETALL error for hash ${hash}:`, error);
139
+ }
140
+ }
141
+ async incr(key) {
142
+ try {
143
+ return await this.client.incr(this.getKey(key));
144
+ }
145
+ catch (error) {
146
+ logger.error(`Redis INCR error for key ${key}:`, error);
147
+ return 0;
148
+ }
149
+ }
150
+ async exists(key) {
151
+ try {
152
+ const result = await this.client.exists(this.getKey(key));
153
+ return result === 1;
154
+ }
155
+ catch (error) {
156
+ logger.error(`Redis EXISTS error for key ${key}:`, error);
157
+ return false;
158
+ }
159
+ }
160
+ async keys(pattern) {
161
+ try {
162
+ return await this.client.keys(this.getKey(pattern));
163
+ }
164
+ catch (error) {
165
+ logger.error(`Redis KEYS error for pattern ${pattern}:`, error);
166
+ return [];
167
+ }
168
+ }
169
+ /**
170
+ * Publish a message to a Redis channel (pub/sub)
171
+ * Note: Channel names are NOT prefixed to allow cross-instance communication
172
+ * @param channel Channel name to publish to
173
+ * @param message Message to publish
174
+ * @returns Number of subscribers that received the message
175
+ */
176
+ async publish(channel, message) {
177
+ try {
178
+ const result = await this.client.publish(channel, message);
179
+ logger.debug(`[RedisService] Published message to channel "${channel}", ${result} subscribers notified`);
180
+ return result;
181
+ }
182
+ catch (error) {
183
+ logger.error(`Redis PUBLISH error for channel ${channel}:`, error);
184
+ return 0;
185
+ }
186
+ }
187
+ // Utility methods for JSON objects
188
+ async getJson(key) {
189
+ const value = await this.get(key);
190
+ if (!value)
191
+ return null;
192
+ try {
193
+ return JSON.parse(value);
194
+ }
195
+ catch (error) {
196
+ logger.error(`JSON parse error for key ${key}:`, error);
197
+ return null;
198
+ }
199
+ }
200
+ async setJson(key, value, ttl) {
201
+ try {
202
+ const jsonValue = JSON.stringify(value);
203
+ await this.set(key, jsonValue, ttl);
204
+ }
205
+ catch (error) {
206
+ logger.error(`JSON stringify error for key ${key}:`, error);
207
+ }
208
+ }
209
+ async hgetJson(hash, field) {
210
+ const value = await this.hget(hash, field);
211
+ if (!value)
212
+ return null;
213
+ try {
214
+ return JSON.parse(value);
215
+ }
216
+ catch (error) {
217
+ logger.error(`JSON parse error for hash ${hash} field ${field}:`, error);
218
+ return null;
219
+ }
220
+ }
221
+ async hsetJson(hash, field, value) {
222
+ try {
223
+ const jsonValue = JSON.stringify(value);
224
+ await this.hset(hash, field, jsonValue);
225
+ }
226
+ catch (error) {
227
+ logger.error(`JSON stringify error for hash ${hash} field ${field}:`, error);
228
+ }
229
+ }
230
+ isConnected() {
231
+ return this.connected;
232
+ }
233
+ }
234
+ //# sourceMappingURL=redis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/services/redis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Implementation bonus core algorithms (statistical adjustments, rarity/comparative)
3
+ * These functions are pure/near-pure and operate on supplied data structures so the
4
+ * orchestrator can handle persistence and state mutation.
5
+ */
6
+ import type { ModelImplementationData } from '../../types/index.js';
7
+ export declare function calculateWilsonAdjustment(modelData: ModelImplementationData): number;
8
+ /**
9
+ * Compute implementation bonus given a qualityMetrics object.
10
+ *
11
+ * This function mutates qualityMetrics to record attempts/successes for the specific model.
12
+ * It returns an object describing the awarded bonus and whether a "rare success" occurred.
13
+ *
14
+ * Parameters:
15
+ * - qualityMetrics: the QualityMetrics object from memory payload (may be created by caller)
16
+ * - llm_model_id: model identifier
17
+ * - outcome: 'success' | 'partial' | 'failure'
18
+ *
19
+ * Returns:
20
+ * { finalBonus, comparativeBonus, rarityMultiplier, rareSuccess }
21
+ */
22
+ export declare function computeImplementationBonus(qualityMetrics: any, llm_model_id: string, outcome: 'success' | 'partial' | 'failure'): {
23
+ finalBonus: number;
24
+ comparativeBonus: number;
25
+ rarityMultiplier: number;
26
+ rareSuccess: boolean;
27
+ };
28
+ //# sourceMappingURL=bonuses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bonuses.d.ts","sourceRoot":"","sources":["../../../src/services/stats/bonuses.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpE,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,uBAAuB,GAAG,MAAM,CAWpF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACtC,cAAc,EAAE,GAAG,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAC3C;IACC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;CACxB,CA0EA"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Implementation bonus core algorithms (statistical adjustments, rarity/comparative)
3
+ * These functions are pure/near-pure and operate on supplied data structures so the
4
+ * orchestrator can handle persistence and state mutation.
5
+ */
6
+ export function calculateWilsonAdjustment(modelData) {
7
+ const { successes, attempts } = modelData;
8
+ if (attempts === 0)
9
+ return 0.5;
10
+ const z = 1.96;
11
+ const p = successes / attempts;
12
+ const n = attempts;
13
+ const denominator = 1 + z * z / n;
14
+ const numerator = p + z * z / (2 * n);
15
+ const adjustment = z * Math.sqrt(p * (1 - p) / n + z * z / (4 * n * n));
16
+ const lowerBound = Math.max(0, (numerator - adjustment) / denominator);
17
+ return 0.5 + (lowerBound * 1.0);
18
+ }
19
+ /**
20
+ * Compute implementation bonus given a qualityMetrics object.
21
+ *
22
+ * This function mutates qualityMetrics to record attempts/successes for the specific model.
23
+ * It returns an object describing the awarded bonus and whether a "rare success" occurred.
24
+ *
25
+ * Parameters:
26
+ * - qualityMetrics: the QualityMetrics object from memory payload (may be created by caller)
27
+ * - llm_model_id: model identifier
28
+ * - outcome: 'success' | 'partial' | 'failure'
29
+ *
30
+ * Returns:
31
+ * { finalBonus, comparativeBonus, rarityMultiplier, rareSuccess }
32
+ */
33
+ export function computeImplementationBonus(qualityMetrics, llm_model_id, outcome) {
34
+ if (!qualityMetrics.implementation_stats) {
35
+ qualityMetrics.implementation_stats = {
36
+ total_attempts: 0,
37
+ success_attempts: 0,
38
+ model_success_rates: {},
39
+ confidence_level: 0,
40
+ last_implementation_attempt: null
41
+ };
42
+ }
43
+ const stats = qualityMetrics.implementation_stats;
44
+ if (!stats.model_success_rates[llm_model_id]) {
45
+ stats.model_success_rates[llm_model_id] = {
46
+ attempts: 0,
47
+ successes: 0,
48
+ success_rate: 0,
49
+ wilson_lower: 0,
50
+ wilson_upper: 0,
51
+ last_attempt: null
52
+ };
53
+ }
54
+ const modelData = stats.model_success_rates[llm_model_id];
55
+ // Update attempts
56
+ stats.total_attempts = (stats.total_attempts || 0) + 1;
57
+ modelData.attempts = (modelData.attempts || 0) + 1;
58
+ // Determine base bonus
59
+ let bonus = 0;
60
+ if (outcome === 'success') {
61
+ bonus = 5;
62
+ stats.success_attempts = (stats.success_attempts || 0) + 1;
63
+ modelData.successes = (modelData.successes || 0) + 1;
64
+ }
65
+ else if (outcome === 'partial') {
66
+ bonus = 2;
67
+ }
68
+ else {
69
+ // failure: record and return 0
70
+ modelData.success_rate = modelData.attempts > 0 ? (modelData.successes || 0) / modelData.attempts : 0;
71
+ return { finalBonus: 0, comparativeBonus: 0, rarityMultiplier: 1, rareSuccess: false };
72
+ }
73
+ modelData.success_rate = modelData.attempts > 0 ? (modelData.successes || 0) / modelData.attempts : 0;
74
+ const overallSuccessRate = stats.total_attempts > 0 ? (stats.success_attempts || 0) / stats.total_attempts : 0;
75
+ const rarityMultiplier = Math.max(1, 1 / Math.max(0.1, overallSuccessRate));
76
+ // Comparative bonus when model outperforms others
77
+ let comparativeBonus = 0;
78
+ const otherModels = Object.entries(stats.model_success_rates).filter(([modelId]) => modelId !== llm_model_id);
79
+ if (otherModels.length > 0) {
80
+ const otherSuccessRates = otherModels.map(([, data]) => data.attempts > 0 ? (data.successes || 0) / data.attempts : 0);
81
+ const avgOtherSuccessRate = otherSuccessRates.reduce((s, r) => s + r, 0) / otherSuccessRates.length;
82
+ if (avgOtherSuccessRate < 0.5 && modelData.success_rate > avgOtherSuccessRate) {
83
+ comparativeBonus = Math.min(10, (modelData.success_rate - avgOtherSuccessRate) * 20);
84
+ bonus += comparativeBonus;
85
+ }
86
+ }
87
+ // Wilson adjustment
88
+ const wilsonAdj = calculateWilsonAdjustment(modelData);
89
+ bonus *= wilsonAdj;
90
+ // Apply rarity multiplier (capped at 3x)
91
+ bonus *= Math.min(3, rarityMultiplier);
92
+ const finalBonus = Math.min(25, Math.round(bonus));
93
+ const rareSuccess = comparativeBonus > 0 && outcome === 'success';
94
+ return { finalBonus, comparativeBonus, rarityMultiplier, rareSuccess };
95
+ }
96
+ //# sourceMappingURL=bonuses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bonuses.js","sourceRoot":"","sources":["../../../src/services/stats/bonuses.ts"],"names":[],"mappings":"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"}