codesearch-mcp 0.1.0-alpha → 0.2.0-alpha

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 (44) hide show
  1. package/CHANGELOG.md +24 -1
  2. package/README.md +141 -39
  3. package/dist/app.js +2 -2
  4. package/dist/src/commands/IndexCommand.js +42 -1
  5. package/dist/src/config-error.d.ts +7 -0
  6. package/dist/src/config-error.js +14 -0
  7. package/dist/src/config-store.d.ts +30 -12
  8. package/dist/src/config-store.js +81 -26
  9. package/dist/src/config.d.ts +5 -4
  10. package/dist/src/config.js +14 -16
  11. package/dist/src/constants.d.ts +8 -2
  12. package/dist/src/constants.js +8 -5
  13. package/dist/src/help.js +1 -1
  14. package/dist/src/interfaces/IDatabase.d.ts +17 -0
  15. package/dist/src/interfaces/ILogger.d.ts +7 -0
  16. package/dist/src/services/AstChunker.d.ts +11 -0
  17. package/dist/src/services/AstChunker.js +44 -0
  18. package/dist/src/services/DatabaseService.d.ts +4 -0
  19. package/dist/src/services/DatabaseService.js +46 -0
  20. package/dist/src/services/EmbedderFactory.d.ts +1 -1
  21. package/dist/src/services/EmbedderFactory.js +2 -5
  22. package/dist/src/services/IndexerService.d.ts +4 -0
  23. package/dist/src/services/IndexerService.js +27 -7
  24. package/dist/src/services/InfinityEmbedder.d.ts +14 -55
  25. package/dist/src/services/InfinityEmbedder.js +30 -141
  26. package/dist/src/services/LoggerService.d.ts +3 -1
  27. package/dist/src/services/LoggerService.js +17 -3
  28. package/dist/src/services/SearcherService.d.ts +15 -1
  29. package/dist/src/services/SearcherService.js +105 -23
  30. package/dist/src/services/WebServerService.d.ts +41 -3
  31. package/dist/src/services/WebServerService.js +90 -2
  32. package/dist/src/services/infinity-provisioning.d.ts +115 -0
  33. package/dist/src/services/infinity-provisioning.js +516 -0
  34. package/dist/src/services/legacy-ollama-index.d.ts +24 -0
  35. package/dist/src/services/legacy-ollama-index.js +61 -0
  36. package/dist/src/services/reranker.d.ts +3 -3
  37. package/dist/src/services/reranker.js +3 -3
  38. package/dist/src/setup.d.ts +37 -0
  39. package/dist/src/setup.js +111 -157
  40. package/docker/docker-compose.yml +5 -15
  41. package/docs/web-dashboard.md +36 -17
  42. package/package.json +1 -5
  43. package/dist/src/services/OllamaEmbedder.d.ts +0 -25
  44. package/dist/src/services/OllamaEmbedder.js +0 -111
