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,196 @@
1
+ /**
2
+ * Metrics Collector for Scientific Benchmarks
3
+ *
4
+ * Real-time collection and aggregation of benchmark metrics.
5
+ * Provides accurate latency measurement, token estimation, and quality evaluation.
6
+ */
7
+ import { mean, percentile, standardDeviation } from "./statistics.js";
8
+ /**
9
+ * Error class for metrics collection errors
10
+ */
11
+ export class MetricsCollectorError extends Error {
12
+ constructor(message) {
13
+ super(message);
14
+ this.name = "MetricsCollectorError";
15
+ }
16
+ }
17
+ /**
18
+ * Create a new metrics collector
19
+ */
20
+ export function createMetricsCollector() {
21
+ const metrics = [];
22
+ return {
23
+ record(snapshot) {
24
+ metrics.push(snapshot);
25
+ },
26
+ getMetrics() {
27
+ // Return a copy to maintain immutability
28
+ return [...metrics];
29
+ },
30
+ getCount() {
31
+ return metrics.length;
32
+ },
33
+ clear() {
34
+ metrics.length = 0;
35
+ },
36
+ aggregate() {
37
+ if (metrics.length === 0) {
38
+ throw new MetricsCollectorError("Cannot aggregate empty metrics");
39
+ }
40
+ return aggregateMetrics(metrics);
41
+ },
42
+ };
43
+ }
44
+ /**
45
+ * Measure the latency of a function execution
46
+ *
47
+ * @param fn - Function to measure (can be sync or async)
48
+ * @returns Object containing the result and latency in milliseconds
49
+ */
50
+ export async function measureLatency(fn) {
51
+ const start = performance.now();
52
+ try {
53
+ const result = await fn();
54
+ const latencyMs = performance.now() - start;
55
+ return { result, latencyMs };
56
+ }
57
+ catch (error) {
58
+ // Re-throw to propagate errors
59
+ throw error;
60
+ }
61
+ }
62
+ /**
63
+ * Estimate the number of tokens in a text string
64
+ *
65
+ * Uses a heuristic approximation:
66
+ * - English prose: ~4 characters per token
67
+ * - Code: ~3 characters per token (more punctuation)
68
+ * - Mixed: ~3.5 characters per token
69
+ *
70
+ * @param text - The text to estimate tokens for
71
+ * @param contentType - Optional hint about content type
72
+ * @returns Estimated token count
73
+ */
74
+ export function estimateTokens(text, contentType = "mixed") {
75
+ if (!text || text.trim().length === 0) {
76
+ return 0;
77
+ }
78
+ // Clean up text
79
+ const cleanText = text.trim();
80
+ // Characters per token varies by content type
81
+ let charsPerToken;
82
+ switch (contentType) {
83
+ case "code":
84
+ charsPerToken = 3.0; // Code has more special chars = more tokens
85
+ break;
86
+ case "prose":
87
+ charsPerToken = 4.0; // English prose averages ~4 chars per token
88
+ break;
89
+ case "mixed":
90
+ default:
91
+ charsPerToken = 3.5;
92
+ }
93
+ // Basic estimation
94
+ const basicEstimate = cleanText.length / charsPerToken;
95
+ // Adjust for word boundaries (whitespace indicates token boundaries)
96
+ const wordCount = cleanText.split(/\s+/).filter((w) => w.length > 0).length;
97
+ // Adjust for punctuation (often separate tokens)
98
+ const punctuationCount = (cleanText.match(/[.,!?;:'"()\[\]{}]/g) || []).length;
99
+ // Combine estimates with weights
100
+ const weightedEstimate = basicEstimate * 0.6 + wordCount * 0.3 + punctuationCount * 0.1;
101
+ return Math.round(weightedEstimate);
102
+ }
103
+ /**
104
+ * Evaluate the quality of a response against expected content
105
+ *
106
+ * @param actual - The actual response
107
+ * @param expected - Expected response (string) or keywords (array)
108
+ * @param options - Evaluation options
109
+ * @returns Quality score from 0.0 to 1.0
110
+ */
111
+ export function evaluateResponseQuality(actual, expected, options = {}) {
112
+ const { mode = "similarity" } = options;
113
+ if (!actual || actual.trim().length === 0) {
114
+ return 0.0;
115
+ }
116
+ const actualLower = actual.toLowerCase().trim();
117
+ // Keyword matching mode
118
+ if (mode === "keywords" && Array.isArray(expected)) {
119
+ const keywordsFound = expected.filter((keyword) => actualLower.includes(keyword.toLowerCase())).length;
120
+ return keywordsFound / expected.length;
121
+ }
122
+ // Similarity mode
123
+ const expectedStr = Array.isArray(expected) ? expected.join(" ") : expected;
124
+ const expectedLower = expectedStr.toLowerCase().trim();
125
+ // Exact match
126
+ if (actualLower === expectedLower) {
127
+ return 1.0;
128
+ }
129
+ // Calculate word overlap (Jaccard-like similarity)
130
+ const actualWords = new Set(actualLower.split(/\s+/).filter((w) => w.length > 2));
131
+ const expectedWords = new Set(expectedLower.split(/\s+/).filter((w) => w.length > 2));
132
+ if (actualWords.size === 0 || expectedWords.size === 0) {
133
+ return actualWords.size === expectedWords.size ? 1.0 : 0.0;
134
+ }
135
+ // Count intersection
136
+ let intersection = 0;
137
+ for (const word of actualWords) {
138
+ if (expectedWords.has(word)) {
139
+ intersection++;
140
+ }
141
+ }
142
+ // Jaccard similarity: intersection / union
143
+ const union = actualWords.size + expectedWords.size - intersection;
144
+ const jaccard = intersection / union;
145
+ // Also check for substring inclusion (important for factual responses)
146
+ let substringBonus = 0;
147
+ if (actualLower.includes(expectedLower) || expectedLower.includes(actualLower)) {
148
+ substringBonus = 0.3;
149
+ }
150
+ // Combine metrics
151
+ return Math.min(1.0, jaccard + substringBonus);
152
+ }
153
+ /**
154
+ * Aggregate an array of metrics snapshots into summary statistics
155
+ *
156
+ * @param metrics - Array of metrics snapshots
157
+ * @returns Aggregated metrics
158
+ * @throws MetricsCollectorError if metrics array is empty
159
+ */
160
+ export function aggregateMetrics(metrics) {
161
+ if (metrics.length === 0) {
162
+ throw new MetricsCollectorError("Cannot aggregate empty metrics");
163
+ }
164
+ // Extract latencies
165
+ const latencies = metrics.map((m) => m.latencyMs);
166
+ // Calculate latency percentiles
167
+ const latencyP50 = percentile(latencies, 50);
168
+ const latencyP95 = percentile(latencies, 95);
169
+ const latencyP99 = percentile(latencies, 99);
170
+ const latencyMean = mean(latencies);
171
+ const latencyStdDev = latencies.length >= 2 ? standardDeviation(latencies, true) : 0;
172
+ // Calculate memory hit rate
173
+ const memoryHits = metrics.filter((m) => m.memoryHit).length;
174
+ const memoryHitRate = memoryHits / metrics.length;
175
+ // Calculate average tokens if available
176
+ const tokensValues = metrics
177
+ .filter((m) => m.tokensUsed !== undefined)
178
+ .map((m) => m.tokensUsed);
179
+ const avgTokens = tokensValues.length > 0 ? Math.round(mean(tokensValues)) : undefined;
180
+ // Calculate average accuracy if available
181
+ const accuracyValues = metrics
182
+ .filter((m) => m.retrievalAccuracy !== undefined)
183
+ .map((m) => m.retrievalAccuracy);
184
+ const avgAccuracy = accuracyValues.length > 0 ? mean(accuracyValues) : undefined;
185
+ return {
186
+ latencyP50,
187
+ latencyP95,
188
+ latencyP99,
189
+ latencyMean,
190
+ latencyStdDev,
191
+ memoryHitRate,
192
+ avgTokens,
193
+ avgAccuracy,
194
+ };
195
+ }
196
+ //# sourceMappingURL=metrics-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-collector.js","sourceRoot":"","sources":["../../src/benchmark/metrics-collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Report Generator for Scientific Benchmarks
3
+ *
4
+ * Generates comprehensive markdown reports from benchmark results.
5
+ * Includes statistical analysis, comparisons, and visualizations.
6
+ */
7
+ import type { BenchmarkResult, ComparisonResult, BenchmarkSummary } from "./types.js";
8
+ /**
9
+ * Generate a complete markdown report from benchmark results
10
+ *
11
+ * @param result - The benchmark result to report on
12
+ * @returns Markdown string
13
+ */
14
+ export declare function generateMarkdownReport(result: BenchmarkResult): string;
15
+ /**
16
+ * Generate summary table
17
+ */
18
+ export declare function generateSummaryTable(summary: BenchmarkSummary): string;
19
+ /**
20
+ * Generate comparison section for a scenario
21
+ */
22
+ export declare function generateComparisonSection(comparison: ComparisonResult): string;
23
+ /**
24
+ * Format a number with optional decimal places and thousand separators
25
+ */
26
+ export declare function formatNumber(value: number, decimals?: number): string;
27
+ /**
28
+ * Format a percentage with sign
29
+ */
30
+ export declare function formatPercentage(value: number): string;
31
+ /**
32
+ * Format duration in human-readable format
33
+ */
34
+ export declare function formatDuration(ms: number): string;
35
+ //# sourceMappingURL=report-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-generator.d.ts","sourceRoot":"","sources":["../../src/benchmark/report-generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAGpB;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAiDtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAatE;AA2BD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,CA2D9E;AAwDD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAKxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAStD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAUjD"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Report Generator for Scientific Benchmarks
3
+ *
4
+ * Generates comprehensive markdown reports from benchmark results.
5
+ * Includes statistical analysis, comparisons, and visualizations.
6
+ */
7
+ import { SCENARIO_DESCRIPTIONS } from "./types.js";
8
+ /**
9
+ * Generate a complete markdown report from benchmark results
10
+ *
11
+ * @param result - The benchmark result to report on
12
+ * @returns Markdown string
13
+ */
14
+ export function generateMarkdownReport(result) {
15
+ const sections = [];
16
+ // Title
17
+ sections.push("# Vesper Benchmark Report\n");
18
+ // Timestamp
19
+ const timestamp = new Date(result.endTime).toISOString();
20
+ sections.push(`**Generated:** ${timestamp}\n`);
21
+ sections.push(`**Benchmark ID:** ${result.id}\n`);
22
+ sections.push(`**Duration:** ${formatDuration(result.endTime - result.startTime)}\n`);
23
+ sections.push("");
24
+ // Summary
25
+ sections.push("## Summary\n");
26
+ sections.push(generateSummaryTable(result.summary));
27
+ sections.push("");
28
+ // Overall conclusion
29
+ sections.push(generateConclusion(result.summary));
30
+ sections.push("");
31
+ // Detailed comparisons
32
+ sections.push("## Scenario Results\n");
33
+ for (const comparison of result.comparisons) {
34
+ sections.push(generateComparisonSection(comparison));
35
+ sections.push("");
36
+ }
37
+ // Configuration
38
+ sections.push("## Configuration\n");
39
+ sections.push(generateConfigSection(result));
40
+ sections.push("");
41
+ // Metadata
42
+ sections.push("## Metadata\n");
43
+ sections.push(generateMetadataSection(result));
44
+ sections.push("");
45
+ // Footer
46
+ sections.push("---\n");
47
+ sections.push("*Report generated by Vesper Scientific Benchmark System*\n");
48
+ sections.push("*Run benchmarks yourself: `npm run benchmark:scientific`*\n");
49
+ return sections.join("\n");
50
+ }
51
+ /**
52
+ * Generate summary table
53
+ */
54
+ export function generateSummaryTable(summary) {
55
+ const rows = [
56
+ ["Metric", "Value"],
57
+ ["---", "---"],
58
+ ["Total Scenarios", String(summary.totalScenarios)],
59
+ ["Vesper Wins", String(summary.vesperWins)],
60
+ ["Disabled Wins", String(summary.disabledWins)],
61
+ ["Ties", String(summary.ties)],
62
+ ["Overall Improvement", formatPercentage(summary.overallImprovement)],
63
+ ["Statistically Significant", summary.statisticallySignificant ? "Yes" : "No"],
64
+ ];
65
+ return rows.map((row) => `| ${row.join(" | ")} |`).join("\n");
66
+ }
67
+ /**
68
+ * Generate conclusion based on summary
69
+ */
70
+ function generateConclusion(summary) {
71
+ const winRate = (summary.vesperWins / summary.totalScenarios) * 100;
72
+ let conclusion = "### Conclusion\n\n";
73
+ if (winRate >= 80 && summary.statisticallySignificant) {
74
+ conclusion += `Vesper demonstrates **strong, statistically significant improvements** across ${summary.vesperWins}/${summary.totalScenarios} scenarios. `;
75
+ conclusion += `Average improvement of ${formatPercentage(summary.overallImprovement)}.\n`;
76
+ }
77
+ else if (winRate >= 60) {
78
+ conclusion += `Vesper shows **moderate improvements** in ${summary.vesperWins}/${summary.totalScenarios} scenarios. `;
79
+ conclusion += `Further testing recommended to confirm statistical significance.\n`;
80
+ }
81
+ else if (winRate >= 40) {
82
+ conclusion += `Results are **mixed**, with Vesper winning ${summary.vesperWins}/${summary.totalScenarios} scenarios. `;
83
+ conclusion += `Consider scenario-specific optimizations.\n`;
84
+ }
85
+ else {
86
+ conclusion += `Vesper shows **limited improvement** in current configuration. `;
87
+ conclusion += `Review implementation and test methodology.\n`;
88
+ }
89
+ return conclusion;
90
+ }
91
+ /**
92
+ * Generate comparison section for a scenario
93
+ */
94
+ export function generateComparisonSection(comparison) {
95
+ const sections = [];
96
+ // Scenario header
97
+ const scenarioName = comparison.scenarioType.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
98
+ sections.push(`### ${scenarioName}\n`);
99
+ // Description
100
+ const description = SCENARIO_DESCRIPTIONS[comparison.scenarioType] || "";
101
+ if (description) {
102
+ sections.push(`*${description}*\n`);
103
+ }
104
+ // Winner badge
105
+ const winnerText = comparison.winner === "vesper-enabled"
106
+ ? "**Winner: Vesper Enabled**"
107
+ : comparison.winner === "vesper-disabled"
108
+ ? "**Winner: Vesper Disabled**"
109
+ : "**Result: Tie**";
110
+ sections.push(winnerText + "\n");
111
+ // Latency comparison table
112
+ sections.push("#### Latency (ms)\n");
113
+ sections.push("| Metric | Vesper Enabled | Vesper Disabled | Improvement |");
114
+ sections.push("| --- | --- | --- | --- |");
115
+ sections.push(`| P50 | ${formatNumber(comparison.enabledResult.aggregates.latencyP50, 1)} | ${formatNumber(comparison.disabledResult.aggregates.latencyP50, 1)} | ${calculateImprovementText(comparison.enabledResult.aggregates.latencyP50, comparison.disabledResult.aggregates.latencyP50)} |`);
116
+ sections.push(`| P95 | ${formatNumber(comparison.enabledResult.aggregates.latencyP95, 1)} | ${formatNumber(comparison.disabledResult.aggregates.latencyP95, 1)} | ${calculateImprovementText(comparison.enabledResult.aggregates.latencyP95, comparison.disabledResult.aggregates.latencyP95)} |`);
117
+ sections.push(`| P99 | ${formatNumber(comparison.enabledResult.aggregates.latencyP99, 1)} | ${formatNumber(comparison.disabledResult.aggregates.latencyP99, 1)} | ${calculateImprovementText(comparison.enabledResult.aggregates.latencyP99, comparison.disabledResult.aggregates.latencyP99)} |`);
118
+ sections.push("");
119
+ // Memory hit rate
120
+ if (comparison.enabledResult.aggregates.memoryHitRate !== undefined ||
121
+ comparison.disabledResult.aggregates.memoryHitRate !== undefined) {
122
+ const enabledHitRate = comparison.enabledResult.aggregates.memoryHitRate ?? 0;
123
+ const disabledHitRate = comparison.disabledResult.aggregates.memoryHitRate ?? 0;
124
+ sections.push(`**Memory Hit Rate:** Enabled: ${formatPercentage(enabledHitRate * 100)}, Disabled: ${formatPercentage(disabledHitRate * 100)}\n`);
125
+ }
126
+ // Statistical analysis
127
+ sections.push("#### Statistical Analysis\n");
128
+ const stats = comparison.statistics;
129
+ sections.push(`- **Latency Improvement:** ${formatPercentage(stats.latencyImprovement)}`);
130
+ sections.push(`- **t-test statistic:** ${formatNumber(stats.tTestResult.tStatistic, 3)}`);
131
+ sections.push(`- **p-value:** ${formatNumber(stats.tTestResult.pValue, 4)}`);
132
+ sections.push(`- **Significant (p < ${stats.tTestResult.alpha}):** ${stats.tTestResult.significant ? "Yes" : "No"}`);
133
+ sections.push(`- **Cohen's d:** ${formatNumber(stats.effectSize.cohensD, 3)} (${stats.effectSize.interpretation})`);
134
+ sections.push("");
135
+ return sections.join("\n");
136
+ }
137
+ /**
138
+ * Calculate improvement text for a metric
139
+ */
140
+ function calculateImprovementText(enabled, disabled) {
141
+ if (disabled === 0)
142
+ return "N/A";
143
+ const improvement = ((disabled - enabled) / disabled) * 100;
144
+ return formatPercentage(improvement);
145
+ }
146
+ /**
147
+ * Generate configuration section
148
+ */
149
+ function generateConfigSection(result) {
150
+ const config = result.config;
151
+ const rows = [
152
+ ["Setting", "Value"],
153
+ ["---", "---"],
154
+ ["Warmup Runs", String(config.warmupRuns)],
155
+ ["Measurement Runs", String(config.measurementRuns)],
156
+ ["Timeout (ms)", String(config.timeoutMs)],
157
+ ["Significance Level (alpha)", String(config.significanceLevel)],
158
+ ["Scenarios", config.scenarios.join(", ")],
159
+ ["Output Directory", config.outputDirectory],
160
+ ];
161
+ return rows.map((row) => `| ${row.join(" | ")} |`).join("\n");
162
+ }
163
+ /**
164
+ * Generate metadata section
165
+ */
166
+ function generateMetadataSection(result) {
167
+ const meta = result.metadata;
168
+ const rows = [
169
+ ["Property", "Value"],
170
+ ["---", "---"],
171
+ ["Version", meta.version],
172
+ ["Environment", meta.environment],
173
+ ];
174
+ if (meta.hostname) {
175
+ rows.push(["Hostname", meta.hostname]);
176
+ }
177
+ if (meta.nodeVersion) {
178
+ rows.push(["Node Version", meta.nodeVersion]);
179
+ }
180
+ return rows.map((row) => `| ${row.join(" | ")} |`).join("\n");
181
+ }
182
+ // =============================================================================
183
+ // Formatting Helper Functions
184
+ // =============================================================================
185
+ /**
186
+ * Format a number with optional decimal places and thousand separators
187
+ */
188
+ export function formatNumber(value, decimals = 0) {
189
+ if (decimals === 0) {
190
+ return value.toLocaleString("en-US", { maximumFractionDigits: 0 });
191
+ }
192
+ return value.toFixed(decimals);
193
+ }
194
+ /**
195
+ * Format a percentage with sign
196
+ */
197
+ export function formatPercentage(value) {
198
+ const formatted = value.toFixed(1);
199
+ if (value > 0) {
200
+ return `+${formatted}%`;
201
+ }
202
+ if (value < 0) {
203
+ return `${formatted}%`;
204
+ }
205
+ return `${formatted}%`;
206
+ }
207
+ /**
208
+ * Format duration in human-readable format
209
+ */
210
+ export function formatDuration(ms) {
211
+ if (ms < 1000) {
212
+ return `${ms}ms`;
213
+ }
214
+ if (ms < 60000) {
215
+ return `${(ms / 1000).toFixed(1)}s`;
216
+ }
217
+ const minutes = Math.floor(ms / 60000);
218
+ const seconds = Math.floor((ms % 60000) / 1000);
219
+ return `${minutes}m ${seconds}s`;
220
+ }
221
+ //# sourceMappingURL=report-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-generator.js","sourceRoot":"","sources":["../../src/benchmark/report-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
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 type { BenchmarkConfig, BenchmarkResult, ScenarioResult, StatisticalComparison } from "./types.js";
8
+ import { MCPClient } from "./scenarios/index.js";
9
+ /**
10
+ * Benchmark runner interface
11
+ */
12
+ export interface BenchmarkRunner {
13
+ /** Get current configuration */
14
+ getConfig(): BenchmarkConfig;
15
+ /** Run all benchmarks */
16
+ run(): Promise<BenchmarkResult>;
17
+ }
18
+ /**
19
+ * Create a benchmark runner
20
+ *
21
+ * @param client - MCP client for memory operations
22
+ * @param config - Benchmark configuration
23
+ * @returns BenchmarkRunner instance
24
+ */
25
+ export declare function createBenchmarkRunner(client: MCPClient, config: BenchmarkConfig): BenchmarkRunner;
26
+ /**
27
+ * Compare two scenario results statistically
28
+ */
29
+ export declare function comparePhasesStatistically(enabledResult: ScenarioResult, disabledResult: ScenarioResult, alpha: number): StatisticalComparison;
30
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/benchmark/runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,cAAc,EAEd,qBAAqB,EAItB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAkB,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIjE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,SAAS,IAAI,eAAe,CAAC;IAE7B,yBAAyB;IACzB,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;CACjC;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,eAAe,GACtB,eAAe,CAsDjB;AA2HD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,cAAc,EAC7B,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE,MAAM,GACZ,qBAAqB,CAgFvB"}