tea-rags 1.18.0 → 1.19.1

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/benchmarks/benchmark-embeddings.mjs +148 -0
  2. package/benchmarks/lib/benchmarks.mjs +726 -0
  3. package/benchmarks/lib/cleanup.mjs +40 -0
  4. package/benchmarks/lib/colors.mjs +52 -0
  5. package/benchmarks/lib/config.mjs +115 -0
  6. package/benchmarks/lib/embedding-calibration.mjs +508 -0
  7. package/benchmarks/lib/estimator.mjs +93 -0
  8. package/benchmarks/lib/files.mjs +94 -0
  9. package/benchmarks/lib/output.mjs +218 -0
  10. package/benchmarks/lib/provider.mjs +66 -0
  11. package/benchmarks/lib/smart-stepping.mjs +186 -0
  12. package/benchmarks/lib/stopping.mjs +79 -0
  13. package/benchmarks/tune.mjs +753 -0
  14. package/build/core/adapters/embeddings/ollama.d.ts +4 -1
  15. package/build/core/adapters/embeddings/ollama.d.ts.map +1 -1
  16. package/build/core/adapters/embeddings/ollama.js +16 -3
  17. package/build/core/adapters/embeddings/ollama.js.map +1 -1
  18. package/build/core/adapters/embeddings/onnx/daemon-types.d.ts +2 -0
  19. package/build/core/adapters/embeddings/onnx/daemon-types.d.ts.map +1 -1
  20. package/build/core/adapters/embeddings/onnx/daemon-types.js.map +1 -1
  21. package/build/core/adapters/embeddings/onnx/daemon.d.ts +2 -0
  22. package/build/core/adapters/embeddings/onnx/daemon.d.ts.map +1 -1
  23. package/build/core/adapters/embeddings/onnx/daemon.js +9 -0
  24. package/build/core/adapters/embeddings/onnx/daemon.js.map +1 -1
  25. package/build/core/adapters/embeddings/onnx/worker-types.d.ts +2 -0
  26. package/build/core/adapters/embeddings/onnx/worker-types.d.ts.map +1 -1
  27. package/build/core/adapters/embeddings/onnx/worker.js +12 -2
  28. package/build/core/adapters/embeddings/onnx/worker.js.map +1 -1
  29. package/build/core/adapters/embeddings/onnx.d.ts +6 -0
  30. package/build/core/adapters/embeddings/onnx.d.ts.map +1 -1
  31. package/build/core/adapters/embeddings/onnx.js +19 -0
  32. package/build/core/adapters/embeddings/onnx.js.map +1 -1
  33. package/build/core/adapters/git/client.js +2 -2
  34. package/build/core/adapters/git/client.js.map +1 -1
  35. package/build/core/adapters/git/parsers.d.ts +1 -1
  36. package/build/core/adapters/git/parsers.d.ts.map +1 -1
  37. package/build/core/adapters/git/parsers.js +17 -13
  38. package/build/core/adapters/git/parsers.js.map +1 -1
  39. package/build/core/adapters/git/types.d.ts +1 -0
  40. package/build/core/adapters/git/types.d.ts.map +1 -1
  41. package/build/core/adapters/qdrant/client.d.ts +2 -0
  42. package/build/core/adapters/qdrant/client.d.ts.map +1 -1
  43. package/build/core/adapters/qdrant/client.js +19 -2
  44. package/build/core/adapters/qdrant/client.js.map +1 -1
  45. package/build/core/api/internal/facades/explore-facade.d.ts +3 -1
  46. package/build/core/api/internal/facades/explore-facade.d.ts.map +1 -1
  47. package/build/core/api/internal/facades/explore-facade.js +51 -6
  48. package/build/core/api/internal/facades/explore-facade.js.map +1 -1
  49. package/build/core/api/public/app.d.ts.map +1 -1
  50. package/build/core/api/public/app.js +1 -0
  51. package/build/core/api/public/app.js.map +1 -1
  52. package/build/core/api/public/dto/explore.d.ts +9 -1
  53. package/build/core/api/public/dto/explore.d.ts.map +1 -1
  54. package/build/core/api/public/dto/sanitize.js +1 -1
  55. package/build/core/api/public/dto/sanitize.js.map +1 -1
  56. package/build/core/domains/explore/chunk-grouping/code.d.ts +20 -0
  57. package/build/core/domains/explore/chunk-grouping/code.d.ts.map +1 -0
  58. package/build/core/domains/explore/chunk-grouping/code.js +101 -0
  59. package/build/core/domains/explore/chunk-grouping/code.js.map +1 -0
  60. package/build/core/domains/explore/chunk-grouping/doc.d.ts +15 -0
  61. package/build/core/domains/explore/chunk-grouping/doc.d.ts.map +1 -0
  62. package/build/core/domains/explore/chunk-grouping/doc.js +65 -0
  63. package/build/core/domains/explore/chunk-grouping/doc.js.map +1 -0
  64. package/build/core/domains/explore/chunk-grouping/index.d.ts +4 -0
  65. package/build/core/domains/explore/chunk-grouping/index.d.ts.map +1 -0
  66. package/build/core/domains/explore/chunk-grouping/index.js +3 -0
  67. package/build/core/domains/explore/chunk-grouping/index.js.map +1 -0
  68. package/build/core/domains/explore/chunk-grouping/types.d.ts +5 -0
  69. package/build/core/domains/explore/chunk-grouping/types.d.ts.map +1 -0
  70. package/build/core/domains/explore/chunk-grouping/types.js +2 -0
  71. package/build/core/domains/explore/chunk-grouping/types.js.map +1 -0
  72. package/build/core/domains/explore/index.d.ts +2 -0
  73. package/build/core/domains/explore/index.d.ts.map +1 -1
  74. package/build/core/domains/explore/index.js +1 -0
  75. package/build/core/domains/explore/index.js.map +1 -1
  76. package/build/core/domains/explore/post-process.d.ts.map +1 -1
  77. package/build/core/domains/explore/post-process.js +18 -8
  78. package/build/core/domains/explore/post-process.js.map +1 -1
  79. package/build/core/domains/explore/reranker.d.ts +2 -0
  80. package/build/core/domains/explore/reranker.d.ts.map +1 -1
  81. package/build/core/domains/explore/reranker.js +4 -0
  82. package/build/core/domains/explore/reranker.js.map +1 -1
  83. package/build/core/domains/explore/symbol-resolve.d.ts +2 -6
  84. package/build/core/domains/explore/symbol-resolve.d.ts.map +1 -1
  85. package/build/core/domains/explore/symbol-resolve.js +31 -17
  86. package/build/core/domains/explore/symbol-resolve.js.map +1 -1
  87. package/build/core/domains/ingest/pipeline/chunker/hooks/markdown/chunker.js +3 -3
  88. package/build/core/domains/ingest/pipeline/chunker/hooks/markdown/chunker.js.map +1 -1
  89. package/build/core/domains/ingest/pipeline/chunker/hooks/ruby/rspec-scope-chunker.js +5 -5
  90. package/build/core/domains/ingest/pipeline/chunker/hooks/ruby/rspec-scope-chunker.js.map +1 -1
  91. package/build/core/domains/ingest/pipeline/chunker/hooks/types.d.ts +4 -2
  92. package/build/core/domains/ingest/pipeline/chunker/hooks/types.d.ts.map +1 -1
  93. package/build/core/domains/ingest/pipeline/chunker/hooks/types.js.map +1 -1
  94. package/build/core/domains/ingest/pipeline/chunker/tree-sitter.d.ts +8 -2
  95. package/build/core/domains/ingest/pipeline/chunker/tree-sitter.d.ts.map +1 -1
  96. package/build/core/domains/ingest/pipeline/chunker/tree-sitter.js +28 -12
  97. package/build/core/domains/ingest/pipeline/chunker/tree-sitter.js.map +1 -1
  98. package/build/core/domains/ingest/pipeline/file-processor.d.ts.map +1 -1
  99. package/build/core/domains/ingest/pipeline/file-processor.js +2 -1
  100. package/build/core/domains/ingest/pipeline/file-processor.js.map +1 -1
  101. package/build/core/domains/ingest/pipeline/types.d.ts +1 -1
  102. package/build/core/domains/ingest/pipeline/types.d.ts.map +1 -1
  103. package/build/core/domains/ingest/sync/deletion-strategy.d.ts.map +1 -1
  104. package/build/core/domains/ingest/sync/deletion-strategy.js +3 -7
  105. package/build/core/domains/ingest/sync/deletion-strategy.js.map +1 -1
  106. package/build/core/domains/trajectory/git/infra/chunk-reader.d.ts.map +1 -1
  107. package/build/core/domains/trajectory/git/infra/chunk-reader.js +73 -45
  108. package/build/core/domains/trajectory/git/infra/chunk-reader.js.map +1 -1
  109. package/build/core/domains/trajectory/git/infra/file-reader.js +1 -1
  110. package/build/core/domains/trajectory/git/infra/file-reader.js.map +1 -1
  111. package/build/core/domains/trajectory/git/infra/merge-branch-resolver.d.ts +20 -0
  112. package/build/core/domains/trajectory/git/infra/merge-branch-resolver.d.ts.map +1 -0
  113. package/build/core/domains/trajectory/git/infra/merge-branch-resolver.js +64 -0
  114. package/build/core/domains/trajectory/git/infra/merge-branch-resolver.js.map +1 -0
  115. package/build/core/domains/trajectory/git/infra/metrics/extractors.d.ts +3 -1
  116. package/build/core/domains/trajectory/git/infra/metrics/extractors.d.ts.map +1 -1
  117. package/build/core/domains/trajectory/git/infra/metrics/extractors.js +6 -3
  118. package/build/core/domains/trajectory/git/infra/metrics/extractors.js.map +1 -1
  119. package/build/core/domains/trajectory/git/infra/metrics/file-assembler.d.ts +1 -1
  120. package/build/core/domains/trajectory/git/infra/metrics/file-assembler.d.ts.map +1 -1
  121. package/build/core/domains/trajectory/git/infra/metrics/file-assembler.js +5 -2
  122. package/build/core/domains/trajectory/git/infra/metrics/file-assembler.js.map +1 -1
  123. package/build/core/domains/trajectory/git/infra/metrics.d.ts +14 -3
  124. package/build/core/domains/trajectory/git/infra/metrics.d.ts.map +1 -1
  125. package/build/core/domains/trajectory/git/infra/metrics.js +63 -6
  126. package/build/core/domains/trajectory/git/infra/metrics.js.map +1 -1
  127. package/build/core/domains/trajectory/git/infra/offset-tracker.d.ts +40 -0
  128. package/build/core/domains/trajectory/git/infra/offset-tracker.d.ts.map +1 -0
  129. package/build/core/domains/trajectory/git/infra/offset-tracker.js +66 -0
  130. package/build/core/domains/trajectory/git/infra/offset-tracker.js.map +1 -0
  131. package/build/core/domains/trajectory/git/payload-signals.d.ts.map +1 -1
  132. package/build/core/domains/trajectory/git/payload-signals.js +6 -0
  133. package/build/core/domains/trajectory/git/payload-signals.js.map +1 -1
  134. package/build/core/domains/trajectory/git/provider.d.ts +2 -0
  135. package/build/core/domains/trajectory/git/provider.d.ts.map +1 -1
  136. package/build/core/domains/trajectory/git/provider.js +13 -1
  137. package/build/core/domains/trajectory/git/provider.js.map +1 -1
  138. package/build/core/domains/trajectory/git/rerank/derived-signals/bug-fix.d.ts.map +1 -1
  139. package/build/core/domains/trajectory/git/rerank/derived-signals/bug-fix.js +1 -1
  140. package/build/core/domains/trajectory/git/rerank/derived-signals/bug-fix.js.map +1 -1
  141. package/build/core/domains/trajectory/git/rerank/presets/dangerous.d.ts +23 -0
  142. package/build/core/domains/trajectory/git/rerank/presets/dangerous.d.ts.map +1 -0
  143. package/build/core/domains/trajectory/git/rerank/presets/dangerous.js +31 -0
  144. package/build/core/domains/trajectory/git/rerank/presets/dangerous.js.map +1 -0
  145. package/build/core/domains/trajectory/git/rerank/presets/index.d.ts +2 -0
  146. package/build/core/domains/trajectory/git/rerank/presets/index.d.ts.map +1 -1
  147. package/build/core/domains/trajectory/git/rerank/presets/index.js +6 -0
  148. package/build/core/domains/trajectory/git/rerank/presets/index.js.map +1 -1
  149. package/build/core/domains/trajectory/git/rerank/presets/proven.d.ts +26 -0
  150. package/build/core/domains/trajectory/git/rerank/presets/proven.d.ts.map +1 -0
  151. package/build/core/domains/trajectory/git/rerank/presets/proven.js +33 -0
  152. package/build/core/domains/trajectory/git/rerank/presets/proven.js.map +1 -0
  153. package/build/core/domains/trajectory/git/rerank/presets/refactoring.d.ts +2 -2
  154. package/build/core/domains/trajectory/git/rerank/presets/refactoring.d.ts.map +1 -1
  155. package/build/core/domains/trajectory/git/rerank/presets/refactoring.js +2 -2
  156. package/build/core/domains/trajectory/git/rerank/presets/refactoring.js.map +1 -1
  157. package/build/core/domains/trajectory/git/types.d.ts +2 -0
  158. package/build/core/domains/trajectory/git/types.d.ts.map +1 -1
  159. package/build/core/domains/trajectory/static/filters.d.ts.map +1 -1
  160. package/build/core/domains/trajectory/static/filters.js +12 -0
  161. package/build/core/domains/trajectory/static/filters.js.map +1 -1
  162. package/build/core/domains/trajectory/static/payload-signals.d.ts.map +1 -1
  163. package/build/core/domains/trajectory/static/payload-signals.js +6 -1
  164. package/build/core/domains/trajectory/static/payload-signals.js.map +1 -1
  165. package/build/core/domains/trajectory/static/provider.d.ts.map +1 -1
  166. package/build/core/domains/trajectory/static/provider.js +7 -2
  167. package/build/core/domains/trajectory/static/provider.js.map +1 -1
  168. package/build/core/domains/trajectory/static/rerank/presets/decomposition.d.ts +2 -2
  169. package/build/core/domains/trajectory/static/rerank/presets/decomposition.d.ts.map +1 -1
  170. package/build/core/domains/trajectory/static/rerank/presets/decomposition.js +2 -2
  171. package/build/core/domains/trajectory/static/rerank/presets/decomposition.js.map +1 -1
  172. package/build/core/domains/trajectory/static/test-detection.d.ts +6 -0
  173. package/build/core/domains/trajectory/static/test-detection.d.ts.map +1 -0
  174. package/build/core/domains/trajectory/static/test-detection.js +31 -0
  175. package/build/core/domains/trajectory/static/test-detection.js.map +1 -0
  176. package/build/core/infra/migration/adapters/index-store-adapter.d.ts +9 -0
  177. package/build/core/infra/migration/adapters/index-store-adapter.d.ts.map +1 -1
  178. package/build/core/infra/migration/adapters/index-store-adapter.js +9 -0
  179. package/build/core/infra/migration/adapters/index-store-adapter.js.map +1 -1
  180. package/build/core/infra/migration/schema-migrator.d.ts.map +1 -1
  181. package/build/core/infra/migration/schema-migrator.js +2 -1
  182. package/build/core/infra/migration/schema-migrator.js.map +1 -1
  183. package/build/core/infra/migration/schema_migrations/index.d.ts +1 -0
  184. package/build/core/infra/migration/schema_migrations/index.d.ts.map +1 -1
  185. package/build/core/infra/migration/schema_migrations/index.js +1 -0
  186. package/build/core/infra/migration/schema_migrations/index.js.map +1 -1
  187. package/build/core/infra/migration/schema_migrations/schema-v11-rename-parent-symbol-id.d.ts +19 -0
  188. package/build/core/infra/migration/schema_migrations/schema-v11-rename-parent-symbol-id.d.ts.map +1 -0
  189. package/build/core/infra/migration/schema_migrations/schema-v11-rename-parent-symbol-id.js +44 -0
  190. package/build/core/infra/migration/schema_migrations/schema-v11-rename-parent-symbol-id.js.map +1 -0
  191. package/build/core/infra/migration/types.d.ts +12 -0
  192. package/build/core/infra/migration/types.d.ts.map +1 -1
  193. package/build/core/types.d.ts +1 -1
  194. package/build/core/types.d.ts.map +1 -1
  195. package/build/mcp/resources/registry.d.ts +2 -1
  196. package/build/mcp/resources/registry.d.ts.map +1 -1
  197. package/build/mcp/resources/registry.js +70 -58
  198. package/build/mcp/resources/registry.js.map +1 -1
  199. package/build/mcp/tools/explore.d.ts.map +1 -1
  200. package/build/mcp/tools/explore.js +6 -4
  201. package/build/mcp/tools/explore.js.map +1 -1
  202. package/build/mcp/tools/schemas.d.ts +22 -1
  203. package/build/mcp/tools/schemas.d.ts.map +1 -1
  204. package/build/mcp/tools/schemas.js +14 -1
  205. package/build/mcp/tools/schemas.js.map +1 -1
  206. package/package.json +2 -1
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Embedding Diagnostic Benchmark
4
+ *
5
+ * Automatically calibrates EMBEDDING_BATCH_SIZE and EMBEDDING_CONCURRENCY
6
+ * using a three-phase plateau-detection algorithm.
7
+ *
8
+ * Phase 1: Find batch size plateau (CONCURRENCY=1)
9
+ * Phase 2: Test concurrency on plateau batches
10
+ * Phase 3: Select robust configuration (within 2% of max, prefer lower concurrency/batch)
11
+ *
12
+ * Run: npm run benchmark-embeddings
13
+ */
14
+ import { c, printBox } from "./lib/colors.mjs";
15
+ import { AVG_LOC_PER_CHUNK, config, MEDIAN_CODE_CHUNK_SIZE } from "./lib/config.mjs";
16
+ import { calibrateEmbeddings } from "./lib/embedding-calibration.mjs";
17
+ import { checkProviderConnectivity, createEmbeddingProvider } from "./lib/provider.mjs";
18
+
19
+ /**
20
+ * Format time in human readable format
21
+ */
22
+ function formatTime(ms) {
23
+ if (ms < 1000) return `${ms}ms`;
24
+ if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;
25
+ const minutes = Math.floor(ms / 60000);
26
+ const seconds = Math.round((ms % 60000) / 1000);
27
+ return `${minutes}m ${seconds}s`;
28
+ }
29
+
30
+ async function main() {
31
+ console.clear();
32
+ printBox("EMBEDDING CALIBRATION BENCHMARK", "Three-phase plateau detection");
33
+
34
+ // Show configuration
35
+ console.log(`${c.bold}Configuration:${c.reset}`);
36
+ console.log(` ${c.dim}Ollama:${c.reset} ${config.EMBEDDING_BASE_URL}`);
37
+ console.log(` ${c.dim}Model:${c.reset} ${config.EMBEDDING_MODEL}`);
38
+ console.log(` ${c.dim}Chunk size:${c.reset} ${MEDIAN_CODE_CHUNK_SIZE} chars (median from production)`);
39
+ console.log();
40
+
41
+ // Check embedding provider
42
+ process.stdout.write(`${c.dim}Checking embedding provider...${c.reset} `);
43
+ const embeddingCheck = await checkProviderConnectivity();
44
+ if (!embeddingCheck.ok) {
45
+ console.log(`${c.red}FAILED${c.reset}`);
46
+ console.log(`\n${c.red}Error:${c.reset} ${embeddingCheck.error}`);
47
+ process.exit(1);
48
+ }
49
+ console.log(`${c.green}OK${c.reset}`);
50
+
51
+ // Initialize embeddings
52
+ const { provider: embeddings, name: providerName } = await createEmbeddingProvider();
53
+ console.log(` ${c.green}✓${c.reset} Embedding provider: ${providerName}`);
54
+ console.log(` ${c.green}✓${c.reset} Vector dimension: ${embeddings.getDimensions()}`);
55
+ console.log();
56
+
57
+ // Run calibration
58
+ const result = await calibrateEmbeddings(embeddings, { verbose: true });
59
+
60
+ // ========== OUTPUT ==========
61
+ console.log();
62
+
63
+ // Detect setup type
64
+ const isOnnx = providerName === "onnx";
65
+ const isRemote =
66
+ !isOnnx && !config.EMBEDDING_BASE_URL.includes("localhost") && !config.EMBEDDING_BASE_URL.includes("127.0.0.1");
67
+ const setupIcon = isOnnx ? "⚡" : isRemote ? "🌐" : "🏠";
68
+ const setupName = isOnnx ? "Local ONNX" : isRemote ? "Remote GPU" : "Local GPU";
69
+
70
+ printBox(`${setupIcon} ${setupName.toUpperCase()} - OPTIMAL CONFIGURATION`, "");
71
+
72
+ // Main result
73
+ console.log(
74
+ ` ${c.bold}EMBEDDING_BATCH_SIZE${c.reset} = ${c.green}${c.bold}${result.EMBEDDING_BATCH_SIZE}${c.reset}`,
75
+ );
76
+ console.log(
77
+ ` ${c.bold}EMBEDDING_CONCURRENCY${c.reset} = ${c.green}${c.bold}${result.EMBEDDING_CONCURRENCY}${c.reset}`,
78
+ );
79
+ console.log();
80
+ console.log(` ${c.bold}Throughput:${c.reset} ${c.cyan}${result.throughput_chunks_per_sec} chunks/s${c.reset}`);
81
+ console.log();
82
+
83
+ // Explain the choice
84
+ console.log(`${c.bold}Why this configuration?${c.reset}`);
85
+ if (isOnnx) {
86
+ console.log(` ${c.dim}•${c.reset} Local ONNX runtime (${providerName})`);
87
+ console.log(` ${c.dim}•${c.reset} In-process inference, no network overhead`);
88
+ if (result.EMBEDDING_BATCH_SIZE <= 16) {
89
+ console.log(` ${c.dim}•${c.reset} Small batches optimal for ONNX memory management`);
90
+ }
91
+ } else if (isRemote) {
92
+ console.log(` ${c.dim}•${c.reset} Remote GPU detected (${config.EMBEDDING_BASE_URL})`);
93
+ console.log(` ${c.dim}•${c.reset} Lower batch + higher concurrency hides network latency`);
94
+ console.log(` ${c.dim}•${c.reset} While one batch transfers, GPU processes another`);
95
+ if (result.EMBEDDING_CONCURRENCY > 1) {
96
+ console.log(
97
+ ` ${c.dim}•${c.reset} CONCURRENCY=${result.EMBEDDING_CONCURRENCY} overlaps network I/O with GPU compute`,
98
+ );
99
+ }
100
+ } else {
101
+ console.log(` ${c.dim}•${c.reset} Local GPU detected (minimal network latency)`);
102
+ console.log(` ${c.dim}•${c.reset} Higher batch + lower concurrency minimizes overhead`);
103
+ if (result.EMBEDDING_CONCURRENCY === 1) {
104
+ console.log(` ${c.dim}•${c.reset} CONCURRENCY=1 indicates GPU-bound workload`);
105
+ }
106
+ }
107
+ console.log();
108
+
109
+ // Environment export
110
+ console.log(`${c.bold}Add to your environment:${c.reset}`);
111
+ console.log();
112
+ console.log(` ${c.cyan}export EMBEDDING_BATCH_SIZE=${result.EMBEDDING_BATCH_SIZE}${c.reset}`);
113
+ console.log(` ${c.cyan}export EMBEDDING_CONCURRENCY=${result.EMBEDDING_CONCURRENCY}${c.reset}`);
114
+ console.log();
115
+
116
+ // Time estimates
117
+ console.log(`${c.bold}Estimated indexing times:${c.reset}`);
118
+ const projects = [
119
+ { name: "10K LoC", loc: 10_000 },
120
+ { name: "100K LoC", loc: 100_000 },
121
+ { name: "1M LoC", loc: 1_000_000 },
122
+ { name: "VS Code (3.5M)", loc: 3_500_000 },
123
+ ];
124
+ for (const p of projects) {
125
+ const chunks = Math.ceil(p.loc / AVG_LOC_PER_CHUNK);
126
+ const seconds = Math.ceil(chunks / result.throughput_chunks_per_sec);
127
+ console.log(` ${c.dim}${p.name.padEnd(20)}${c.reset} ${c.bold}${formatTime(seconds * 1000)}${c.reset}`);
128
+ }
129
+ console.log();
130
+
131
+ // Stats
132
+ console.log(`${c.dim}────────────────────────────────────────${c.reset}`);
133
+ console.log(
134
+ `${c.dim}Configs tested: ${result.stable_configs_count} stable, ${result.discarded_configs_count} discarded${c.reset}`,
135
+ );
136
+ console.log(`${c.bold}Total benchmark time: ${formatTime(result.calibration_time_ms)}${c.reset}`);
137
+
138
+ // Terminate provider (ONNX keeps socket alive)
139
+ if ("terminate" in embeddings && typeof embeddings.terminate === "function") {
140
+ await embeddings.terminate();
141
+ }
142
+ }
143
+
144
+ main().catch((err) => {
145
+ console.error(`${c.red}Fatal error:${c.reset}`, err.message);
146
+ console.error(err.stack);
147
+ process.exit(1);
148
+ });