@@ -1,111 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OllamaEmbedder = void 0;
4
- const ollama_1 = require("ollama");
5
- const LoggerService_1 = require("./LoggerService");
6
- const reranker_1 = require("./reranker");
7
- const constants_1 = require("../constants");
8
- class OllamaEmbedder {
9
- config;
10
- logger;
11
- dimensions;
12
- client;
13
- rerank;
14
- constructor(config, logger = LoggerService_1.LoggerService.silent(), deps = {}) {
15
- this.config = config;
16
- this.logger = logger;
17
- this.client = new ollama_1.Ollama({ host: config.embedding.baseURL });
18
- this.dimensions = config.embedding.dimensions ?? (0, constants_1.registryDimension)(config.embedding.model) ?? 0;
19
- this.rerank = (0, reranker_1.makeReranker)(config, logger, deps);
20
- }
21
- // Ollama has no query/document asymmetry — inputType is accepted and ignored.
22
- async embed(text, _inputType) {
23
- const { embedding } = await this.client.embeddings({
24
- model: this.config.embedding.model,
25
- prompt: text,
26
- });
27
- return embedding;
28
- }
29
- async embedBatch(texts, _inputType) {
30
- if (texts.length === 0)
31
- return [];
32
- try {
33
- // /api/embed accepts an array input and returns one vector per input.
34
- const res = await this.client.embed({ model: this.config.embedding.model, input: texts });
35
- if (res.embeddings?.length === texts.length)
36
- return res.embeddings;
37
- this.logger.warn('OllamaEmbedder: batch embed count mismatch, falling back to sequential', {
38
- expected: texts.length, got: res.embeddings?.length ?? 0,
39
- });
40
- }
41
- catch (err) {
42
- this.logger.warn('OllamaEmbedder: batch embed failed, falling back to sequential', {
43
- reason: err instanceof Error ? err.message : String(err),
44
- });
45
- }
46
- // Sequential fallback — the contract (one vector per input, in order) holds.
47
- const out = [];
48
- for (const t of texts)
49
- out.push(await this.embed(t));
50
- return out;
51
- }
52
- async listModels() {
53
- const res = await this.client.list();
54
- return res.models.map(m => m.name).filter(Boolean).sort();
55
- }
56
- /**
57
- * Pull the configured model if it is not already present locally, so a plain
58
- * `rag-index` works after switching to (or back to) a local model that was
59
- * never pulled — `rag-setup` is no longer the only place that fetches models.
60
- * A tagless model name (`bge-m3`) matches its `:latest`/tagged install.
61
- * Streams pull progress to the console: a live single-line bar on a TTY, or
62
- * de-duplicated status lines otherwise.
63
- */
64
- async ensureModelAvailable() {
65
- const model = this.config.embedding.model;
66
- try {
67
- const res = await this.client.list();
68
- const present = res.models.some(m => m.name === model || m.name.startsWith(`${model}:`));
69
- if (present)
70
- return;
71
- }
72
- catch (err) {
73
- // Can't list (Ollama unreachable?) — try the pull; its error is clearer.
74
- this.logger.warn('OllamaEmbedder: could not list models before pull', {
75
- reason: err instanceof Error ? err.message : String(err),
76
- });
77
- }
78
- console.log(`Pulling Ollama model "${model}" (not found locally)...`);
79
- this.logger.info('OllamaEmbedder: pulling model', { model });
80
- const stream = await this.client.pull({ model, stream: true });
81
- const isTty = Boolean(process.stdout.isTTY);
82
- let lastLen = 0;
83
- let lastLog = '';
84
- for await (const part of stream) {
85
- const out = ' ' + OllamaEmbedder.formatPullProgress(part);
86
- if (isTty) {
87
- process.stdout.write('\r' + out.padEnd(lastLen));
88
- lastLen = out.length;
89
- }
90
- else if (out !== lastLog) {
91
- console.log(out);
92
- lastLog = out;
93
- }
94
- }
95
- if (isTty && lastLen > 0)
96
- process.stdout.write('\r' + ' '.repeat(lastLen) + '\r');
97
- console.log(` ✓ ${model} ready.`);
98
- }
99
- static formatPullProgress(p) {
100
- const status = p.status ?? 'pulling';
101
- if (p.total && p.total > 0) {
102
- const pct = Math.min(100, Math.floor(((p.completed ?? 0) / p.total) * 100));
103
- const width = 24;
104
- const filled = Math.round((pct / 100) * width);
105
- const bar = '[' + '█'.repeat(filled) + '░'.repeat(width - filled) + ']';
106
- return `${status} ${bar} ${pct}% (${((p.completed ?? 0) / 1e6).toFixed(1)}/${(p.total / 1e6).toFixed(1)} MB)`;
107
- }
108
- return status;
109
- }
110
- }
111
- exports.OllamaEmbedder = OllamaEmbedder;