@vivantel/virage-core 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 (203) hide show
  1. package/README.md +83 -0
  2. package/dist/bin/virage.d.ts +3 -0
  3. package/dist/bin/virage.d.ts.map +1 -0
  4. package/dist/bin/virage.js +344 -0
  5. package/dist/bin/virage.js.map +1 -0
  6. package/dist/cli/benchmark.d.ts +6 -0
  7. package/dist/cli/benchmark.d.ts.map +1 -0
  8. package/dist/cli/benchmark.js +26 -0
  9. package/dist/cli/benchmark.js.map +1 -0
  10. package/dist/cli/chunks-report.d.ts +2 -0
  11. package/dist/cli/chunks-report.d.ts.map +1 -0
  12. package/dist/cli/chunks-report.js +74 -0
  13. package/dist/cli/chunks-report.js.map +1 -0
  14. package/dist/cli/dashboard.d.ts +7 -0
  15. package/dist/cli/dashboard.d.ts.map +1 -0
  16. package/dist/cli/dashboard.js +191 -0
  17. package/dist/cli/dashboard.js.map +1 -0
  18. package/dist/cli/evaluate.d.ts +9 -0
  19. package/dist/cli/evaluate.d.ts.map +1 -0
  20. package/dist/cli/evaluate.js +59 -0
  21. package/dist/cli/evaluate.js.map +1 -0
  22. package/dist/cli/experiment.d.ts +13 -0
  23. package/dist/cli/experiment.d.ts.map +1 -0
  24. package/dist/cli/experiment.js +91 -0
  25. package/dist/cli/experiment.js.map +1 -0
  26. package/dist/cli/init.d.ts +9 -0
  27. package/dist/cli/init.d.ts.map +1 -0
  28. package/dist/cli/init.js +364 -0
  29. package/dist/cli/init.js.map +1 -0
  30. package/dist/cli/report.d.ts +2 -0
  31. package/dist/cli/report.d.ts.map +1 -0
  32. package/dist/cli/report.js +96 -0
  33. package/dist/cli/report.js.map +1 -0
  34. package/dist/cli/store-cmd.d.ts +10 -0
  35. package/dist/cli/store-cmd.d.ts.map +1 -0
  36. package/dist/cli/store-cmd.js +50 -0
  37. package/dist/cli/store-cmd.js.map +1 -0
  38. package/dist/cli/validate.d.ts +2 -0
  39. package/dist/cli/validate.d.ts.map +1 -0
  40. package/dist/cli/validate.js +54 -0
  41. package/dist/cli/validate.js.map +1 -0
  42. package/dist/cli/viz.d.ts +7 -0
  43. package/dist/cli/viz.d.ts.map +1 -0
  44. package/dist/cli/viz.js +161 -0
  45. package/dist/cli/viz.js.map +1 -0
  46. package/dist/config-loader.d.ts +6 -0
  47. package/dist/config-loader.d.ts.map +1 -0
  48. package/dist/config-loader.js +116 -0
  49. package/dist/config-loader.js.map +1 -0
  50. package/dist/core/chunk-processor.d.ts +14 -0
  51. package/dist/core/chunk-processor.d.ts.map +1 -0
  52. package/dist/core/chunk-processor.js +99 -0
  53. package/dist/core/chunk-processor.js.map +1 -0
  54. package/dist/core/embedder.d.ts +32 -0
  55. package/dist/core/embedder.d.ts.map +1 -0
  56. package/dist/core/embedder.js +246 -0
  57. package/dist/core/embedder.js.map +1 -0
  58. package/dist/core/embeddings-io.d.ts +12 -0
  59. package/dist/core/embeddings-io.d.ts.map +1 -0
  60. package/dist/core/embeddings-io.js +29 -0
  61. package/dist/core/embeddings-io.js.map +1 -0
  62. package/dist/core/env-expand.d.ts +3 -0
  63. package/dist/core/env-expand.d.ts.map +1 -0
  64. package/dist/core/env-expand.js +24 -0
  65. package/dist/core/env-expand.js.map +1 -0
  66. package/dist/core/errors.d.ts +16 -0
  67. package/dist/core/errors.d.ts.map +1 -0
  68. package/dist/core/errors.js +17 -0
  69. package/dist/core/errors.js.map +1 -0
  70. package/dist/core/git-tracker.d.ts +27 -0
  71. package/dist/core/git-tracker.d.ts.map +1 -0
  72. package/dist/core/git-tracker.js +140 -0
  73. package/dist/core/git-tracker.js.map +1 -0
  74. package/dist/core/orchestrator.d.ts +33 -0
  75. package/dist/core/orchestrator.d.ts.map +1 -0
  76. package/dist/core/orchestrator.js +181 -0
  77. package/dist/core/orchestrator.js.map +1 -0
  78. package/dist/core/plugin-discovery.d.ts +19 -0
  79. package/dist/core/plugin-discovery.d.ts.map +1 -0
  80. package/dist/core/plugin-discovery.js +47 -0
  81. package/dist/core/plugin-discovery.js.map +1 -0
  82. package/dist/core/strategy-registry.d.ts +14 -0
  83. package/dist/core/strategy-registry.d.ts.map +1 -0
  84. package/dist/core/strategy-registry.js +57 -0
  85. package/dist/core/strategy-registry.js.map +1 -0
  86. package/dist/core/telemetry.d.ts +68 -0
  87. package/dist/core/telemetry.d.ts.map +1 -0
  88. package/dist/core/telemetry.js +53 -0
  89. package/dist/core/telemetry.js.map +1 -0
  90. package/dist/core/uploader.d.ts +22 -0
  91. package/dist/core/uploader.d.ts.map +1 -0
  92. package/dist/core/uploader.js +122 -0
  93. package/dist/core/uploader.js.map +1 -0
  94. package/dist/core/utils.d.ts +15 -0
  95. package/dist/core/utils.d.ts.map +1 -0
  96. package/dist/core/utils.js +79 -0
  97. package/dist/core/utils.js.map +1 -0
  98. package/dist/eval/adaptive-tuner.d.ts +30 -0
  99. package/dist/eval/adaptive-tuner.d.ts.map +1 -0
  100. package/dist/eval/adaptive-tuner.js +35 -0
  101. package/dist/eval/adaptive-tuner.js.map +1 -0
  102. package/dist/eval/dataset-io.d.ts +4 -0
  103. package/dist/eval/dataset-io.d.ts.map +1 -0
  104. package/dist/eval/dataset-io.js +38 -0
  105. package/dist/eval/dataset-io.js.map +1 -0
  106. package/dist/eval/experiment-store.d.ts +11 -0
  107. package/dist/eval/experiment-store.d.ts.map +1 -0
  108. package/dist/eval/experiment-store.js +70 -0
  109. package/dist/eval/experiment-store.js.map +1 -0
  110. package/dist/eval/generator.d.ts +16 -0
  111. package/dist/eval/generator.d.ts.map +1 -0
  112. package/dist/eval/generator.js +106 -0
  113. package/dist/eval/generator.js.map +1 -0
  114. package/dist/eval/metrics.d.ts +43 -0
  115. package/dist/eval/metrics.d.ts.map +1 -0
  116. package/dist/eval/metrics.js +87 -0
  117. package/dist/eval/metrics.js.map +1 -0
  118. package/dist/eval/ragas.d.ts +12 -0
  119. package/dist/eval/ragas.d.ts.map +1 -0
  120. package/dist/eval/ragas.js +41 -0
  121. package/dist/eval/ragas.js.map +1 -0
  122. package/dist/eval/runner.d.ts +16 -0
  123. package/dist/eval/runner.d.ts.map +1 -0
  124. package/dist/eval/runner.js +44 -0
  125. package/dist/eval/runner.js.map +1 -0
  126. package/dist/eval/statistics.d.ts +26 -0
  127. package/dist/eval/statistics.d.ts.map +1 -0
  128. package/dist/eval/statistics.js +67 -0
  129. package/dist/eval/statistics.js.map +1 -0
  130. package/dist/helpers/create-chunker.d.ts +18 -0
  131. package/dist/helpers/create-chunker.d.ts.map +1 -0
  132. package/dist/helpers/create-chunker.js +35 -0
  133. package/dist/helpers/create-chunker.js.map +1 -0
  134. package/dist/index.d.ts +35 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +39 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/interfaces/chunker.d.ts +49 -0
  139. package/dist/interfaces/chunker.d.ts.map +1 -0
  140. package/dist/interfaces/chunker.js +5 -0
  141. package/dist/interfaces/chunker.js.map +1 -0
  142. package/dist/interfaces/embedder.d.ts +61 -0
  143. package/dist/interfaces/embedder.d.ts.map +1 -0
  144. package/dist/interfaces/embedder.js +5 -0
  145. package/dist/interfaces/embedder.js.map +1 -0
  146. package/dist/interfaces/index.d.ts +6 -0
  147. package/dist/interfaces/index.d.ts.map +1 -0
  148. package/dist/interfaces/index.js +6 -0
  149. package/dist/interfaces/index.js.map +1 -0
  150. package/dist/interfaces/logger.d.ts +13 -0
  151. package/dist/interfaces/logger.d.ts.map +1 -0
  152. package/dist/interfaces/logger.js +2 -0
  153. package/dist/interfaces/logger.js.map +1 -0
  154. package/dist/interfaces/quality.d.ts +112 -0
  155. package/dist/interfaces/quality.d.ts.map +1 -0
  156. package/dist/interfaces/quality.js +5 -0
  157. package/dist/interfaces/quality.js.map +1 -0
  158. package/dist/interfaces/vector-store.d.ts +60 -0
  159. package/dist/interfaces/vector-store.d.ts.map +1 -0
  160. package/dist/interfaces/vector-store.js +5 -0
  161. package/dist/interfaces/vector-store.js.map +1 -0
  162. package/dist/logger/consola-logger.d.ts +18 -0
  163. package/dist/logger/consola-logger.d.ts.map +1 -0
  164. package/dist/logger/consola-logger.js +59 -0
  165. package/dist/logger/consola-logger.js.map +1 -0
  166. package/dist/logger/index.d.ts +5 -0
  167. package/dist/logger/index.d.ts.map +1 -0
  168. package/dist/logger/index.js +7 -0
  169. package/dist/logger/index.js.map +1 -0
  170. package/dist/logger/null-logger.d.ts +14 -0
  171. package/dist/logger/null-logger.d.ts.map +1 -0
  172. package/dist/logger/null-logger.js +15 -0
  173. package/dist/logger/null-logger.js.map +1 -0
  174. package/dist/plugin-registry.d.ts +17 -0
  175. package/dist/plugin-registry.d.ts.map +1 -0
  176. package/dist/plugin-registry.js +175 -0
  177. package/dist/plugin-registry.js.map +1 -0
  178. package/dist/strategies/chunk/index.d.ts +5 -0
  179. package/dist/strategies/chunk/index.d.ts.map +1 -0
  180. package/dist/strategies/chunk/index.js +5 -0
  181. package/dist/strategies/chunk/index.js.map +1 -0
  182. package/dist/strategies/chunk/markdown-headers.d.ts +7 -0
  183. package/dist/strategies/chunk/markdown-headers.d.ts.map +1 -0
  184. package/dist/strategies/chunk/markdown-headers.js +93 -0
  185. package/dist/strategies/chunk/markdown-headers.js.map +1 -0
  186. package/dist/strategies/chunk/quality-metrics.d.ts +7 -0
  187. package/dist/strategies/chunk/quality-metrics.d.ts.map +1 -0
  188. package/dist/strategies/chunk/quality-metrics.js +37 -0
  189. package/dist/strategies/chunk/quality-metrics.js.map +1 -0
  190. package/dist/strategies/chunk/semantic.d.ts +7 -0
  191. package/dist/strategies/chunk/semantic.d.ts.map +1 -0
  192. package/dist/strategies/chunk/semantic.js +66 -0
  193. package/dist/strategies/chunk/semantic.js.map +1 -0
  194. package/dist/strategies/chunk/token.d.ts +12 -0
  195. package/dist/strategies/chunk/token.d.ts.map +1 -0
  196. package/dist/strategies/chunk/token.js +60 -0
  197. package/dist/strategies/chunk/token.js.map +1 -0
  198. package/dist/strategies/chunk/whole-file.d.ts +3 -0
  199. package/dist/strategies/chunk/whole-file.d.ts.map +1 -0
  200. package/dist/strategies/chunk/whole-file.js +35 -0
  201. package/dist/strategies/chunk/whole-file.js.map +1 -0
  202. package/package.json +81 -0
  203. package/schemas/virage.config.schema.json +104 -0
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # @vivantel/virage-core
2
+
3
+ [![CI](https://github.com/vivantel/virage/actions/workflows/ci-rag-core.yaml/badge.svg)](https://github.com/vivantel/virage/actions/workflows/ci-rag-core.yaml)
4
+ [![npm version](https://img.shields.io/npm/v/@vivantel/virage-core.svg)](https://www.npmjs.com/package/@vivantel/virage-core)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+
7
+ Pipeline orchestrator, provider interfaces, and CLI for Git-aware RAG indexing.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npm install @vivantel/virage-core
13
+ ```
14
+
15
+ ## Quick start
16
+
17
+ ```bash
18
+ npx virage init # generate virage.config.json interactively
19
+ npx virage # run the pipeline
20
+ ```
21
+
22
+ ## What it does
23
+
24
+ Four pipeline stages run in sequence:
25
+
26
+ 1. **GitTracker** — finds files matching your chunker patterns and detects changes via commit hashes
27
+ 2. **ChunkProcessor** — splits each file into `Chunk[]` using your configured strategy
28
+ 3. **EmbedderProcessor** — embeds chunks incrementally (skips unchanged content); detects model changes and auto-invalidates stale embeddings
29
+ 4. **Uploader** — syncs the vector store: deletes stale documents, upserts new ones
30
+
31
+ ## Provider interfaces
32
+
33
+ Implement these three interfaces to integrate any backend:
34
+
35
+ ```typescript
36
+ interface FileChunker {
37
+ name: string;
38
+ patterns: string[];
39
+ chunk(filePath: string, commitHash: string): Promise<Chunk[]>;
40
+ }
41
+
42
+ interface EmbeddingProvider {
43
+ name: string;
44
+ dimensions: number;
45
+ model?: string; // used for cache invalidation
46
+ embed(text: string): Promise<number[]>;
47
+ embedBatch?(texts: string[]): Promise<number[][]>;
48
+ }
49
+
50
+ interface VectorStore {
51
+ name: string;
52
+ initialize(): Promise<void>;
53
+ upsert(docs: VectorDocument[]): Promise<void>;
54
+ deleteBySourceFile(files: string[]): Promise<void>;
55
+ getCurrentState(): Promise<Map<string, string>>;
56
+ search(embedding: number[], topK: number): Promise<VectorSearchResult[]>;
57
+ }
58
+ ```
59
+
60
+ ## createChunker helper
61
+
62
+ ```typescript
63
+ import { createChunker } from "@vivantel/virage-core";
64
+ import { markdownHeadersStrategy } from "@vivantel/virage-strategies";
65
+
66
+ // Strategy shorthand
67
+ createChunker({ patterns: ["docs/**/*.md"], strategy: markdownHeadersStrategy() });
68
+
69
+ // Custom process function
70
+ createChunker({
71
+ name: "custom",
72
+ patterns: ["**/*.txt"],
73
+ process: async (content, filePath, commitHash) => [{ content, metadata: {}, sourceFile: filePath, commitHash }],
74
+ });
75
+ ```
76
+
77
+ ## Embeddings cache invalidation
78
+
79
+ `embeddings.json` stores metadata about the last embedding run. If the `model` or `dimensions` of your provider changes, the cache is automatically cleared and all chunks are re-embedded. Switching providers (e.g., from GitHub Models to OpenAI direct) but keeping the same model name does **not** invalidate the cache — the vectors are identical.
80
+
81
+ ## License
82
+
83
+ MIT
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=virage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virage.d.ts","sourceRoot":"","sources":["../../src/bin/virage.ts"],"names":[],"mappings":""}
@@ -0,0 +1,344 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { config } from "dotenv";
4
+ import { loadConfig } from "../config-loader.js";
5
+ import { Orchestrator } from "../core/orchestrator.js";
6
+ import { RagError } from "../core/errors.js";
7
+ import { createLogger } from "../logger/index.js";
8
+ import { runInit } from "../cli/init.js";
9
+ import { runValidate } from "../cli/validate.js";
10
+ import { runEvaluate } from "../cli/evaluate.js";
11
+ import { runExperimentRun, runExperimentCompare, runExperimentList, } from "../cli/experiment.js";
12
+ import { runBenchmarkEmbedder } from "../cli/benchmark.js";
13
+ import { runStoreStats, runStorePerf } from "../cli/store-cmd.js";
14
+ import { runReport } from "../cli/report.js";
15
+ import { runChunksReport } from "../cli/chunks-report.js";
16
+ import { runVizEmbeddings } from "../cli/viz.js";
17
+ import { runDashboard } from "../cli/dashboard.js";
18
+ config();
19
+ // Expand -vvv etc. into individual -v flags before commander parses
20
+ const argv = process.argv.flatMap((arg) => /^-v+$/.test(arg)
21
+ ? arg
22
+ .slice(1)
23
+ .split("")
24
+ .map((c) => `-${c}`)
25
+ : [arg]);
26
+ const program = new Command();
27
+ function handleError(error) {
28
+ console.error("āŒ Error:", error instanceof Error ? error.message : error);
29
+ if (error instanceof RagError && error.suggestion) {
30
+ console.error(" šŸ’”", error.suggestion);
31
+ }
32
+ process.exit(1);
33
+ }
34
+ async function runOnce(options) {
35
+ const cfg = await loadConfig(options.config, options.logger);
36
+ const orchestrator = new Orchestrator({
37
+ ...cfg,
38
+ options: {
39
+ ...cfg.options,
40
+ force: options.force || cfg.options?.force,
41
+ skipUpload: options.noUpload || cfg.options?.skipUpload,
42
+ dryRun: options.dryRun || cfg.options?.dryRun,
43
+ chunksFile: options.chunksOut || cfg.options?.chunksFile,
44
+ embeddingsFile: options.embeddingsOut || cfg.options?.embeddingsFile,
45
+ logger: options.logger,
46
+ },
47
+ });
48
+ await orchestrator.run();
49
+ }
50
+ program
51
+ .name("virage")
52
+ .description("RAG pipeline CLI — run 'virage update' to index, or a subcommand for diagnostics")
53
+ .version("2.0.0")
54
+ .option("-v, --verbose", "Increase verbosity (stackable: -v, -vv … -vvvvv)", (_, prev) => prev + 1, 0)
55
+ .action(() => program.outputHelp());
56
+ program
57
+ .command("update")
58
+ .description("Run the RAG indexing pipeline")
59
+ .option("-c, --config <path>", "Path to config file", "./virage.config.json")
60
+ .option("-f, --force", "Force full rebuild", false)
61
+ .option("--no-upload", "Skip upload to vector store")
62
+ .option("--dry-run", "Show what would change without uploading", false)
63
+ .option("--chunks-out <path>", "Output path for chunks.json")
64
+ .option("--embeddings-out <path>", "Output path for embeddings.json")
65
+ .option("--watch", "Re-run pipeline on file changes", false)
66
+ .action(async (cmdOpts) => {
67
+ const verbose = program.opts().verbose;
68
+ const logger = createLogger(verbose);
69
+ const runOptions = {
70
+ config: cmdOpts.config,
71
+ force: cmdOpts.force,
72
+ noUpload: !cmdOpts.upload,
73
+ dryRun: cmdOpts.dryRun,
74
+ chunksOut: cmdOpts.chunksOut,
75
+ embeddingsOut: cmdOpts.embeddingsOut,
76
+ logger,
77
+ };
78
+ logger.info("šŸš€ Virage");
79
+ try {
80
+ await runOnce(runOptions);
81
+ }
82
+ catch (error) {
83
+ handleError(error);
84
+ }
85
+ if (!cmdOpts.watch)
86
+ return;
87
+ // Watch mode
88
+ const { default: chokidar } = await import("chokidar");
89
+ const cfg = await loadConfig(cmdOpts.config, logger).catch(() => null);
90
+ const patterns = cfg
91
+ ? cfg.chunkers.flatMap((c) => c.patterns)
92
+ : [];
93
+ const watched = [cmdOpts.config, ...patterns];
94
+ logger.info("šŸ‘ļø Watching for changes...");
95
+ let debounce = null;
96
+ chokidar
97
+ .watch(watched, { ignoreInitial: true })
98
+ .on("all", (event, path) => {
99
+ if (debounce)
100
+ clearTimeout(debounce);
101
+ debounce = setTimeout(async () => {
102
+ logger.info(`šŸ”„ Change detected (${event}: ${path}), re-running...`);
103
+ try {
104
+ await runOnce(runOptions);
105
+ }
106
+ catch (error) {
107
+ logger.error(error instanceof Error ? error.message : String(error));
108
+ }
109
+ }, 500);
110
+ });
111
+ });
112
+ program
113
+ .command("init")
114
+ .description("Generate a virage.config.json template interactively")
115
+ .action(async () => {
116
+ try {
117
+ await runInit();
118
+ }
119
+ catch (error) {
120
+ if (error.name === "ExitPromptError") {
121
+ console.log("\nCancelled.");
122
+ process.exit(0);
123
+ }
124
+ handleError(error);
125
+ }
126
+ });
127
+ program
128
+ .command("validate")
129
+ .description("Validate config without running the pipeline")
130
+ .option("-c, --config <path>", "Path to config file", "./virage.config.json")
131
+ .action(async (opts) => {
132
+ try {
133
+ await runValidate(opts.config);
134
+ }
135
+ catch (error) {
136
+ handleError(error);
137
+ }
138
+ });
139
+ program
140
+ .command("evaluate")
141
+ .description("Evaluate retrieval quality against an eval dataset")
142
+ .option("-c, --config <path>", "Path to config file", "./virage.config.json")
143
+ .option("-d, --dataset <path>", "Eval dataset path", "./eval/queries.json")
144
+ .option("--with-llm-judge", "Enable RAGAS LLM-as-judge metrics")
145
+ .option("--threshold-mrr <n>", "Fail if MRR is below this threshold", parseFloat)
146
+ .option("--ci", "Exit with code 1 if quality gate fails")
147
+ .action(async (opts) => {
148
+ try {
149
+ await runEvaluate({
150
+ config: opts.config,
151
+ dataset: opts.dataset,
152
+ withLlmJudge: opts.withLlmJudge ?? false,
153
+ thresholdMrr: opts.thresholdMrr,
154
+ ci: opts.ci ?? false,
155
+ });
156
+ }
157
+ catch (error) {
158
+ handleError(error);
159
+ }
160
+ });
161
+ program
162
+ .command("report")
163
+ .description("Show observability report from telemetry files")
164
+ .option("--dir <path>", "Directory containing telemetry.json files", "./docs/rag")
165
+ .action(async (opts) => {
166
+ try {
167
+ await runReport(opts.dir);
168
+ }
169
+ catch (error) {
170
+ handleError(error);
171
+ }
172
+ });
173
+ program
174
+ .command("eval-generate")
175
+ .description("Generate an eval dataset from existing chunks")
176
+ .option("--chunks <path>", "Chunks file path", "./docs/rag/chunks.json")
177
+ .option("--output <path>", "Output dataset path", "./eval/queries.json")
178
+ .option("--include-negatives", "Add negative examples")
179
+ .option("--paraphrase-ratio <n>", "Fraction of queries to paraphrase (requires LLM judge)", parseFloat, 0)
180
+ .action(async (opts) => {
181
+ try {
182
+ const { readFile } = await import("fs/promises");
183
+ const raw = JSON.parse(await readFile(opts.chunks, "utf-8"));
184
+ const chunks = Array.isArray(raw)
185
+ ? raw
186
+ : (raw.chunks ?? []);
187
+ const { generateEvalDataset } = await import("../eval/generator.js");
188
+ await generateEvalDataset(chunks, {
189
+ includeNegatives: opts.includeNegatives ?? false,
190
+ paraphraseRatio: opts.paraphraseRatio,
191
+ }, opts.output);
192
+ }
193
+ catch (error) {
194
+ handleError(error);
195
+ }
196
+ });
197
+ const viz = program.command("viz").description("Visualization tools");
198
+ viz
199
+ .command("embeddings")
200
+ .description("Generate a 2D visualization of the embedding space")
201
+ .option("--embeddings <path>", "Embeddings file path", "./docs/rag/embeddings.json")
202
+ .option("--output <path>", "Output HTML file", "umap.html")
203
+ .option("--projection <type>", "Projection type: umap or tsne", "umap")
204
+ .action(async (opts) => {
205
+ try {
206
+ await runVizEmbeddings({
207
+ embeddingsFile: opts.embeddings,
208
+ output: opts.output,
209
+ projection: opts.projection,
210
+ });
211
+ }
212
+ catch (error) {
213
+ handleError(error);
214
+ }
215
+ });
216
+ const chunks = program.command("chunks").description("Chunk analysis tools");
217
+ chunks
218
+ .command("report")
219
+ .description("Show chunk cohesion report")
220
+ .option("--file <path>", "Chunks file path", "./docs/rag/chunks.json")
221
+ .action(async (opts) => {
222
+ try {
223
+ await runChunksReport(opts.file);
224
+ }
225
+ catch (error) {
226
+ handleError(error);
227
+ }
228
+ });
229
+ program
230
+ .command("dashboard")
231
+ .description("Start a local RAG monitoring dashboard")
232
+ .option("--port <n>", "Port to serve on", parseInt, 3000)
233
+ .option("--chunks <path>", "Chunks file path", "./docs/rag/chunks.json")
234
+ .option("--embeddings <path>", "Embeddings file path", "./docs/rag/embeddings.json")
235
+ .action(async (opts) => {
236
+ try {
237
+ await runDashboard({
238
+ port: opts.port,
239
+ chunksFile: opts.chunks,
240
+ embeddingsFile: opts.embeddings,
241
+ });
242
+ }
243
+ catch (error) {
244
+ handleError(error);
245
+ }
246
+ });
247
+ const benchmark = program
248
+ .command("benchmark")
249
+ .description("Performance benchmarking tools");
250
+ benchmark
251
+ .command("embedder")
252
+ .description("Benchmark a local HuggingFace embedding model")
253
+ .option("--model <id>", "HuggingFace model ID", "Xenova/all-MiniLM-L6-v2")
254
+ .option("--device <device>", "'cpu' or 'webgpu'", "cpu")
255
+ .action(async (opts) => {
256
+ try {
257
+ await runBenchmarkEmbedder({
258
+ model: opts.model,
259
+ device: opts.device,
260
+ });
261
+ }
262
+ catch (error) {
263
+ handleError(error);
264
+ }
265
+ });
266
+ const store = program.command("store").description("Vector store diagnostics");
267
+ store
268
+ .command("stats")
269
+ .description("Show vector index quality metrics")
270
+ .option("-c, --config <path>", "Path to config file", "./virage.config.json")
271
+ .action(async (opts) => {
272
+ try {
273
+ await runStoreStats({ config: opts.config });
274
+ }
275
+ catch (error) {
276
+ handleError(error);
277
+ }
278
+ });
279
+ store
280
+ .command("perf")
281
+ .description("Show query performance report")
282
+ .option("-c, --config <path>", "Path to config file", "./virage.config.json")
283
+ .option("--timeframe <hours>", "Timeframe in hours", parseInt, 24)
284
+ .action(async (opts) => {
285
+ try {
286
+ await runStorePerf({
287
+ config: opts.config,
288
+ timeframeHours: opts.timeframe,
289
+ });
290
+ }
291
+ catch (error) {
292
+ handleError(error);
293
+ }
294
+ });
295
+ const experiment = program
296
+ .command("experiment")
297
+ .description("Experiment tracking and statistical comparison");
298
+ experiment
299
+ .command("run")
300
+ .description("Run an experiment and save results")
301
+ .requiredOption("--name <name>", "Experiment name")
302
+ .option("-c, --config <path>", "Path to config file", "./virage.config.json")
303
+ .option("-d, --dataset <path>", "Eval dataset path", "./eval/queries.json")
304
+ .action(async (opts) => {
305
+ try {
306
+ await runExperimentRun({
307
+ name: opts.name,
308
+ config: opts.config,
309
+ dataset: opts.dataset,
310
+ });
311
+ }
312
+ catch (error) {
313
+ handleError(error);
314
+ }
315
+ });
316
+ experiment
317
+ .command("list")
318
+ .description("List saved experiment runs")
319
+ .action(async () => {
320
+ try {
321
+ await runExperimentList();
322
+ }
323
+ catch (error) {
324
+ handleError(error);
325
+ }
326
+ });
327
+ experiment
328
+ .command("compare")
329
+ .description("Compare two experiment runs with bootstrap significance test")
330
+ .requiredOption("--baseline <id>", "Baseline run name or id")
331
+ .requiredOption("--candidate <id>", "Candidate run name or id")
332
+ .action(async (opts) => {
333
+ try {
334
+ await runExperimentCompare({
335
+ baseline: opts.baseline,
336
+ candidate: opts.candidate,
337
+ });
338
+ }
339
+ catch (error) {
340
+ handleError(error);
341
+ }
342
+ });
343
+ program.parse(argv);
344
+ //# sourceMappingURL=virage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virage.js","sourceRoot":"","sources":["../../src/bin/virage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface BenchmarkEmbedderOptions {
2
+ model: string;
3
+ device: "cpu" | "webgpu";
4
+ }
5
+ export declare function runBenchmarkEmbedder(opts: BenchmarkEmbedderOptions): Promise<void>;
6
+ //# sourceMappingURL=benchmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../../src/cli/benchmark.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC;CAC1B;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAyCf"}
@@ -0,0 +1,26 @@
1
+ export async function runBenchmarkEmbedder(opts) {
2
+ console.log(`šŸ”¬ Benchmarking embedder: ${opts.model}`);
3
+ console.log(` Device: ${opts.device}`);
4
+ let benchmarkEmbedder;
5
+ try {
6
+ const pkg = "@vivantel/virage-embedder-transformers";
7
+ const mod = await import(pkg);
8
+ benchmarkEmbedder = mod.benchmarkEmbedder;
9
+ }
10
+ catch {
11
+ console.error("āŒ @vivantel/virage-embedder-transformers is not installed.\n" +
12
+ " Install it with: npm install @vivantel/virage-embedder-transformers");
13
+ process.exit(1);
14
+ }
15
+ console.log("ā³ Running benchmark (this may take a moment for model download)...\n");
16
+ const result = await benchmarkEmbedder(opts.model, { device: opts.device });
17
+ console.log("šŸ“Š Benchmark Results");
18
+ console.log("─".repeat(40));
19
+ console.log(` Model : ${result.model}`);
20
+ console.log(` Dimensions : ${result.dimensions}`);
21
+ console.log(` Tokens/sec : ${result.tokensPerSec.toLocaleString()}`);
22
+ console.log(` Memory delta : ${result.memoryMB} MB`);
23
+ console.log(` First query latency: ${result.firstQueryLatencyMs} ms`);
24
+ console.log("─".repeat(40));
25
+ }
26
+ //# sourceMappingURL=benchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../src/cli/benchmark.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAA8B;IAE9B,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAEzC,IAAI,iBASF,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,wCAAwC,CAAC;QACrD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,iBAAiB,GAAG,GAAG,CAAC,iBAA6C,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CACX,8DAA8D;YAC5D,wEAAwE,CAC3E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CACT,sEAAsE,CACvE,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAE5E,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,mBAAmB,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runChunksReport(chunksFile: string): Promise<void>;
2
+ //# sourceMappingURL=chunks-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunks-report.d.ts","sourceRoot":"","sources":["../../src/cli/chunks-report.ts"],"names":[],"mappings":"AAmCA,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DvE"}
@@ -0,0 +1,74 @@
1
+ import { readFile } from "fs/promises";
2
+ function isChunkArray(val) {
3
+ return (Array.isArray(val) &&
4
+ val.length > 0 &&
5
+ typeof val[0].content === "string");
6
+ }
7
+ function computeCohesion(chunks) {
8
+ const sentenceEnd = /[.!?\n]\s*$/;
9
+ const midSentence = chunks.filter((c) => !sentenceEnd.test(c.content));
10
+ const cohesion = 1 - midSentence.length / chunks.length;
11
+ const suggestion = cohesion < 0.5
12
+ ? `Low cohesion — consider switching to 'semantic' strategy for better sentence boundaries`
13
+ : cohesion < 0.8
14
+ ? `Moderate cohesion — increase maxTokens or use 'markdown-headers' for structured content`
15
+ : "Good cohesion";
16
+ return { cohesion, midSentenceCuts: midSentence.length, suggestion };
17
+ }
18
+ export async function runChunksReport(chunksFile) {
19
+ let raw;
20
+ try {
21
+ raw = await readFile(chunksFile, "utf-8");
22
+ }
23
+ catch {
24
+ console.error(`āŒ Could not read chunks file "${chunksFile}".\n` +
25
+ ` Run the pipeline first to generate chunks.`);
26
+ process.exit(1);
27
+ }
28
+ let parsed;
29
+ try {
30
+ parsed = JSON.parse(raw);
31
+ }
32
+ catch {
33
+ console.error(`āŒ "${chunksFile}" is not valid JSON`);
34
+ process.exit(1);
35
+ }
36
+ // chunks.json can be a bare array or an object with a chunks property
37
+ let chunks;
38
+ if (isChunkArray(parsed)) {
39
+ chunks = parsed;
40
+ }
41
+ else if (parsed &&
42
+ typeof parsed === "object" &&
43
+ "chunks" in parsed &&
44
+ isChunkArray(parsed.chunks)) {
45
+ chunks = parsed.chunks;
46
+ }
47
+ else {
48
+ console.error(`āŒ Unexpected chunks file format in "${chunksFile}"`);
49
+ process.exit(1);
50
+ }
51
+ // Group by strategy
52
+ const byStrategy = new Map();
53
+ for (const chunk of chunks) {
54
+ const strategy = chunk.metadata?.strategy ?? "unknown";
55
+ const group = byStrategy.get(strategy) ?? [];
56
+ group.push(chunk);
57
+ byStrategy.set(strategy, group);
58
+ }
59
+ console.log(`\nšŸ“Š Chunk Cohesion Report (${chunks.length} total chunks)`);
60
+ console.log("─".repeat(60));
61
+ for (const [strategy, group] of byStrategy) {
62
+ const sizes = group.map((c) => c.content.length);
63
+ const avgSize = Math.round(sizes.reduce((s, v) => s + v, 0) / sizes.length);
64
+ const { cohesion, midSentenceCuts, suggestion } = computeCohesion(group);
65
+ console.log(`\n Strategy: ${strategy}`);
66
+ console.log(` Chunks : ${group.length}`);
67
+ console.log(` Avg size : ${avgSize} chars`);
68
+ console.log(` Cohesion : ${(cohesion * 100).toFixed(1)}%`);
69
+ console.log(` Mid-sentence cuts: ${midSentenceCuts}`);
70
+ console.log(` šŸ’” ${suggestion}`);
71
+ }
72
+ console.log("\n" + "─".repeat(60));
73
+ }
74
+ //# sourceMappingURL=chunks-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunks-report.js","sourceRoot":"","sources":["../../src/cli/chunks-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface DashboardOptions {
2
+ port: number;
3
+ chunksFile: string;
4
+ embeddingsFile: string;
5
+ }
6
+ export declare function runDashboard(opts: DashboardOptions): Promise<void>;
7
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/cli/dashboard.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AA2ED,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDxE"}