vesper-memory 0.3.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 (206) hide show
  1. package/.env.example +28 -0
  2. package/CHANGELOG.md +137 -0
  3. package/LICENSE +21 -0
  4. package/README.md +665 -0
  5. package/config/sqlite-schema.sql +413 -0
  6. package/dist/benchmark/index.d.ts +18 -0
  7. package/dist/benchmark/index.d.ts.map +1 -0
  8. package/dist/benchmark/index.js +19 -0
  9. package/dist/benchmark/index.js.map +1 -0
  10. package/dist/benchmark/metrics-collector.d.ts +90 -0
  11. package/dist/benchmark/metrics-collector.d.ts.map +1 -0
  12. package/dist/benchmark/metrics-collector.js +196 -0
  13. package/dist/benchmark/metrics-collector.js.map +1 -0
  14. package/dist/benchmark/report-generator.d.ts +35 -0
  15. package/dist/benchmark/report-generator.d.ts.map +1 -0
  16. package/dist/benchmark/report-generator.js +221 -0
  17. package/dist/benchmark/report-generator.js.map +1 -0
  18. package/dist/benchmark/runner.d.ts +30 -0
  19. package/dist/benchmark/runner.d.ts.map +1 -0
  20. package/dist/benchmark/runner.js +308 -0
  21. package/dist/benchmark/runner.js.map +1 -0
  22. package/dist/benchmark/scenarios/context-recall.d.ts +65 -0
  23. package/dist/benchmark/scenarios/context-recall.d.ts.map +1 -0
  24. package/dist/benchmark/scenarios/context-recall.js +180 -0
  25. package/dist/benchmark/scenarios/context-recall.js.map +1 -0
  26. package/dist/benchmark/scenarios/index.d.ts +34 -0
  27. package/dist/benchmark/scenarios/index.d.ts.map +1 -0
  28. package/dist/benchmark/scenarios/index.js +230 -0
  29. package/dist/benchmark/scenarios/index.js.map +1 -0
  30. package/dist/benchmark/statistics.d.ts +125 -0
  31. package/dist/benchmark/statistics.d.ts.map +1 -0
  32. package/dist/benchmark/statistics.js +520 -0
  33. package/dist/benchmark/statistics.js.map +1 -0
  34. package/dist/benchmark/types.d.ts +458 -0
  35. package/dist/benchmark/types.d.ts.map +1 -0
  36. package/dist/benchmark/types.js +297 -0
  37. package/dist/benchmark/types.js.map +1 -0
  38. package/dist/cli 2.js +583 -0
  39. package/dist/cli.d 2.ts +8 -0
  40. package/dist/cli.d.ts +8 -0
  41. package/dist/cli.d.ts 2.map +1 -0
  42. package/dist/cli.d.ts.map +1 -0
  43. package/dist/cli.js +583 -0
  44. package/dist/cli.js 2.map +1 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/config/rate-limits.d.ts +76 -0
  47. package/dist/config/rate-limits.d.ts.map +1 -0
  48. package/dist/config/rate-limits.js +161 -0
  49. package/dist/config/rate-limits.js.map +1 -0
  50. package/dist/config 2/rate-limits.d.ts +76 -0
  51. package/dist/config 2/rate-limits.d.ts.map +1 -0
  52. package/dist/config 2/rate-limits.js +161 -0
  53. package/dist/config 2/rate-limits.js.map +1 -0
  54. package/dist/consolidation/pipeline.d.ts +52 -0
  55. package/dist/consolidation/pipeline.d.ts.map +1 -0
  56. package/dist/consolidation/pipeline.js +193 -0
  57. package/dist/consolidation/pipeline.js.map +1 -0
  58. package/dist/consolidation 2/pipeline.d.ts +52 -0
  59. package/dist/consolidation 2/pipeline.d.ts.map +1 -0
  60. package/dist/consolidation 2/pipeline.js +193 -0
  61. package/dist/consolidation 2/pipeline.js.map +1 -0
  62. package/dist/embeddings/client.d.ts +95 -0
  63. package/dist/embeddings/client.d.ts.map +1 -0
  64. package/dist/embeddings/client.js +162 -0
  65. package/dist/embeddings/client.js.map +1 -0
  66. package/dist/embeddings 2/client.d.ts +94 -0
  67. package/dist/embeddings 2/client.d.ts.map +1 -0
  68. package/dist/embeddings 2/client.js +144 -0
  69. package/dist/embeddings 2/client.js.map +1 -0
  70. package/dist/memory-layers/semantic-memory.d.ts +76 -0
  71. package/dist/memory-layers/semantic-memory.d.ts.map +1 -0
  72. package/dist/memory-layers/semantic-memory.js +231 -0
  73. package/dist/memory-layers/semantic-memory.js.map +1 -0
  74. package/dist/memory-layers/skill-library.d.ts +25 -0
  75. package/dist/memory-layers/skill-library.d.ts.map +1 -0
  76. package/dist/memory-layers/skill-library.js +54 -0
  77. package/dist/memory-layers/skill-library.js.map +1 -0
  78. package/dist/memory-layers/working-memory.d.ts +57 -0
  79. package/dist/memory-layers/working-memory.d.ts.map +1 -0
  80. package/dist/memory-layers/working-memory.js +153 -0
  81. package/dist/memory-layers/working-memory.js.map +1 -0
  82. package/dist/memory-layers 2/semantic-memory.d.ts +33 -0
  83. package/dist/memory-layers 2/semantic-memory.d.ts.map +1 -0
  84. package/dist/memory-layers 2/semantic-memory.js +114 -0
  85. package/dist/memory-layers 2/semantic-memory.js.map +1 -0
  86. package/dist/memory-layers 2/skill-library.d.ts +25 -0
  87. package/dist/memory-layers 2/skill-library.d.ts.map +1 -0
  88. package/dist/memory-layers 2/skill-library.js +54 -0
  89. package/dist/memory-layers 2/skill-library.js.map +1 -0
  90. package/dist/memory-layers 2/working-memory.d.ts +57 -0
  91. package/dist/memory-layers 2/working-memory.d.ts.map +1 -0
  92. package/dist/memory-layers 2/working-memory.js +153 -0
  93. package/dist/memory-layers 2/working-memory.js.map +1 -0
  94. package/dist/middleware/auth.d.ts +287 -0
  95. package/dist/middleware/auth.d.ts.map +1 -0
  96. package/dist/middleware/auth.js +610 -0
  97. package/dist/middleware/auth.js.map +1 -0
  98. package/dist/middleware 2/auth.d.ts +287 -0
  99. package/dist/middleware 2/auth.d.ts.map +1 -0
  100. package/dist/middleware 2/auth.js +610 -0
  101. package/dist/middleware 2/auth.js.map +1 -0
  102. package/dist/monitoring/health.d.ts +241 -0
  103. package/dist/monitoring/health.d.ts.map +1 -0
  104. package/dist/monitoring/health.js +649 -0
  105. package/dist/monitoring/health.js.map +1 -0
  106. package/dist/monitoring/metrics.d.ts +153 -0
  107. package/dist/monitoring/metrics.d.ts.map +1 -0
  108. package/dist/monitoring/metrics.js +349 -0
  109. package/dist/monitoring/metrics.js.map +1 -0
  110. package/dist/monitoring 2/health.d.ts +241 -0
  111. package/dist/monitoring 2/health.d.ts.map +1 -0
  112. package/dist/monitoring 2/health.js +649 -0
  113. package/dist/monitoring 2/health.js.map +1 -0
  114. package/dist/monitoring 2/metrics.d.ts +153 -0
  115. package/dist/monitoring 2/metrics.d.ts.map +1 -0
  116. package/dist/monitoring 2/metrics.js +349 -0
  117. package/dist/monitoring 2/metrics.js.map +1 -0
  118. package/dist/retrieval/hybrid-search.d.ts +186 -0
  119. package/dist/retrieval/hybrid-search.d.ts.map +1 -0
  120. package/dist/retrieval/hybrid-search.js +330 -0
  121. package/dist/retrieval/hybrid-search.js.map +1 -0
  122. package/dist/retrieval 2/hybrid-search.d.ts +186 -0
  123. package/dist/retrieval 2/hybrid-search.d.ts.map +1 -0
  124. package/dist/retrieval 2/hybrid-search.js +327 -0
  125. package/dist/retrieval 2/hybrid-search.js.map +1 -0
  126. package/dist/router/smart-router.d.ts +157 -0
  127. package/dist/router/smart-router.d.ts.map +1 -0
  128. package/dist/router/smart-router.js +524 -0
  129. package/dist/router/smart-router.js.map +1 -0
  130. package/dist/router 2/smart-router.d.ts +111 -0
  131. package/dist/router 2/smart-router.d.ts.map +1 -0
  132. package/dist/router 2/smart-router.js +383 -0
  133. package/dist/router 2/smart-router.js.map +1 -0
  134. package/dist/security/rate-limit-middleware.d.ts +119 -0
  135. package/dist/security/rate-limit-middleware.d.ts.map +1 -0
  136. package/dist/security/rate-limit-middleware.js +193 -0
  137. package/dist/security/rate-limit-middleware.js.map +1 -0
  138. package/dist/security 2/rate-limit-middleware.d.ts +119 -0
  139. package/dist/security 2/rate-limit-middleware.d.ts.map +1 -0
  140. package/dist/security 2/rate-limit-middleware.js +193 -0
  141. package/dist/security 2/rate-limit-middleware.js.map +1 -0
  142. package/dist/server 2.js +861 -0
  143. package/dist/server-wrapper 2.js +170 -0
  144. package/dist/server-wrapper.d 2.ts +12 -0
  145. package/dist/server-wrapper.d.ts +12 -0
  146. package/dist/server-wrapper.d.ts 2.map +1 -0
  147. package/dist/server-wrapper.d.ts.map +1 -0
  148. package/dist/server-wrapper.js +170 -0
  149. package/dist/server-wrapper.js 2.map +1 -0
  150. package/dist/server-wrapper.js.map +1 -0
  151. package/dist/server.d 2.ts +14 -0
  152. package/dist/server.d.ts +14 -0
  153. package/dist/server.d.ts 2.map +1 -0
  154. package/dist/server.d.ts.map +1 -0
  155. package/dist/server.js +656 -0
  156. package/dist/server.js 2.map +1 -0
  157. package/dist/server.js.map +1 -0
  158. package/dist/synthesis/conflict-detector.d.ts +43 -0
  159. package/dist/synthesis/conflict-detector.d.ts.map +1 -0
  160. package/dist/synthesis/conflict-detector.js +125 -0
  161. package/dist/synthesis/conflict-detector.js.map +1 -0
  162. package/dist/synthesis 2/conflict-detector.d.ts +43 -0
  163. package/dist/synthesis 2/conflict-detector.d.ts.map +1 -0
  164. package/dist/synthesis 2/conflict-detector.js +125 -0
  165. package/dist/synthesis 2/conflict-detector.js.map +1 -0
  166. package/dist/utils/monitoring.d.ts +25 -0
  167. package/dist/utils/monitoring.d.ts.map +1 -0
  168. package/dist/utils/monitoring.js +41 -0
  169. package/dist/utils/monitoring.js.map +1 -0
  170. package/dist/utils/rate-limiter.d.ts +97 -0
  171. package/dist/utils/rate-limiter.d.ts.map +1 -0
  172. package/dist/utils/rate-limiter.js +166 -0
  173. package/dist/utils/rate-limiter.js.map +1 -0
  174. package/dist/utils/validation.d.ts +139 -0
  175. package/dist/utils/validation.d.ts.map +1 -0
  176. package/dist/utils/validation.js +195 -0
  177. package/dist/utils/validation.js.map +1 -0
  178. package/dist/utils 2/monitoring.d.ts +25 -0
  179. package/dist/utils 2/monitoring.d.ts.map +1 -0
  180. package/dist/utils 2/monitoring.js +41 -0
  181. package/dist/utils 2/monitoring.js.map +1 -0
  182. package/dist/utils 2/rate-limiter.d.ts +97 -0
  183. package/dist/utils 2/rate-limiter.d.ts.map +1 -0
  184. package/dist/utils 2/rate-limiter.js +166 -0
  185. package/dist/utils 2/rate-limiter.js.map +1 -0
  186. package/dist/utils 2/validation.d.ts +139 -0
  187. package/dist/utils 2/validation.d.ts.map +1 -0
  188. package/dist/utils 2/validation.js +195 -0
  189. package/dist/utils 2/validation.js.map +1 -0
  190. package/docker-compose.yml +65 -0
  191. package/embedding-service/Dockerfile +29 -0
  192. package/embedding-service/README.md +68 -0
  193. package/embedding-service/requirements.txt +6 -0
  194. package/embedding-service/server.py +110 -0
  195. package/package.json +92 -0
  196. package/scripts/FRESH_INSTALL.md +280 -0
  197. package/scripts/README.md +101 -0
  198. package/scripts/ensure-infrastructure.sh +38 -0
  199. package/scripts/fresh-install-auto.sh +96 -0
  200. package/scripts/fresh-install.sh +167 -0
  201. package/scripts/health-check.sh +72 -0
  202. package/scripts/init-qdrant.ts +201 -0
  203. package/scripts/postinstall.js +94 -0
  204. package/scripts/run-accuracy-benchmark.ts +1237 -0
  205. package/scripts/run-real-benchmark.ts +581 -0
  206. package/scripts/test-mcp-server.sh +38 -0
