@sprinterai/runtime 0.2.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 (266) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapters/a2a-adapter.d.ts +24 -0
  3. package/dist/adapters/a2a-adapter.d.ts.map +1 -0
  4. package/dist/adapters/a2a-adapter.js +13 -0
  5. package/dist/adapters/a2a-adapter.js.map +1 -0
  6. package/dist/adapters/http-agent-adapter.d.ts +22 -0
  7. package/dist/adapters/http-agent-adapter.d.ts.map +1 -0
  8. package/dist/adapters/http-agent-adapter.js +13 -0
  9. package/dist/adapters/http-agent-adapter.js.map +1 -0
  10. package/dist/adapters/index.d.ts +9 -0
  11. package/dist/adapters/index.d.ts.map +1 -0
  12. package/dist/adapters/index.js +5 -0
  13. package/dist/adapters/index.js.map +1 -0
  14. package/dist/adapters/mcp-adapter.d.ts +19 -0
  15. package/dist/adapters/mcp-adapter.d.ts.map +1 -0
  16. package/dist/adapters/mcp-adapter.js +13 -0
  17. package/dist/adapters/mcp-adapter.js.map +1 -0
  18. package/dist/adapters/openclaw-adapter.d.ts +20 -0
  19. package/dist/adapters/openclaw-adapter.d.ts.map +1 -0
  20. package/dist/adapters/openclaw-adapter.js +13 -0
  21. package/dist/adapters/openclaw-adapter.js.map +1 -0
  22. package/dist/agent/agent-registry.d.ts +25 -0
  23. package/dist/agent/agent-registry.d.ts.map +1 -0
  24. package/dist/agent/agent-registry.js +42 -0
  25. package/dist/agent/agent-registry.js.map +1 -0
  26. package/dist/agent/agent-registry.test.d.ts +2 -0
  27. package/dist/agent/agent-registry.test.d.ts.map +1 -0
  28. package/dist/agent/agent-registry.test.js +55 -0
  29. package/dist/agent/agent-registry.test.js.map +1 -0
  30. package/dist/agent/agent-resolver.d.ts +41 -0
  31. package/dist/agent/agent-resolver.d.ts.map +1 -0
  32. package/dist/agent/agent-resolver.js +76 -0
  33. package/dist/agent/agent-resolver.js.map +1 -0
  34. package/dist/agent/agent-resolver.test.d.ts +2 -0
  35. package/dist/agent/agent-resolver.test.d.ts.map +1 -0
  36. package/dist/agent/agent-resolver.test.js +116 -0
  37. package/dist/agent/agent-resolver.test.js.map +1 -0
  38. package/dist/agent/delegate.d.ts +14 -0
  39. package/dist/agent/delegate.d.ts.map +1 -0
  40. package/dist/agent/delegate.js +35 -0
  41. package/dist/agent/delegate.js.map +1 -0
  42. package/dist/agent/delegate.test.d.ts +2 -0
  43. package/dist/agent/delegate.test.d.ts.map +1 -0
  44. package/dist/agent/delegate.test.js +64 -0
  45. package/dist/agent/delegate.test.js.map +1 -0
  46. package/dist/agent/execute-agent.d.ts +43 -0
  47. package/dist/agent/execute-agent.d.ts.map +1 -0
  48. package/dist/agent/execute-agent.js +43 -0
  49. package/dist/agent/execute-agent.js.map +1 -0
  50. package/dist/agent/index.d.ts +10 -0
  51. package/dist/agent/index.d.ts.map +1 -0
  52. package/dist/agent/index.js +6 -0
  53. package/dist/agent/index.js.map +1 -0
  54. package/dist/agent/prompt-builder.d.ts +16 -0
  55. package/dist/agent/prompt-builder.d.ts.map +1 -0
  56. package/dist/agent/prompt-builder.js +17 -0
  57. package/dist/agent/prompt-builder.js.map +1 -0
  58. package/dist/agent/prompt-builder.test.d.ts +2 -0
  59. package/dist/agent/prompt-builder.test.d.ts.map +1 -0
  60. package/dist/agent/prompt-builder.test.js +60 -0
  61. package/dist/agent/prompt-builder.test.js.map +1 -0
  62. package/dist/chat/chat-handler.d.ts +63 -0
  63. package/dist/chat/chat-handler.d.ts.map +1 -0
  64. package/dist/chat/chat-handler.js +74 -0
  65. package/dist/chat/chat-handler.js.map +1 -0
  66. package/dist/chat/chat-handler.test.d.ts +2 -0
  67. package/dist/chat/chat-handler.test.d.ts.map +1 -0
  68. package/dist/chat/chat-handler.test.js +112 -0
  69. package/dist/chat/chat-handler.test.js.map +1 -0
  70. package/dist/chat/index.d.ts +4 -0
  71. package/dist/chat/index.d.ts.map +1 -0
  72. package/dist/chat/index.js +3 -0
  73. package/dist/chat/index.js.map +1 -0
  74. package/dist/chat/message-utils.d.ts +26 -0
  75. package/dist/chat/message-utils.d.ts.map +1 -0
  76. package/dist/chat/message-utils.js +65 -0
  77. package/dist/chat/message-utils.js.map +1 -0
  78. package/dist/chat/message-utils.test.d.ts +2 -0
  79. package/dist/chat/message-utils.test.d.ts.map +1 -0
  80. package/dist/chat/message-utils.test.js +85 -0
  81. package/dist/chat/message-utils.test.js.map +1 -0
  82. package/dist/eval/eval-runner.d.ts +22 -0
  83. package/dist/eval/eval-runner.d.ts.map +1 -0
  84. package/dist/eval/eval-runner.js +56 -0
  85. package/dist/eval/eval-runner.js.map +1 -0
  86. package/dist/eval/eval-runner.test.d.ts +2 -0
  87. package/dist/eval/eval-runner.test.d.ts.map +1 -0
  88. package/dist/eval/eval-runner.test.js +89 -0
  89. package/dist/eval/eval-runner.test.js.map +1 -0
  90. package/dist/eval/index.d.ts +4 -0
  91. package/dist/eval/index.d.ts.map +1 -0
  92. package/dist/eval/index.js +3 -0
  93. package/dist/eval/index.js.map +1 -0
  94. package/dist/eval/scorers.d.ts +26 -0
  95. package/dist/eval/scorers.d.ts.map +1 -0
  96. package/dist/eval/scorers.js +76 -0
  97. package/dist/eval/scorers.js.map +1 -0
  98. package/dist/eval/scorers.test.d.ts +2 -0
  99. package/dist/eval/scorers.test.d.ts.map +1 -0
  100. package/dist/eval/scorers.test.js +91 -0
  101. package/dist/eval/scorers.test.js.map +1 -0
  102. package/dist/guardrail/guardrail-pipeline.d.ts +37 -0
  103. package/dist/guardrail/guardrail-pipeline.d.ts.map +1 -0
  104. package/dist/guardrail/guardrail-pipeline.js +63 -0
  105. package/dist/guardrail/guardrail-pipeline.js.map +1 -0
  106. package/dist/guardrail/guardrail-pipeline.test.d.ts +2 -0
  107. package/dist/guardrail/guardrail-pipeline.test.d.ts.map +1 -0
  108. package/dist/guardrail/guardrail-pipeline.test.js +74 -0
  109. package/dist/guardrail/guardrail-pipeline.test.js.map +1 -0
  110. package/dist/guardrail/index.d.ts +3 -0
  111. package/dist/guardrail/index.d.ts.map +1 -0
  112. package/dist/guardrail/index.js +2 -0
  113. package/dist/guardrail/index.js.map +1 -0
  114. package/dist/index.d.ts +46 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +39 -0
  117. package/dist/index.js.map +1 -0
  118. package/dist/memory/index.d.ts +4 -0
  119. package/dist/memory/index.d.ts.map +1 -0
  120. package/dist/memory/index.js +3 -0
  121. package/dist/memory/index.js.map +1 -0
  122. package/dist/memory/memory-manager.d.ts +28 -0
  123. package/dist/memory/memory-manager.d.ts.map +1 -0
  124. package/dist/memory/memory-manager.js +34 -0
  125. package/dist/memory/memory-manager.js.map +1 -0
  126. package/dist/memory/memory-prompt.d.ts +10 -0
  127. package/dist/memory/memory-prompt.d.ts.map +1 -0
  128. package/dist/memory/memory-prompt.js +29 -0
  129. package/dist/memory/memory-prompt.js.map +1 -0
  130. package/dist/module/create-runtime.d.ts +65 -0
  131. package/dist/module/create-runtime.d.ts.map +1 -0
  132. package/dist/module/create-runtime.js +75 -0
  133. package/dist/module/create-runtime.js.map +1 -0
  134. package/dist/module/create-runtime.test.d.ts +2 -0
  135. package/dist/module/create-runtime.test.d.ts.map +1 -0
  136. package/dist/module/create-runtime.test.js +144 -0
  137. package/dist/module/create-runtime.test.js.map +1 -0
  138. package/dist/module/index.d.ts +5 -0
  139. package/dist/module/index.d.ts.map +1 -0
  140. package/dist/module/index.js +3 -0
  141. package/dist/module/index.js.map +1 -0
  142. package/dist/module/module-loader.d.ts +32 -0
  143. package/dist/module/module-loader.d.ts.map +1 -0
  144. package/dist/module/module-loader.js +123 -0
  145. package/dist/module/module-loader.js.map +1 -0
  146. package/dist/module/module-loader.test.d.ts +2 -0
  147. package/dist/module/module-loader.test.d.ts.map +1 -0
  148. package/dist/module/module-loader.test.js +96 -0
  149. package/dist/module/module-loader.test.js.map +1 -0
  150. package/dist/scoring/compute-score.d.ts +32 -0
  151. package/dist/scoring/compute-score.d.ts.map +1 -0
  152. package/dist/scoring/compute-score.js +54 -0
  153. package/dist/scoring/compute-score.js.map +1 -0
  154. package/dist/scoring/compute-score.test.d.ts +2 -0
  155. package/dist/scoring/compute-score.test.d.ts.map +1 -0
  156. package/dist/scoring/compute-score.test.js +99 -0
  157. package/dist/scoring/compute-score.test.js.map +1 -0
  158. package/dist/scoring/index.d.ts +3 -0
  159. package/dist/scoring/index.d.ts.map +1 -0
  160. package/dist/scoring/index.js +2 -0
  161. package/dist/scoring/index.js.map +1 -0
  162. package/dist/testing/in-memory-agent-store.d.ts +16 -0
  163. package/dist/testing/in-memory-agent-store.d.ts.map +1 -0
  164. package/dist/testing/in-memory-agent-store.js +37 -0
  165. package/dist/testing/in-memory-agent-store.js.map +1 -0
  166. package/dist/testing/in-memory-agent-store.test.d.ts +2 -0
  167. package/dist/testing/in-memory-agent-store.test.d.ts.map +1 -0
  168. package/dist/testing/in-memory-agent-store.test.js +111 -0
  169. package/dist/testing/in-memory-agent-store.test.js.map +1 -0
  170. package/dist/testing/in-memory-chat-store.d.ts +28 -0
  171. package/dist/testing/in-memory-chat-store.d.ts.map +1 -0
  172. package/dist/testing/in-memory-chat-store.js +87 -0
  173. package/dist/testing/in-memory-chat-store.js.map +1 -0
  174. package/dist/testing/in-memory-entity-store.d.ts +34 -0
  175. package/dist/testing/in-memory-entity-store.d.ts.map +1 -0
  176. package/dist/testing/in-memory-entity-store.js +134 -0
  177. package/dist/testing/in-memory-entity-store.js.map +1 -0
  178. package/dist/testing/in-memory-entity-store.test.d.ts +2 -0
  179. package/dist/testing/in-memory-entity-store.test.d.ts.map +1 -0
  180. package/dist/testing/in-memory-entity-store.test.js +341 -0
  181. package/dist/testing/in-memory-entity-store.test.js.map +1 -0
  182. package/dist/testing/in-memory-memory-store.d.ts +25 -0
  183. package/dist/testing/in-memory-memory-store.d.ts.map +1 -0
  184. package/dist/testing/in-memory-memory-store.js +59 -0
  185. package/dist/testing/in-memory-memory-store.js.map +1 -0
  186. package/dist/testing/in-memory-task-store.d.ts +20 -0
  187. package/dist/testing/in-memory-task-store.d.ts.map +1 -0
  188. package/dist/testing/in-memory-task-store.js +59 -0
  189. package/dist/testing/in-memory-task-store.js.map +1 -0
  190. package/dist/testing/in-memory-tenant-store.d.ts +16 -0
  191. package/dist/testing/in-memory-tenant-store.d.ts.map +1 -0
  192. package/dist/testing/in-memory-tenant-store.js +46 -0
  193. package/dist/testing/in-memory-tenant-store.js.map +1 -0
  194. package/dist/testing/in-memory-tool-store.d.ts +17 -0
  195. package/dist/testing/in-memory-tool-store.d.ts.map +1 -0
  196. package/dist/testing/in-memory-tool-store.js +39 -0
  197. package/dist/testing/in-memory-tool-store.js.map +1 -0
  198. package/dist/testing/index.d.ts +8 -0
  199. package/dist/testing/index.d.ts.map +1 -0
  200. package/dist/testing/index.js +8 -0
  201. package/dist/testing/index.js.map +1 -0
  202. package/dist/tool/ai-bridge.d.ts +13 -0
  203. package/dist/tool/ai-bridge.d.ts.map +1 -0
  204. package/dist/tool/ai-bridge.js +27 -0
  205. package/dist/tool/ai-bridge.js.map +1 -0
  206. package/dist/tool/ai-bridge.test.d.ts +2 -0
  207. package/dist/tool/ai-bridge.test.d.ts.map +1 -0
  208. package/dist/tool/ai-bridge.test.js +40 -0
  209. package/dist/tool/ai-bridge.test.js.map +1 -0
  210. package/dist/tool/entity-tools-factory.d.ts +7 -0
  211. package/dist/tool/entity-tools-factory.d.ts.map +1 -0
  212. package/dist/tool/entity-tools-factory.js +160 -0
  213. package/dist/tool/entity-tools-factory.js.map +1 -0
  214. package/dist/tool/entity-tools-factory.test.d.ts +2 -0
  215. package/dist/tool/entity-tools-factory.test.d.ts.map +1 -0
  216. package/dist/tool/entity-tools-factory.test.js +160 -0
  217. package/dist/tool/entity-tools-factory.test.js.map +1 -0
  218. package/dist/tool/index.d.ts +8 -0
  219. package/dist/tool/index.d.ts.map +1 -0
  220. package/dist/tool/index.js +6 -0
  221. package/dist/tool/index.js.map +1 -0
  222. package/dist/tool/resolve-tools.d.ts +28 -0
  223. package/dist/tool/resolve-tools.d.ts.map +1 -0
  224. package/dist/tool/resolve-tools.js +54 -0
  225. package/dist/tool/resolve-tools.js.map +1 -0
  226. package/dist/tool/resolve-tools.test.d.ts +2 -0
  227. package/dist/tool/resolve-tools.test.d.ts.map +1 -0
  228. package/dist/tool/resolve-tools.test.js +111 -0
  229. package/dist/tool/resolve-tools.test.js.map +1 -0
  230. package/dist/tool/tool-executor.d.ts +30 -0
  231. package/dist/tool/tool-executor.d.ts.map +1 -0
  232. package/dist/tool/tool-executor.js +64 -0
  233. package/dist/tool/tool-executor.js.map +1 -0
  234. package/dist/tool/tool-executor.test.d.ts +2 -0
  235. package/dist/tool/tool-executor.test.d.ts.map +1 -0
  236. package/dist/tool/tool-executor.test.js +105 -0
  237. package/dist/tool/tool-executor.test.js.map +1 -0
  238. package/dist/tool/tool-registry.d.ts +29 -0
  239. package/dist/tool/tool-registry.d.ts.map +1 -0
  240. package/dist/tool/tool-registry.js +59 -0
  241. package/dist/tool/tool-registry.js.map +1 -0
  242. package/dist/tool/tool-registry.test.d.ts +2 -0
  243. package/dist/tool/tool-registry.test.d.ts.map +1 -0
  244. package/dist/tool/tool-registry.test.js +76 -0
  245. package/dist/tool/tool-registry.test.js.map +1 -0
  246. package/dist/workflow/compile.d.ts +17 -0
  247. package/dist/workflow/compile.d.ts.map +1 -0
  248. package/dist/workflow/compile.js +83 -0
  249. package/dist/workflow/compile.js.map +1 -0
  250. package/dist/workflow/compile.test.d.ts +2 -0
  251. package/dist/workflow/compile.test.d.ts.map +1 -0
  252. package/dist/workflow/compile.test.js +154 -0
  253. package/dist/workflow/compile.test.js.map +1 -0
  254. package/dist/workflow/index.d.ts +4 -0
  255. package/dist/workflow/index.d.ts.map +1 -0
  256. package/dist/workflow/index.js +3 -0
  257. package/dist/workflow/index.js.map +1 -0
  258. package/dist/workflow/status.d.ts +21 -0
  259. package/dist/workflow/status.d.ts.map +1 -0
  260. package/dist/workflow/status.js +55 -0
  261. package/dist/workflow/status.js.map +1 -0
  262. package/dist/workflow/status.test.d.ts +2 -0
  263. package/dist/workflow/status.test.d.ts.map +1 -0
  264. package/dist/workflow/status.test.js +176 -0
  265. package/dist/workflow/status.test.js.map +1 -0
  266. package/package.json +100 -0