@@ -0,0 +1,308 @@
1
+ /**
2
+ * Benchmark Runner
3
+ *
4
+ * Orchestrates the execution of all benchmark scenarios.
5
+ * Runs A/B tests (Vesper enabled vs disabled) and compares results.
6
+ */
7
+ import { randomUUID } from "crypto";
8
+ import { validateBenchmarkConfig } from "./types.js";
9
+ import { createScenario } from "./scenarios/index.js";
10
+ import { welchTTest, cohensD, interpretEffectSize, mean } from "./statistics.js";
11
+ import { estimateTokens } from "./metrics-collector.js";
12
+ /**
13
+ * Create a benchmark runner
14
+ *
15
+ * @param client - MCP client for memory operations
16
+ * @param config - Benchmark configuration
17
+ * @returns BenchmarkRunner instance
18
+ */
19
+ export function createBenchmarkRunner(client, config) {
20
+ // Validate config
21
+ const validatedConfig = validateBenchmarkConfig(config);
22
+ return {
23
+ getConfig() {
24
+ return { ...validatedConfig };
25
+ },
26
+ async run() {
27
+ const startTime = Date.now();
28
+ const benchmarkId = `bench-${randomUUID().slice(0, 8)}`;
29
+ const comparisons = [];
30
+ // Run each scenario
31
+ for (const scenarioType of validatedConfig.scenarios) {
32
+ try {
33
+ const comparison = await runScenarioComparison(client, scenarioType, validatedConfig);
34
+ comparisons.push(comparison);
35
+ }
36
+ catch (err) {
37
+ console.error(`Error running scenario ${scenarioType}:`, err instanceof Error ? err.message : String(err));
38
+ // Create a placeholder comparison for failed scenario
39
+ comparisons.push(createFailedComparison(scenarioType, err));
40
+ }
41
+ }
42
+ const endTime = Date.now();
43
+ // Calculate summary
44
+ const summary = calculateSummary(comparisons);
45
+ return {
46
+ id: benchmarkId,
47
+ startTime,
48
+ endTime,
49
+ config: validatedConfig,
50
+ comparisons,
51
+ summary,
52
+ metadata: {
53
+ version: "0.1.0",
54
+ environment: process.env.NODE_ENV || "development",
55
+ hostname: process.env.HOSTNAME,
56
+ nodeVersion: process.version,
57
+ },
58
+ };
59
+ },
60
+ };
61
+ }
62
+ /**
63
+ * Run a single scenario comparison (enabled vs disabled)
64
+ */
65
+ async function runScenarioComparison(client, scenarioType, config) {
66
+ const scenario = createScenario(scenarioType, client);
67
+ // Setup scenario
68
+ await scenario.setup();
69
+ // Run warmup (if configured)
70
+ for (let i = 0; i < config.warmupRuns; i++) {
71
+ await scenario.run("vesper-enabled");
72
+ }
73
+ // Run measurement - Vesper enabled
74
+ const enabledResults = [];
75
+ for (let i = 0; i < config.measurementRuns; i++) {
76
+ const result = await scenario.run("vesper-enabled");
77
+ enabledResults.push(result);
78
+ }
79
+ // Aggregate enabled results
80
+ const enabledResult = aggregateScenarioRuns(enabledResults, "vesper-enabled");
81
+ // Run measurement - Vesper disabled
82
+ const disabledResults = [];
83
+ for (let i = 0; i < config.measurementRuns; i++) {
84
+ const result = await scenario.run("vesper-disabled");
85
+ disabledResults.push(result);
86
+ }
87
+ // Aggregate disabled results
88
+ const disabledResult = aggregateScenarioRuns(disabledResults, "vesper-disabled");
89
+ // Teardown
90
+ await scenario.teardown();
91
+ // Statistical comparison
92
+ const statistics = comparePhasesStatistically(enabledResult, disabledResult, config.significanceLevel);
93
+ // Determine winner
94
+ const winner = determineWinner(statistics);
95
+ return {
96
+ scenarioType,
97
+ enabledResult,
98
+ disabledResult,
99
+ statistics,
100
+ winner,
101
+ };
102
+ }
103
+ /**
104
+ * Aggregate multiple scenario runs into a single result
105
+ */
106
+ function aggregateScenarioRuns(runs, phase) {
107
+ if (runs.length === 0) {
108
+ throw new Error("No runs to aggregate");
109
+ }
110
+ // Flatten all metrics
111
+ const allMetrics = runs.flatMap((r) => r.metrics);
112
+ // Aggregate latencies for percentiles
113
+ const latencies = allMetrics.map((m) => m.latencyMs);
114
+ const sortedLatencies = [...latencies].sort((a, b) => a - b);
115
+ const latencyP50 = percentileFromSorted(sortedLatencies, 50);
116
+ const latencyP95 = percentileFromSorted(sortedLatencies, 95);
117
+ const latencyP99 = percentileFromSorted(sortedLatencies, 99);
118
+ // Calculate memory hit rate
119
+ const memoryHitRate = allMetrics.filter((m) => m.memoryHit).length / allMetrics.length;
120
+ // Calculate average accuracy if available
121
+ const accuracies = allMetrics
122
+ .filter((m) => m.retrievalAccuracy !== undefined)
123
+ .map((m) => m.retrievalAccuracy);
124
+ const avgAccuracy = accuracies.length > 0 ? mean(accuracies) : undefined;
125
+ // Take the last run's metrics as the representative sample
126
+ // (this matches the measurementRuns count for statistical analysis)
127
+ const lastRun = runs[runs.length - 1];
128
+ return {
129
+ scenarioType: lastRun.scenarioType,
130
+ phase,
131
+ metrics: lastRun.metrics,
132
+ aggregates: {
133
+ latencyP50,
134
+ latencyP95,
135
+ latencyP99,
136
+ memoryHitRate,
137
+ avgAccuracy,
138
+ },
139
+ rawResponses: lastRun.rawResponses,
140
+ errors: runs.flatMap((r) => r.errors || []),
141
+ };
142
+ }
143
+ /**
144
+ * Calculate percentile from sorted array
145
+ */
146
+ function percentileFromSorted(sorted, p) {
147
+ if (sorted.length === 0)
148
+ return 0;
149
+ const index = Math.ceil((p / 100) * sorted.length) - 1;
150
+ return sorted[Math.max(0, index)];
151
+ }
152
+ /**
153
+ * Compare two scenario results statistically
154
+ */
155
+ export function comparePhasesStatistically(enabledResult, disabledResult, alpha) {
156
+ const enabledLatencies = enabledResult.metrics.map((m) => m.latencyMs);
157
+ const disabledLatencies = disabledResult.metrics.map((m) => m.latencyMs);
158
+ // Calculate latency improvement (positive = enabled is faster)
159
+ const enabledMean = mean(enabledLatencies);
160
+ const disabledMean = mean(disabledLatencies);
161
+ const latencyImprovement = disabledMean > 0
162
+ ? ((disabledMean - enabledMean) / disabledMean) * 100
163
+ : 0;
164
+ // Calculate token savings (estimate based on response length)
165
+ const enabledTokens = enabledResult.rawResponses
166
+ .map((r) => estimateTokens(r))
167
+ .reduce((a, b) => a + b, 0);
168
+ const disabledTokens = disabledResult.rawResponses
169
+ .map((r) => estimateTokens(r))
170
+ .reduce((a, b) => a + b, 0);
171
+ const tokenSavings = disabledTokens > 0
172
+ ? ((disabledTokens - enabledTokens) / disabledTokens) * 100
173
+ : 0;
174
+ // Calculate accuracy delta
175
+ const enabledAccuracies = enabledResult.metrics
176
+ .filter((m) => m.retrievalAccuracy !== undefined)
177
+ .map((m) => m.retrievalAccuracy);
178
+ const disabledAccuracies = disabledResult.metrics
179
+ .filter((m) => m.retrievalAccuracy !== undefined)
180
+ .map((m) => m.retrievalAccuracy);
181
+ const enabledAvgAccuracy = enabledAccuracies.length > 0 ? mean(enabledAccuracies) : 0;
182
+ const disabledAvgAccuracy = disabledAccuracies.length > 0 ? mean(disabledAccuracies) : 0;
183
+ const accuracyDelta = enabledAvgAccuracy - disabledAvgAccuracy;
184
+ // Perform Welch's t-test on latencies
185
+ let tTestResult;
186
+ try {
187
+ tTestResult = welchTTest(enabledLatencies, disabledLatencies, alpha);
188
+ }
189
+ catch {
190
+ // Fallback if t-test fails (e.g., identical values)
191
+ // Ensure degreesOfFreedom is non-negative (min 1 for valid schema)
192
+ const df = Math.max(1, enabledLatencies.length + disabledLatencies.length - 2);
193
+ tTestResult = {
194
+ tStatistic: 0,
195
+ pValue: 1,
196
+ degreesOfFreedom: df,
197
+ significant: false,
198
+ alpha,
199
+ meanDifference: enabledMean - disabledMean,
200
+ };
201
+ }
202
+ // Calculate Cohen's d effect size
203
+ let d = 0;
204
+ let interpretation = "negligible";
205
+ try {
206
+ d = cohensD(enabledLatencies, disabledLatencies);
207
+ interpretation = interpretEffectSize(d);
208
+ }
209
+ catch {
210
+ // Fallback
211
+ }
212
+ return {
213
+ latencyImprovement,
214
+ tokenSavings,
215
+ accuracyDelta,
216
+ tTestResult,
217
+ effectSize: {
218
+ cohensD: d,
219
+ interpretation,
220
+ },
221
+ };
222
+ }
223
+ /**
224
+ * Determine winner based on statistical comparison
225
+ */
226
+ function determineWinner(stats) {
227
+ // Primary criteria: statistical significance
228
+ if (!stats.tTestResult.significant) {
229
+ return "tie";
230
+ }
231
+ // If significant, check direction
232
+ // Negative t-statistic means enabled < disabled (enabled is faster = better)
233
+ // Positive latency improvement means enabled is faster
234
+ if (stats.latencyImprovement > 0 && stats.tTestResult.tStatistic < 0) {
235
+ return "vesper-enabled";
236
+ }
237
+ if (stats.latencyImprovement < 0 && stats.tTestResult.tStatistic > 0) {
238
+ return "vesper-disabled";
239
+ }
240
+ // Secondary criteria: accuracy
241
+ if (stats.accuracyDelta > 0.1) {
242
+ return "vesper-enabled";
243
+ }
244
+ if (stats.accuracyDelta < -0.1) {
245
+ return "vesper-disabled";
246
+ }
247
+ return "tie";
248
+ }
249
+ /**
250
+ * Calculate summary from all comparisons
251
+ */
252
+ function calculateSummary(comparisons) {
253
+ const vesperWins = comparisons.filter((c) => c.winner === "vesper-enabled").length;
254
+ const disabledWins = comparisons.filter((c) => c.winner === "vesper-disabled").length;
255
+ const ties = comparisons.filter((c) => c.winner === "tie").length;
256
+ // Calculate overall improvement (average of latency improvements)
257
+ const improvements = comparisons.map((c) => c.statistics.latencyImprovement);
258
+ const overallImprovement = improvements.length > 0 ? mean(improvements) : 0;
259
+ // Determine if overall result is statistically significant
260
+ const significantCount = comparisons.filter((c) => c.statistics.tTestResult.significant).length;
261
+ const statisticallySignificant = significantCount > comparisons.length / 2;
262
+ return {
263
+ totalScenarios: comparisons.length,
264
+ vesperWins,
265
+ disabledWins,
266
+ ties,
267
+ overallImprovement,
268
+ statisticallySignificant,
269
+ };
270
+ }
271
+ /**
272
+ * Create a failed comparison placeholder
273
+ */
274
+ function createFailedComparison(scenarioType, error) {
275
+ const errorMsg = error instanceof Error ? error.message : String(error);
276
+ const emptyResult = {
277
+ scenarioType,
278
+ phase: "vesper-enabled",
279
+ metrics: [{ timestamp: Date.now(), latencyMs: 0, memoryHit: false }],
280
+ aggregates: { latencyP50: 0, latencyP95: 0, latencyP99: 0 },
281
+ rawResponses: [],
282
+ errors: [errorMsg],
283
+ };
284
+ return {
285
+ scenarioType,
286
+ enabledResult: { ...emptyResult, phase: "vesper-enabled" },
287
+ disabledResult: { ...emptyResult, phase: "vesper-disabled" },
288
+ statistics: {
289
+ latencyImprovement: 0,
290
+ tokenSavings: 0,
291
+ accuracyDelta: 0,
292
+ tTestResult: {
293
+ tStatistic: 0,
294
+ pValue: 1,
295
+ degreesOfFreedom: 0,
296
+ significant: false,
297
+ alpha: 0.05,
298
+ meanDifference: 0,
299
+ },
300
+ effectSize: {
301
+ cohensD: 0,
302
+ interpretation: "negligible",
303
+ },
304
+ },
305
+ winner: "tie",
306
+ };
307
+ }
308
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/benchmark/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Context Recall Scenario
3
+ *
4
+ * Tests the ability to recall facts from previous conversations.
5
+ * This is the most basic memory scenario - can we remember what was said?
6
+ */
7
+ import type { ScenarioType, ScenarioResult, BenchmarkPhase } from "../types.js";
8
+ /**
9
+ * Test case structure for context recall
10
+ */
11
+ export interface ContextRecallTestCase {
12
+ /** The fact to store */
13
+ fact: string;
14
+ /** The question to ask */
15
+ question: string;
16
+ /** Expected keywords in the response */
17
+ expectedKeywords: string[];
18
+ /** Category of the fact */
19
+ category: "personal" | "project" | "preference" | "technical";
20
+ }
21
+ /**
22
+ * Test data for context recall scenario
23
+ */
24
+ export declare const CONTEXT_RECALL_TEST_DATA: ContextRecallTestCase[];
25
+ /**
26
+ * MCP Client interface for memory operations
27
+ */
28
+ export interface MCPClient {
29
+ storeMemory(content: string, memoryType: string, metadata?: Record<string, unknown>): Promise<{
30
+ success: boolean;
31
+ memory_id: string;
32
+ }>;
33
+ retrieveMemory(query: string, options?: {
34
+ max_results?: number;
35
+ }): Promise<{
36
+ success: boolean;
37
+ results: Array<{
38
+ content: string;
39
+ similarity_score: number;
40
+ }>;
41
+ }>;
42
+ }
43
+ /**
44
+ * Context Recall Scenario interface
45
+ */
46
+ export interface ContextRecallScenario {
47
+ /** Get scenario type */
48
+ getType(): ScenarioType;
49
+ /** Get scenario description */
50
+ getDescription(): string;
51
+ /** Setup the scenario (store initial facts) */
52
+ setup(): Promise<void>;
53
+ /** Run the scenario in specified phase */
54
+ run(phase: BenchmarkPhase): Promise<ScenarioResult>;
55
+ /** Clean up after scenario */
56
+ teardown(): Promise<void>;
57
+ }
58
+ /**
59
+ * Create a context recall scenario
60
+ *
61
+ * @param client - MCP client for memory operations
62
+ * @returns ContextRecallScenario instance
63
+ */
64
+ export declare function createContextRecallScenario(client: MCPClient): ContextRecallScenario;
65
+ //# sourceMappingURL=context-recall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-recall.d.ts","sourceRoot":"","sources":["../../../src/benchmark/scenarios/context-recall.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,cAAc,EAGf,MAAM,aAAa,CAAC;AAQrB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,2BAA2B;IAC3B,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,CAAC;CAC/D;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,qBAAqB,EAiD3D,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW,CACT,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEpD,cAAc,CACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACjC,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,gBAAgB,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC/D,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,wBAAwB;IACxB,OAAO,IAAI,YAAY,CAAC;IAExB,+BAA+B;IAC/B,cAAc,IAAI,MAAM,CAAC;IAEzB,+CAA+C;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,0CAA0C;IAC1C,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEpD,8BAA8B;IAC9B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,SAAS,GAChB,qBAAqB,CA+HvB"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Context Recall Scenario
3
+ *
4
+ * Tests the ability to recall facts from previous conversations.
5
+ * This is the most basic memory scenario - can we remember what was said?
6
+ */
7
+ import { measureLatency, evaluateResponseQuality, aggregateMetrics, } from "../metrics-collector.js";
8
+ /**
9
+ * Test data for context recall scenario
10
+ */
11
+ export const CONTEXT_RECALL_TEST_DATA = [
12
+ {
13
+ fact: "The user prefers TypeScript over JavaScript for type safety",
14
+ question: "What programming language do I prefer?",
15
+ expectedKeywords: ["TypeScript", "type safety"],
16
+ category: "preference",
17
+ },
18
+ {
19
+ fact: "The user is working on a project called Vesper, which is a memory system for AI",
20
+ question: "What project am I currently working on?",
21
+ expectedKeywords: ["Vesper", "memory"],
22
+ category: "project",
23
+ },
24
+ {
25
+ fact: "The user's name is David and they are based in San Francisco",
26
+ question: "What is my name?",
27
+ expectedKeywords: ["David"],
28
+ category: "personal",
29
+ },
30
+ {
31
+ fact: "The user wants test coverage above 80% for all code",
32
+ question: "What are my testing requirements?",
33
+ expectedKeywords: ["80%", "coverage", "test"],
34
+ category: "technical",
35
+ },
36
+ {
37
+ fact: "The user prefers functional programming style over object-oriented",
38
+ question: "What programming paradigm do I prefer?",
39
+ expectedKeywords: ["functional"],
40
+ category: "preference",
41
+ },
42
+ {
43
+ fact: "The user is collaborating with Claude on this project",
44
+ question: "Who am I collaborating with?",
45
+ expectedKeywords: ["Claude"],
46
+ category: "personal",
47
+ },
48
+ {
49
+ fact: "The target latency for the system is under 200ms P95",
50
+ question: "What is the target latency for the system?",
51
+ expectedKeywords: ["200ms", "P95", "latency"],
52
+ category: "technical",
53
+ },
54
+ {
55
+ fact: "The user emphasizes pragmatic solutions over theoretical perfection",
56
+ question: "What is my approach to problem solving?",
57
+ expectedKeywords: ["pragmatic"],
58
+ category: "preference",
59
+ },
60
+ ];
61
+ /**
62
+ * Create a context recall scenario
63
+ *
64
+ * @param client - MCP client for memory operations
65
+ * @returns ContextRecallScenario instance
66
+ */
67
+ export function createContextRecallScenario(client) {
68
+ const errors = [];
69
+ return {
70
+ getType() {
71
+ return "context-recall";
72
+ },
73
+ getDescription() {
74
+ return "Tests ability to recall facts from previous conversations within the same session.";
75
+ },
76
+ async setup() {
77
+ errors.length = 0;
78
+ // Store all facts as semantic memories
79
+ for (const testCase of CONTEXT_RECALL_TEST_DATA) {
80
+ try {
81
+ await client.storeMemory(testCase.fact, "semantic", {
82
+ category: testCase.category,
83
+ timestamp: Date.now(),
84
+ });
85
+ }
86
+ catch (err) {
87
+ const errorMsg = err instanceof Error ? err.message : String(err);
88
+ errors.push(`Setup error storing fact: ${errorMsg}`);
89
+ }
90
+ }
91
+ },
92
+ async run(phase) {
93
+ const metrics = [];
94
+ const rawResponses = [];
95
+ for (const testCase of CONTEXT_RECALL_TEST_DATA) {
96
+ if (phase === "vesper-enabled") {
97
+ // With Vesper enabled: retrieve from memory
98
+ try {
99
+ const { result, latencyMs } = await measureLatency(async () => {
100
+ return await client.retrieveMemory(testCase.question, {
101
+ max_results: 3,
102
+ });
103
+ });
104
+ const memoryHit = result.success && result.results.length > 0;
105
+ const responseContent = memoryHit
106
+ ? result.results[0].content
107
+ : "No relevant memory found";
108
+ // Evaluate quality
109
+ const retrievalAccuracy = memoryHit
110
+ ? evaluateResponseQuality(responseContent, testCase.expectedKeywords, {
111
+ mode: "keywords",
112
+ })
113
+ : 0;
114
+ metrics.push({
115
+ timestamp: Date.now(),
116
+ latencyMs,
117
+ memoryHit,
118
+ retrievalAccuracy,
119
+ });
120
+ rawResponses.push(responseContent);
121
+ }
122
+ catch (err) {
123
+ const errorMsg = err instanceof Error ? err.message : String(err);
124
+ errors.push(`Run error: ${errorMsg}`);
125
+ // Record failed attempt
126
+ metrics.push({
127
+ timestamp: Date.now(),
128
+ latencyMs: 0,
129
+ memoryHit: false,
130
+ retrievalAccuracy: 0,
131
+ });
132
+ rawResponses.push(`Error: ${errorMsg}`);
133
+ }
134
+ }
135
+ else {
136
+ // With Vesper disabled: simulate no memory access
137
+ const startTime = performance.now();
138
+ // Simulate baseline latency (no memory lookup, just processing)
139
+ await new Promise((resolve) => setTimeout(resolve, 1));
140
+ const latencyMs = performance.now() - startTime;
141
+ // Without memory, we can't recall the fact
142
+ metrics.push({
143
+ timestamp: Date.now(),
144
+ latencyMs,
145
+ memoryHit: false,
146
+ retrievalAccuracy: 0,
147
+ });
148
+ rawResponses.push("Memory disabled - cannot recall");
149
+ }
150
+ }
151
+ // Calculate aggregates
152
+ let aggregates;
153
+ try {
154
+ aggregates = aggregateMetrics(metrics);
155
+ }
156
+ catch (err) {
157
+ // Fallback if aggregation fails
158
+ aggregates = {
159
+ latencyP50: 0,
160
+ latencyP95: 0,
161
+ latencyP99: 0,
162
+ memoryHitRate: 0,
163
+ };
164
+ }
165
+ return {
166
+ scenarioType: "context-recall",
167
+ phase,
168
+ metrics,
169
+ aggregates,
170
+ rawResponses,
171
+ errors: errors.length > 0 ? [...errors] : undefined,
172
+ };
173
+ },
174
+ async teardown() {
175
+ errors.length = 0;
176
+ // MCP client cleanup would happen at a higher level
177
+ },
178
+ };
179
+ }
180
+ //# sourceMappingURL=context-recall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-recall.js","sourceRoot":"","sources":["../../../src/benchmark/scenarios/context-recall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Scenario Module Index
3
+ *
4
+ * Exports all scenario implementations and factory functions.
5
+ */
6
+ export { createContextRecallScenario, CONTEXT_RECALL_TEST_DATA } from "./context-recall.js";
7
+ export type { ContextRecallScenario, ContextRecallTestCase, MCPClient, } from "./context-recall.js";
8
+ import type { ScenarioType, ScenarioResult, BenchmarkPhase } from "../types.js";
9
+ import { MCPClient } from "./context-recall.js";
10
+ /**
11
+ * Common scenario interface
12
+ */
13
+ export interface BenchmarkScenario {
14
+ /** Get scenario type */
15
+ getType(): ScenarioType;
16
+ /** Get scenario description */
17
+ getDescription(): string;
18
+ /** Setup the scenario */
19
+ setup(): Promise<void>;
20
+ /** Run the scenario in specified phase */
21
+ run(phase: BenchmarkPhase): Promise<ScenarioResult>;
22
+ /** Clean up after scenario */
23
+ teardown(): Promise<void>;
24
+ }
25
+ /**
26
+ * Create a scenario by type
27
+ *
28
+ * @param type - The scenario type to create
29
+ * @param client - MCP client for memory operations
30
+ * @returns Scenario instance
31
+ * @throws Error if scenario type is not supported
32
+ */
33
+ export declare function createScenario(type: ScenarioType, client: MCPClient): BenchmarkScenario;
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/benchmark/scenarios/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC5F,YAAY,EACV,qBAAqB,EACrB,qBAAqB,EACrB,SAAS,GACV,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAA+B,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE7E;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wBAAwB;IACxB,OAAO,IAAI,YAAY,CAAC;IAExB,+BAA+B;IAC/B,cAAc,IAAI,MAAM,CAAC;IAEzB,yBAAyB;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,0CAA0C;IAC1C,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEpD,8BAA8B;IAC9B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,SAAS,GAChB,iBAAiB,CAoBnB"}