@@ -0,0 +1,32 @@
1
+ export { computeResponseScore } from "@sprinterai/core";
2
+ /**
3
+ * Compute the mean of an array of numbers.
4
+ * Returns null if the array is empty.
5
+ */
6
+ export declare function mean(values: number[]): number | null;
7
+ /**
8
+ * Compute the median of an array of numbers.
9
+ * Returns null if the array is empty.
10
+ */
11
+ export declare function median(values: number[]): number | null;
12
+ /**
13
+ * Compute min of an array. Returns null if empty.
14
+ */
15
+ export declare function min(values: number[]): number | null;
16
+ /**
17
+ * Compute max of an array. Returns null if empty.
18
+ */
19
+ export declare function max(values: number[]): number | null;
20
+ /** Aggregation result for a set of scores. */
21
+ export interface ScoreAggregation {
22
+ count: number;
23
+ mean: number | null;
24
+ median: number | null;
25
+ min: number | null;
26
+ max: number | null;
27
+ }
28
+ /**
29
+ * Compute full aggregation of an array of scores.
30
+ */
31
+ export declare function aggregateScores(scores: number[]): ScoreAggregation;
32
+ //# sourceMappingURL=compute-score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-score.d.ts","sourceRoot":"","sources":["../../src/scoring/compute-score.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;GAGG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAGpD;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAQtD;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAGnD;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAGnD;AAED,8CAA8C;AAC9C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAQlE"}
@@ -0,0 +1,54 @@
1
+ // Re-export the core scoring function
2
+ export { computeResponseScore } from "@sprinterai/core";
3
+ /**
4
+ * Compute the mean of an array of numbers.
5
+ * Returns null if the array is empty.
6
+ */
7
+ export function mean(values) {
8
+ if (values.length === 0)
9
+ return null;
10
+ return values.reduce((sum, v) => sum + v, 0) / values.length;
11
+ }
12
+ /**
13
+ * Compute the median of an array of numbers.
14
+ * Returns null if the array is empty.
15
+ */
16
+ export function median(values) {
17
+ if (values.length === 0)
18
+ return null;
19
+ const sorted = [...values].sort((a, b) => a - b);
20
+ const mid = Math.floor(sorted.length / 2);
21
+ if (sorted.length % 2 === 0) {
22
+ return (sorted[mid - 1] + sorted[mid]) / 2;
23
+ }
24
+ return sorted[mid];
25
+ }
26
+ /**
27
+ * Compute min of an array. Returns null if empty.
28
+ */
29
+ export function min(values) {
30
+ if (values.length === 0)
31
+ return null;
32
+ return Math.min(...values);
33
+ }
34
+ /**
35
+ * Compute max of an array. Returns null if empty.
36
+ */
37
+ export function max(values) {
38
+ if (values.length === 0)
39
+ return null;
40
+ return Math.max(...values);
41
+ }
42
+ /**
43
+ * Compute full aggregation of an array of scores.
44
+ */
45
+ export function aggregateScores(scores) {
46
+ return {
47
+ count: scores.length,
48
+ mean: mean(scores),
49
+ median: median(scores),
50
+ min: min(scores),
51
+ max: max(scores),
52
+ };
53
+ }
54
+ //# sourceMappingURL=compute-score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-score.js","sourceRoot":"","sources":["../../src/scoring/compute-score.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,MAAgB;IACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,MAAgB;IACrC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAC,MAAgB;IAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAC,MAAgB;IAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;AAC7B,CAAC;AAWD;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAgB;IAC9C,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC;QAChB,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC;KACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compute-score.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-score.test.d.ts","sourceRoot":"","sources":["../../src/scoring/compute-score.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,99 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { mean, median, min, max, aggregateScores, computeResponseScore } from './compute-score';
3
+ describe('aggregation helpers', () => {
4
+ describe('mean', () => {
5
+ it('returns null for empty array', () => {
6
+ expect(mean([])).toBeNull();
7
+ });
8
+ it('computes mean of values', () => {
9
+ expect(mean([10, 20, 30])).toBe(20);
10
+ });
11
+ it('handles single value', () => {
12
+ expect(mean([5])).toBe(5);
13
+ });
14
+ });
15
+ describe('median', () => {
16
+ it('returns null for empty array', () => {
17
+ expect(median([])).toBeNull();
18
+ });
19
+ it('returns middle for odd-length array', () => {
20
+ expect(median([1, 3, 5])).toBe(3);
21
+ });
22
+ it('returns average of middle two for even-length array', () => {
23
+ expect(median([1, 2, 3, 4])).toBe(2.5);
24
+ });
25
+ it('handles unsorted input', () => {
26
+ expect(median([5, 1, 3])).toBe(3);
27
+ });
28
+ });
29
+ describe('min', () => {
30
+ it('returns null for empty array', () => {
31
+ expect(min([])).toBeNull();
32
+ });
33
+ it('returns minimum value', () => {
34
+ expect(min([5, 2, 8, 1])).toBe(1);
35
+ });
36
+ });
37
+ describe('max', () => {
38
+ it('returns null for empty array', () => {
39
+ expect(max([])).toBeNull();
40
+ });
41
+ it('returns maximum value', () => {
42
+ expect(max([5, 2, 8, 1])).toBe(8);
43
+ });
44
+ });
45
+ describe('aggregateScores', () => {
46
+ it('returns complete aggregation', () => {
47
+ const result = aggregateScores([10, 20, 30, 40]);
48
+ expect(result).toEqual({
49
+ count: 4,
50
+ mean: 25,
51
+ median: 25,
52
+ min: 10,
53
+ max: 40,
54
+ });
55
+ });
56
+ it('handles empty array', () => {
57
+ const result = aggregateScores([]);
58
+ expect(result).toEqual({
59
+ count: 0,
60
+ mean: null,
61
+ median: null,
62
+ min: null,
63
+ max: null,
64
+ });
65
+ });
66
+ });
67
+ });
68
+ describe('computeResponseScore (re-exported)', () => {
69
+ it('computes weighted and normalized scores', () => {
70
+ const result = computeResponseScore({ quality: 8, relevance: 6 }, [
71
+ {
72
+ key: 'quality',
73
+ label: 'Quality',
74
+ type: 'rating',
75
+ scale: [0, 10],
76
+ weight: 2,
77
+ },
78
+ {
79
+ key: 'relevance',
80
+ label: 'Relevance',
81
+ type: 'rating',
82
+ scale: [0, 10],
83
+ weight: 1,
84
+ },
85
+ ]);
86
+ // weighted = (8*2 + 6*1) / (2+1) = 22/3 ~ 7.33
87
+ expect(result.weighted).toBeCloseTo(7.333, 2);
88
+ // normalized = (80*2 + 60*1) / 3 = 220/3 ~ 73.33
89
+ expect(result.normalized).toBeCloseTo(73.333, 2);
90
+ });
91
+ it('returns nulls for no qualifying dimensions', () => {
92
+ const result = computeResponseScore({ text: 'hello' }, [
93
+ { key: 'text', label: 'Text', type: 'text' },
94
+ ]);
95
+ expect(result.weighted).toBeNull();
96
+ expect(result.normalized).toBeNull();
97
+ });
98
+ });
99
+ //# sourceMappingURL=compute-score.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-score.test.js","sourceRoot":"","sources":["../../src/scoring/compute-score.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { computeResponseScore, mean, median, min, max, aggregateScores, } from "./compute-score";
2
+ export type { ScoreAggregation } from "./compute-score";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scoring/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,IAAI,EACJ,MAAM,EACN,GAAG,EACH,GAAG,EACH,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { computeResponseScore, mean, median, min, max, aggregateScores, } from "./compute-score";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scoring/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,IAAI,EACJ,MAAM,EACN,GAAG,EACH,GAAG,EACH,eAAe,GAChB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { AgentStore, AgentRecord } from "@sprinterai/core";
2
+ /** In-memory AgentStore for testing. */
3
+ export declare class InMemoryAgentStore implements AgentStore {
4
+ private agents;
5
+ /** Seed an agent for test setup. */
6
+ seedAgent(agent: AgentRecord): void;
7
+ getAgentById(id: string): Promise<AgentRecord | null>;
8
+ getAgentBySlug(slug: string): Promise<AgentRecord | null>;
9
+ getFirstEnabledAgent(): Promise<AgentRecord | null>;
10
+ listAgents(options?: {
11
+ enabledOnly?: boolean;
12
+ }): Promise<AgentRecord[]>;
13
+ /** Test helper: clear all data. */
14
+ clear(): void;
15
+ }
16
+ //# sourceMappingURL=in-memory-agent-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-agent-store.d.ts","sourceRoot":"","sources":["../../src/testing/in-memory-agent-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEhE,wCAAwC;AACxC,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,MAAM,CAAkC;IAEhD,oCAAoC;IACpC,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAI7B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAIrD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAOzD,oBAAoB,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAOnD,UAAU,CAAC,OAAO,CAAC,EAAE;QACzB,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAQ1B,mCAAmC;IACnC,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,37 @@
1
+ /** In-memory AgentStore for testing. */
2
+ export class InMemoryAgentStore {
3
+ agents = new Map();
4
+ /** Seed an agent for test setup. */
5
+ seedAgent(agent) {
6
+ this.agents.set(agent.id, agent);
7
+ }
8
+ async getAgentById(id) {
9
+ return this.agents.get(id) ?? null;
10
+ }
11
+ async getAgentBySlug(slug) {
12
+ for (const agent of this.agents.values()) {
13
+ if (agent.slug === slug)
14
+ return agent;
15
+ }
16
+ return null;
17
+ }
18
+ async getFirstEnabledAgent() {
19
+ for (const agent of this.agents.values()) {
20
+ if (agent.is_enabled)
21
+ return agent;
22
+ }
23
+ return null;
24
+ }
25
+ async listAgents(options) {
26
+ const all = Array.from(this.agents.values());
27
+ if (options?.enabledOnly) {
28
+ return all.filter((a) => a.is_enabled);
29
+ }
30
+ return all;
31
+ }
32
+ /** Test helper: clear all data. */
33
+ clear() {
34
+ this.agents.clear();
35
+ }
36
+ }
37
+ //# sourceMappingURL=in-memory-agent-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-agent-store.js","sourceRoot":"","sources":["../../src/testing/in-memory-agent-store.ts"],"names":[],"mappings":"AAEA,wCAAwC;AACxC,MAAM,OAAO,kBAAkB;IACrB,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEhD,oCAAoC;IACpC,SAAS,CAAC,KAAkB;QAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAU;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAY;QAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,UAAU;gBAAE,OAAO,KAAK,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAEhB;QACC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7C,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;YACzB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,mCAAmC;IACnC,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=in-memory-agent-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-agent-store.test.d.ts","sourceRoot":"","sources":["../../src/testing/in-memory-agent-store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,111 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { InMemoryAgentStore } from './in-memory-agent-store';
3
+ function makeAgent(overrides) {
4
+ return {
5
+ id: 'agent-1',
6
+ tenant_id: 'test-tenant',
7
+ slug: 'analyst',
8
+ name: 'Analyst',
9
+ description: 'Analyzes data',
10
+ icon: 'bar-chart',
11
+ system_prompt: 'You are an analyst.',
12
+ model: null,
13
+ role_id: null,
14
+ config: null,
15
+ is_enabled: true,
16
+ created_at: new Date().toISOString(),
17
+ updated_at: new Date().toISOString(),
18
+ ...overrides,
19
+ };
20
+ }
21
+ describe('InMemoryAgentStore', () => {
22
+ let store;
23
+ beforeEach(() => {
24
+ store = new InMemoryAgentStore();
25
+ });
26
+ // ─── getAgentById ─────────────────────────────────────────
27
+ describe('getAgentById', () => {
28
+ it('returns null for unknown id', async () => {
29
+ expect(await store.getAgentById('nonexistent')).toBeNull();
30
+ });
31
+ it('returns seeded agent by id', async () => {
32
+ const agent = makeAgent();
33
+ store.seedAgent(agent);
34
+ const result = await store.getAgentById('agent-1');
35
+ expect(result).toEqual(agent);
36
+ });
37
+ });
38
+ // ─── getAgentBySlug ───────────────────────────────────────
39
+ describe('getAgentBySlug', () => {
40
+ it('returns null for unknown slug', async () => {
41
+ expect(await store.getAgentBySlug('nonexistent')).toBeNull();
42
+ });
43
+ it('returns agent by slug', async () => {
44
+ store.seedAgent(makeAgent({ id: 'a1', slug: 'researcher' }));
45
+ store.seedAgent(makeAgent({ id: 'a2', slug: 'analyst' }));
46
+ const result = await store.getAgentBySlug('researcher');
47
+ expect(result?.id).toBe('a1');
48
+ });
49
+ it('returns first match when multiple agents have same slug', async () => {
50
+ store.seedAgent(makeAgent({ id: 'a1', slug: 'analyst' }));
51
+ store.seedAgent(makeAgent({ id: 'a2', slug: 'analyst' }));
52
+ const result = await store.getAgentBySlug('analyst');
53
+ expect(result?.id).toBe('a1');
54
+ });
55
+ });
56
+ // ─── getFirstEnabledAgent ─────────────────────────────────
57
+ describe('getFirstEnabledAgent', () => {
58
+ it('returns null for empty store', async () => {
59
+ expect(await store.getFirstEnabledAgent()).toBeNull();
60
+ });
61
+ it('returns null when all agents are disabled', async () => {
62
+ store.seedAgent(makeAgent({ id: 'a1', is_enabled: false }));
63
+ store.seedAgent(makeAgent({ id: 'a2', is_enabled: false }));
64
+ expect(await store.getFirstEnabledAgent()).toBeNull();
65
+ });
66
+ it('returns the first enabled agent', async () => {
67
+ store.seedAgent(makeAgent({ id: 'a1', is_enabled: false }));
68
+ store.seedAgent(makeAgent({ id: 'a2', is_enabled: true, slug: 'enabled-one' }));
69
+ store.seedAgent(makeAgent({ id: 'a3', is_enabled: true, slug: 'enabled-two' }));
70
+ const result = await store.getFirstEnabledAgent();
71
+ expect(result?.id).toBe('a2');
72
+ });
73
+ });
74
+ // ─── listAgents ───────────────────────────────────────────
75
+ describe('listAgents', () => {
76
+ it('returns empty array for empty store', async () => {
77
+ expect(await store.listAgents()).toEqual([]);
78
+ });
79
+ it('returns all agents by default', async () => {
80
+ store.seedAgent(makeAgent({ id: 'a1', is_enabled: true }));
81
+ store.seedAgent(makeAgent({ id: 'a2', is_enabled: false }));
82
+ const result = await store.listAgents();
83
+ expect(result).toHaveLength(2);
84
+ });
85
+ it('filters to enabled only when requested', async () => {
86
+ store.seedAgent(makeAgent({ id: 'a1', is_enabled: true }));
87
+ store.seedAgent(makeAgent({ id: 'a2', is_enabled: false }));
88
+ store.seedAgent(makeAgent({ id: 'a3', is_enabled: true }));
89
+ const result = await store.listAgents({ enabledOnly: true });
90
+ expect(result).toHaveLength(2);
91
+ expect(result.every((a) => a.is_enabled)).toBe(true);
92
+ });
93
+ it('returns all agents when enabledOnly is false', async () => {
94
+ store.seedAgent(makeAgent({ id: 'a1', is_enabled: true }));
95
+ store.seedAgent(makeAgent({ id: 'a2', is_enabled: false }));
96
+ const result = await store.listAgents({ enabledOnly: false });
97
+ expect(result).toHaveLength(2);
98
+ });
99
+ });
100
+ // ─── clear ────────────────────────────────────────────────
101
+ describe('clear', () => {
102
+ it('removes all agents', async () => {
103
+ store.seedAgent(makeAgent({ id: 'a1' }));
104
+ store.seedAgent(makeAgent({ id: 'a2' }));
105
+ store.clear();
106
+ expect(await store.listAgents()).toEqual([]);
107
+ expect(await store.getAgentById('a1')).toBeNull();
108
+ });
109
+ });
110
+ });
111
+ //# sourceMappingURL=in-memory-agent-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-agent-store.test.js","sourceRoot":"","sources":["../../src/testing/in-memory-agent-store.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { ChatStore, MessageRecord, ConversationListItem, SendMessageInput } from "@sprinterai/core";
2
+ /** In-memory ChatStore for testing. */
3
+ export declare class InMemoryChatStore implements ChatStore {
4
+ private chats;
5
+ private messages;
6
+ private nextChatId;
7
+ private nextMessageId;
8
+ getChat(chatId: string): Promise<ConversationListItem | null>;
9
+ createChat(options: {
10
+ title?: string;
11
+ chatType: "ai" | "direct" | "group";
12
+ agentSlug?: string;
13
+ }): Promise<ConversationListItem>;
14
+ getMessages(chatId: string, options?: {
15
+ limit?: number;
16
+ before?: string;
17
+ }): Promise<MessageRecord[]>;
18
+ saveMessage(chatId: string, input: SendMessageInput & {
19
+ senderType: "user" | "agent" | "system";
20
+ senderId?: string;
21
+ }): Promise<MessageRecord>;
22
+ getChatsByUser(_userId: string, options?: {
23
+ limit?: number;
24
+ }): Promise<ConversationListItem[]>;
25
+ /** Test helper: clear all data. */
26
+ clear(): void;
27
+ }
28
+ //# sourceMappingURL=in-memory-chat-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-chat-store.d.ts","sourceRoot":"","sources":["../../src/testing/in-memory-chat-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAE1B,uCAAuC;AACvC,qBAAa,iBAAkB,YAAW,SAAS;IACjD,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAK;IAEpB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAI7D,UAAU,CAAC,OAAO,EAAE;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,IAAI,GAAG,QAAQ,GAAG,OAAO,CAAC;QACpC,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA2B3B,WAAW,CACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5C,OAAO,CAAC,aAAa,EAAE,CAAC;IAcrB,WAAW,CACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,GAAG;QACxB,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;QACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GACA,OAAO,CAAC,aAAa,CAAC;IA8BnB,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3B,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAWlC,mCAAmC;IACnC,KAAK,IAAI,IAAI;CAMd"}
@@ -0,0 +1,87 @@
1
+ /** In-memory ChatStore for testing. */
2
+ export class InMemoryChatStore {
3
+ chats = new Map();
4
+ messages = new Map();
5
+ nextChatId = 1;
6
+ nextMessageId = 1;
7
+ async getChat(chatId) {
8
+ return this.chats.get(chatId) ?? null;
9
+ }
10
+ async createChat(options) {
11
+ const id = `chat-${this.nextChatId++}`;
12
+ const now = new Date().toISOString();
13
+ const chat = {
14
+ id,
15
+ title: options.title ?? null,
16
+ chat_type: options.chatType,
17
+ created_at: now,
18
+ updated_at: now,
19
+ participants: options.agentSlug
20
+ ? [
21
+ {
22
+ participant_type: "agent",
23
+ participant_id: options.agentSlug,
24
+ display_name: options.agentSlug,
25
+ auto_respond: true,
26
+ },
27
+ ]
28
+ : [],
29
+ unread_count: 0,
30
+ };
31
+ this.chats.set(id, chat);
32
+ this.messages.set(id, []);
33
+ return chat;
34
+ }
35
+ async getMessages(chatId, options) {
36
+ let msgs = this.messages.get(chatId) ?? [];
37
+ if (options?.before) {
38
+ msgs = msgs.filter((m) => m.created_at < options.before);
39
+ }
40
+ if (options?.limit) {
41
+ msgs = msgs.slice(-options.limit);
42
+ }
43
+ return msgs;
44
+ }
45
+ async saveMessage(chatId, input) {
46
+ const id = `msg-${this.nextMessageId++}`;
47
+ const now = new Date().toISOString();
48
+ const message = {
49
+ id,
50
+ chat_id: chatId,
51
+ sender_type: input.senderType,
52
+ sender_id: input.senderId ?? null,
53
+ content: input.content,
54
+ parts: input.parts ?? null,
55
+ metadata: null,
56
+ created_at: now,
57
+ };
58
+ const chatMessages = this.messages.get(chatId);
59
+ if (chatMessages) {
60
+ chatMessages.push(message);
61
+ }
62
+ else {
63
+ this.messages.set(chatId, [message]);
64
+ }
65
+ // Update chat's updated_at
66
+ const chat = this.chats.get(chatId);
67
+ if (chat) {
68
+ this.chats.set(chatId, { ...chat, updated_at: now });
69
+ }
70
+ return message;
71
+ }
72
+ async getChatsByUser(_userId, options) {
73
+ const all = Array.from(this.chats.values()).sort((a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime());
74
+ if (options?.limit) {
75
+ return all.slice(0, options.limit);
76
+ }
77
+ return all;
78
+ }
79
+ /** Test helper: clear all data. */
80
+ clear() {
81
+ this.chats.clear();
82
+ this.messages.clear();
83
+ this.nextChatId = 1;
84
+ this.nextMessageId = 1;
85
+ }
86
+ }
87
+ //# sourceMappingURL=in-memory-chat-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-chat-store.js","sourceRoot":"","sources":["../../src/testing/in-memory-chat-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { EntityStore, EntityRecord, EntityTypeRecord, CreateEntityInput, UpdateEntityInput } from "@sprinterai/core";
2
+ /** In-memory EntityStore for testing. */
3
+ export declare class InMemoryEntityStore implements EntityStore {
4
+ private entities;
5
+ private entityTypes;
6
+ private relations;
7
+ private nextId;
8
+ /** Seed entity types for test setup. */
9
+ seedEntityType(type: EntityTypeRecord): void;
10
+ /** Seed entities for test setup. */
11
+ seedEntity(entity: EntityRecord): void;
12
+ getEntityType(slugOrId: string): Promise<EntityTypeRecord | null>;
13
+ listEntityTypes(): Promise<EntityTypeRecord[]>;
14
+ getEntity(id: string): Promise<EntityRecord | null>;
15
+ searchEntities(query: string, options?: {
16
+ typeSlug?: string;
17
+ tag?: string;
18
+ limit?: number;
19
+ }): Promise<EntityRecord[]>;
20
+ createEntity(input: CreateEntityInput): Promise<EntityRecord>;
21
+ updateEntity(id: string, input: UpdateEntityInput): Promise<EntityRecord>;
22
+ deleteEntity(id: string): Promise<void>;
23
+ createRelation(fromId: string, toId: string, type: string): Promise<void>;
24
+ getEntityCounts(tenantId: string): Promise<Record<string, number>>;
25
+ /** Test helper: get all relations. */
26
+ getRelations(): Array<{
27
+ fromId: string;
28
+ toId: string;
29
+ type: string;
30
+ }>;
31
+ /** Test helper: clear all data. */
32
+ clear(): void;
33
+ }
34
+ //# sourceMappingURL=in-memory-entity-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-entity-store.d.ts","sourceRoot":"","sources":["../../src/testing/in-memory-entity-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAE1B,yCAAyC;AACzC,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,WAAW,CAAuC;IAC1D,OAAO,CAAC,SAAS,CAIT;IACR,OAAO,CAAC,MAAM,CAAK;IAEnB,wCAAwC;IACxC,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAK5C,oCAAoC;IACpC,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAIhC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAIjE,eAAe,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAY9C,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAInD,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5D,OAAO,CAAC,YAAY,EAAE,CAAC;IA8BpB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IA+B7D,YAAY,CAChB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,YAAY,CAAC;IAwBlB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvC,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC;IAIV,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAWxE,sCAAsC;IACtC,YAAY,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAIrE,mCAAmC;IACnC,KAAK,IAAI,IAAI;CAMd"}