xindex 1.0.12 → 1.0.14

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 (53) hide show
  1. package/.mcp.json +4 -0
  2. package/README.md +2 -1
  3. package/apps/indexApp.ts +4 -4
  4. package/apps/mcpApp.ts +7 -7
  5. package/apps/run.index.ts +5 -5
  6. package/apps/run.mcp.ts +9 -9
  7. package/apps/run.reset.ts +3 -3
  8. package/apps/run.search.ts +3 -3
  9. package/apps/run.watch.ts +9 -9
  10. package/apps/watchApp.ts +7 -7
  11. package/apps/watchFileEventsApp.ts +6 -6
  12. package/{componets → components}/llm/embed.ts +4 -9
  13. package/components/llm/queryLLM.ts +31 -0
  14. package/features/indexContent.ts +5 -5
  15. package/features/removeContent.ts +1 -1
  16. package/features/resetIndex.ts +1 -1
  17. package/features/searchIndex.ts +4 -4
  18. package/package.json +1 -1
  19. package/componets/llm/queryLLM.ts +0 -20
  20. /package/{componets → components}/IType.ts +0 -0
  21. /package/{componets → components}/appId.ts +0 -0
  22. /package/{componets → components}/buildComponents.ts +0 -0
  23. /package/{componets → components}/config/DEFAULT_LOCATE_BATCH_SIZE.ts +0 -0
  24. /package/{componets → components}/config/INDEXING_BATCH_SIZE.ts +0 -0
  25. /package/{componets → components}/config/INDEXING_COALESCE_MAX_ITEMS.ts +0 -0
  26. /package/{componets → components}/config/INDEXING_COALESCE_MS.ts +0 -0
  27. /package/{componets → components}/config/WATCH_COALESCE_MS.ts +0 -0
  28. /package/{componets → components}/config/WATCH_FLUSH_MS.ts +0 -0
  29. /package/{componets → components}/config/loadConfig.ts +0 -0
  30. /package/{componets → components}/config/xindexConfig.ts +0 -0
  31. /package/{componets → components}/ignore/loadIgnoreChain.ts +0 -0
  32. /package/{componets → components}/index/coalesceIndexApi.ts +0 -0
  33. /package/{componets → components}/index/contentIndexDriver.ts +0 -0
  34. /package/{componets → components}/index/documentContentIndexDriver.ts +0 -0
  35. /package/{componets → components}/index/documentIndex.ts +0 -0
  36. /package/{componets → components}/index/formatSearchResults.ts +0 -0
  37. /package/{componets → components}/index/getIndexStats.ts +0 -0
  38. /package/{componets → components}/index/handleFileEvent.ts +0 -0
  39. /package/{componets → components}/index/indexApi.ts +0 -0
  40. /package/{componets → components}/index/vectraIndex.ts +0 -0
  41. /package/{componets → components}/index/watcherLock.ts +0 -0
  42. /package/{componets → components}/io/safeIndexBatch.ts +0 -0
  43. /package/{componets → components}/io/safeReadFile.ts +0 -0
  44. /package/{componets → components}/keywords/cleanUpKeywords.ts +0 -0
  45. /package/{componets → components}/keywords/extractKeywords.ts +0 -0
  46. /package/{componets → components}/keywords/refineKeywords.ts +0 -0
  47. /package/{componets → components}/locate/bm25.ts +0 -0
  48. /package/{componets → components}/locate/inMemoryIndex.ts +0 -0
  49. /package/{componets → components}/locate/locateInFile.ts +0 -0
  50. /package/{componets → components}/locate/windowsOf.ts +0 -0
  51. /package/{componets → components}/logger.ts +0 -0
  52. /package/{componets → components}/walkFiles.ts +0 -0
  53. /package/{componets → components}/watchFiles.ts +0 -0
package/.mcp.json CHANGED
@@ -1,5 +1,9 @@
1
1
  {
2
2
  "mcpServers": {
3
+ "fetch": {
4
+ "command": "docker",
5
+ "args": ["run", "-i", "--rm", "mcp/fetch"]
6
+ },
3
7
  "xindex": {
4
8
  "command": "xindex-mcp",
5
9
  "args": []
package/README.md CHANGED
@@ -6,7 +6,8 @@ Fully local, no cloud, no API keys, instant response.
6
6
  Ask **"where is auth handled?"** — get the right files, even when they don't contain the word *auth*.
7
7
 
8
8
  Local semantic code search for your codebase,
9
- w/ an MCP server so Claude Code searches your repo directly.
9
+ w/ an MCP so Claude Code searches your repo directly.
10
+
10
11
  Fewer hallucinations, fewer round-trips.
11
12
 
12
13
  ## Install
package/apps/indexApp.ts CHANGED
@@ -3,11 +3,11 @@ import {batch} from "../packages/streamx/src/batch.js";
3
3
  import {map} from "../packages/streamx/src/map.js";
4
4
  import {tap} from "../packages/streamx/src/tap.js";
5
5
  import {run} from "../packages/streamx/src/index.js";
6
- import {IWalkFiles} from "../componets/walkFiles.js";
6
+ import {IWalkFiles} from "../components/walkFiles.js";
7
7
  import {IIndexContent} from "../features/indexContent.js";
8
- import {ILogger} from "../componets/logger.js";
9
- import {INDEXING_BATCH_SIZE} from "../componets/config/INDEXING_BATCH_SIZE";
10
- import {SafeIndexBatch} from "../componets/io/safeIndexBatch.js";
8
+ import {ILogger} from "../components/logger.js";
9
+ import {INDEXING_BATCH_SIZE} from "../components/config/INDEXING_BATCH_SIZE";
10
+ import {SafeIndexBatch} from "../components/io/safeIndexBatch.js";
11
11
 
12
12
  export type IIndexApp = (inputs: string[]) => Promise<void>;
13
13
 
package/apps/mcpApp.ts CHANGED
@@ -2,15 +2,15 @@ import {McpServer} from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import {StdioServerTransport} from "@modelcontextprotocol/sdk/server/stdio.js";
3
3
  import {z} from "zod";
4
4
  import {IIndexApp} from "./indexApp.js";
5
- import {IGetIndexStats} from "../componets/index/getIndexStats.js";
5
+ import {IGetIndexStats} from "../components/index/getIndexStats.js";
6
6
  import {IResetIndex} from "../features/resetIndex.js";
7
- import {IWatchFiles} from "../componets/watchFiles.js";
8
- import {IHandleFileEvents} from "../componets/index/handleFileEvent.js";
9
- import {ILogger} from "../componets/logger.js";
7
+ import {IWatchFiles} from "../components/watchFiles.js";
8
+ import {IHandleFileEvents} from "../components/index/handleFileEvent.js";
9
+ import {ILogger} from "../components/logger.js";
10
10
  import {WatchFileEventsApp} from "./watchFileEventsApp.js";
11
- import {IWatcherLock} from "../componets/index/watcherLock.js";
12
- import {IXindexConfig} from "../componets/config/xindexConfig.js";
13
- import {FormatSearchResults} from "../componets/index/formatSearchResults.js";
11
+ import {IWatcherLock} from "../components/index/watcherLock.js";
12
+ import {IXindexConfig} from "../components/config/xindexConfig.js";
13
+ import {FormatSearchResults} from "../components/index/formatSearchResults.js";
14
14
  import {ISearchApp} from "./searchApp.js";
15
15
 
16
16
  export type IMcpApp = () => Promise<void>;
package/apps/run.index.ts CHANGED
@@ -1,9 +1,9 @@
1
- import {BuildComponents} from "../componets/buildComponents.js";
2
- import {BufferedLoggerToStdOut} from "../componets/logger.js";
3
- import {WalkFiles} from "../componets/walkFiles.js";
1
+ import {BuildComponents} from "../components/buildComponents.js";
2
+ import {BufferedLoggerToStdOut} from "../components/logger.js";
3
+ import {WalkFiles} from "../components/walkFiles.js";
4
4
  import {IndexApp} from "./indexApp.js";
5
- import {AppId} from "../componets/appId.js";
6
- import {INDEXING_COALESCE_MS} from "../componets/config/INDEXING_COALESCE_MS.js";
5
+ import {AppId} from "../components/appId.js";
6
+ import {INDEXING_COALESCE_MS} from "../components/config/INDEXING_COALESCE_MS.js";
7
7
 
8
8
  const appId = AppId();
9
9
  const cwd = process.cwd();
package/apps/run.mcp.ts CHANGED
@@ -1,16 +1,16 @@
1
- import {BuildComponents} from "../componets/buildComponents.js";
2
- import {HandleFileEvents} from "../componets/index/handleFileEvent.js";
3
- import {BufferedLoggerToStdErr} from "../componets/logger.js";
4
- import {WalkFiles} from "../componets/walkFiles.js";
5
- import {WatchFiles} from "../componets/watchFiles.js";
6
- import {WatcherLock} from "../componets/index/watcherLock.js";
1
+ import {BuildComponents} from "../components/buildComponents.js";
2
+ import {HandleFileEvents} from "../components/index/handleFileEvent.js";
3
+ import {BufferedLoggerToStdErr} from "../components/logger.js";
4
+ import {WalkFiles} from "../components/walkFiles.js";
5
+ import {WatchFiles} from "../components/watchFiles.js";
6
+ import {WatcherLock} from "../components/index/watcherLock.js";
7
7
  import {IndexApp} from "./indexApp.js";
8
8
  import {McpApp} from "./mcpApp.js";
9
9
  import {SearchApp} from "./searchApp.js";
10
10
  import {join} from "path";
11
- import {AppId} from "../componets/appId.js";
12
- import {INDEXING_COALESCE_MS} from "../componets/config/INDEXING_COALESCE_MS.js";
13
- import {WATCH_COALESCE_MS} from "../componets/config/WATCH_COALESCE_MS.js";
11
+ import {AppId} from "../components/appId.js";
12
+ import {INDEXING_COALESCE_MS} from "../components/config/INDEXING_COALESCE_MS.js";
13
+ import {WATCH_COALESCE_MS} from "../components/config/WATCH_COALESCE_MS.js";
14
14
 
15
15
  const args = process.argv.slice(2);
16
16
  const watchDirArg = args.find(a => a.startsWith("--watch-dir="));
package/apps/run.reset.ts CHANGED
@@ -1,6 +1,6 @@
1
- import {BuildComponents} from "../componets/buildComponents.js";
2
- import {BufferedLoggerToStdOut} from "../componets/logger.js";
3
- import {AppId} from "../componets/appId.js";
1
+ import {BuildComponents} from "../components/buildComponents.js";
2
+ import {BufferedLoggerToStdOut} from "../components/logger.js";
3
+ import {AppId} from "../components/appId.js";
4
4
 
5
5
  const appId = AppId();
6
6
  const log = BufferedLoggerToStdOut();
@@ -1,7 +1,7 @@
1
- import {BuildComponents} from "../componets/buildComponents.js";
2
- import {BufferedLoggerToStdOut} from "../componets/logger.js";
1
+ import {BuildComponents} from "../components/buildComponents.js";
2
+ import {BufferedLoggerToStdOut} from "../components/logger.js";
3
3
  import {SearchApp} from "./searchApp.js";
4
- import {FormatSearchResults} from "../componets/index/formatSearchResults.js";
4
+ import {FormatSearchResults} from "../components/index/formatSearchResults.js";
5
5
 
6
6
  const log = BufferedLoggerToStdOut();
7
7
  const {searchContentIndex} = await BuildComponents({log});
package/apps/run.watch.ts CHANGED
@@ -1,14 +1,14 @@
1
- import {BuildComponents} from "../componets/buildComponents.js";
2
- import {HandleFileEvents} from "../componets/index/handleFileEvent.js";
3
- import {BufferedLoggerToStdOut} from "../componets/logger.js";
4
- import {WalkFiles} from "../componets/walkFiles.js";
5
- import {WatchFiles} from "../componets/watchFiles.js";
6
- import {WatcherLock} from "../componets/index/watcherLock.js";
1
+ import {BuildComponents} from "../components/buildComponents.js";
2
+ import {HandleFileEvents} from "../components/index/handleFileEvent.js";
3
+ import {BufferedLoggerToStdOut} from "../components/logger.js";
4
+ import {WalkFiles} from "../components/walkFiles.js";
5
+ import {WatchFiles} from "../components/watchFiles.js";
6
+ import {WatcherLock} from "../components/index/watcherLock.js";
7
7
  import {WatchApp} from "./watchApp.js";
8
- import {AppId} from "../componets/appId.js";
8
+ import {AppId} from "../components/appId.js";
9
9
  import {join} from "path";
10
- import {WATCH_COALESCE_MS} from "../componets/config/WATCH_COALESCE_MS.js";
11
- import {INDEXING_COALESCE_MS} from "../componets/config/INDEXING_COALESCE_MS.js";
10
+ import {WATCH_COALESCE_MS} from "../components/config/WATCH_COALESCE_MS.js";
11
+ import {INDEXING_COALESCE_MS} from "../components/config/INDEXING_COALESCE_MS.js";
12
12
 
13
13
  const cwd = process.cwd();
14
14
  const log = BufferedLoggerToStdOut();
package/apps/watchApp.ts CHANGED
@@ -3,15 +3,15 @@ import {batch} from "../packages/streamx/src/batch.js";
3
3
  import {map} from "../packages/streamx/src/map.js";
4
4
  import {tap} from "../packages/streamx/src/tap.js";
5
5
  import {run} from "../packages/streamx/src/index.js";
6
- import {IWalkFiles} from "../componets/walkFiles.js";
7
- import {IWatchFiles} from "../componets/watchFiles.js";
8
- import {IHandleFileEvents} from "../componets/index/handleFileEvent.js";
9
- import {ILogger} from "../componets/logger.js";
10
- import {IWatcherLock} from "../componets/index/watcherLock.js";
6
+ import {IWalkFiles} from "../components/walkFiles.js";
7
+ import {IWatchFiles} from "../components/watchFiles.js";
8
+ import {IHandleFileEvents} from "../components/index/handleFileEvent.js";
9
+ import {ILogger} from "../components/logger.js";
10
+ import {IWatcherLock} from "../components/index/watcherLock.js";
11
11
  import {WatchFileEventsApp} from "./watchFileEventsApp.js";
12
12
  import {IIndexContent} from "../features/indexContent.js";
13
- import {INDEXING_BATCH_SIZE} from "../componets/config/INDEXING_BATCH_SIZE";
14
- import {SafeIndexBatch} from "../componets/io/safeIndexBatch.js";
13
+ import {INDEXING_BATCH_SIZE} from "../components/config/INDEXING_BATCH_SIZE";
14
+ import {SafeIndexBatch} from "../components/io/safeIndexBatch.js";
15
15
 
16
16
  export type IWatchApp = {
17
17
  run: (inputs: string[]) => Promise<void>;
@@ -1,13 +1,13 @@
1
- import {IWatchFiles} from "../componets/watchFiles.js";
2
- import {IHandleFileEvents} from "../componets/index/handleFileEvent.js";
3
- import {ILogger} from "../componets/logger.js";
4
- import {IWatcherLock} from "../componets/index/watcherLock.js";
1
+ import {IWatchFiles} from "../components/watchFiles.js";
2
+ import {IHandleFileEvents} from "../components/index/handleFileEvent.js";
3
+ import {ILogger} from "../components/logger.js";
4
+ import {IWatcherLock} from "../components/index/watcherLock.js";
5
5
  import {from} from "../packages/streamx/src/from.js";
6
6
  import {batchTimed} from "../packages/streamx/src/batchTimed.js";
7
7
  import {map} from "../packages/streamx/src/map.js";
8
8
  import {run} from "../packages/streamx/src/index.js";
9
- import {INDEXING_BATCH_SIZE} from "../componets/config/INDEXING_BATCH_SIZE.js";
10
- import {WATCH_FLUSH_MS} from "../componets/config/WATCH_FLUSH_MS.js";
9
+ import {INDEXING_BATCH_SIZE} from "../components/config/INDEXING_BATCH_SIZE.js";
10
+ import {WATCH_FLUSH_MS} from "../components/config/WATCH_FLUSH_MS.js";
11
11
 
12
12
  export type IWatchFileEventsApp = () => void;
13
13
 
@@ -7,17 +7,12 @@ export type IEmbed = (text: string) => Promise<number[]>;
7
7
  type Pooling = "none" | "mean" | "cls" | "first_token" | "eos" | "last_token";
8
8
 
9
9
  export function Embed({pooling, normalize}: {pooling: Pooling, normalize: boolean}): IEmbed {
10
- let embedderPromise: Promise<any> | null = null;
11
-
12
- function getEmbedder() {
13
- if (!embedderPromise) {
14
- embedderPromise = pipeline("feature-extraction", MODEL);
15
- }
16
- return embedderPromise;
17
- }
10
+ let embedder: any = undefined
18
11
 
19
12
  return async function embed(text) {
20
- const embedder = await getEmbedder();
13
+ if (!embedder) {
14
+ embedder = await pipeline("feature-extraction", MODEL);
15
+ }
21
16
  const result = await embedder(text, {pooling, normalize});
22
17
  return Array.from(result.data as Float32Array);
23
18
  }
@@ -0,0 +1,31 @@
1
+ import {pipeline} from "@huggingface/transformers";
2
+
3
+
4
+ export type IQueryLLM = (prompt: string, input: string, maxTokens?: number) => Promise<string>;
5
+
6
+ const MODEL = "HuggingFaceTB/SmolLM2-135M-Instruct";
7
+
8
+ export function QueryLLM({maxTokens, model = MODEL}: {
9
+ maxTokens: number,
10
+ model?: string
11
+ }): IQueryLLM {
12
+ let generator: any = undefined;
13
+
14
+ return async function queryLLM(prompt, input, limit = maxTokens) {
15
+ if (!generator) {
16
+ generator = await pipeline(
17
+ "text-generation",
18
+ model
19
+ );
20
+ }
21
+
22
+ const messages = [
23
+ {role: "system", content: prompt},
24
+ {role: "user", content: input},
25
+ ];
26
+
27
+ const output = await generator(messages, {max_new_tokens: limit ?? maxTokens});
28
+ return (output[0].generated_text.at(-1)?.content as string) ?? "";
29
+ }
30
+ }
31
+
@@ -1,8 +1,8 @@
1
- import {IndexCommandType, IIndexApi} from "../componets/index/indexApi.js";
2
- import {IExtractKeywords} from "../componets/keywords/extractKeywords.js";
3
- import {ICleanUpKeywords} from "../componets/keywords/cleanUpKeywords.js";
4
- import {IEmbed} from "../componets/llm/embed.js";
5
- import {ILogger} from "../componets/logger.js";
1
+ import {IndexCommandType, IIndexApi} from "../components/index/indexApi.js";
2
+ import {IExtractKeywords} from "../components/keywords/extractKeywords.js";
3
+ import {ICleanUpKeywords} from "../components/keywords/cleanUpKeywords.js";
4
+ import {IEmbed} from "../components/llm/embed.js";
5
+ import {ILogger} from "../components/logger.js";
6
6
 
7
7
  export type IIndexContent = (items: Array<{id: string, content: string}>) => Promise<void>;
8
8
 
@@ -1,4 +1,4 @@
1
- import {IndexCommandType, IIndexApi} from "../componets/index/indexApi.js";
1
+ import {IndexCommandType, IIndexApi} from "../components/index/indexApi.js";
2
2
 
3
3
  export type IRemoveContent = (ids: string[]) => Promise<void>;
4
4
 
@@ -1,4 +1,4 @@
1
- import {IndexCommandType, IIndexApi} from "../componets/index/indexApi.js";
1
+ import {IndexCommandType, IIndexApi} from "../components/index/indexApi.js";
2
2
 
3
3
  export type IResetIndex = () => Promise<void>;
4
4
 
@@ -1,8 +1,8 @@
1
1
  import {LocalIndex} from "vectra";
2
- import {IEmbed} from "../componets/llm/embed.js";
3
- import {IExtractKeywords} from "../componets/keywords/extractKeywords.js";
4
- import {ICleanUpKeywords} from "../componets/keywords/cleanUpKeywords.js";
5
- import {ILocateInFile} from "../componets/locate/locateInFile.js";
2
+ import {IEmbed} from "../components/llm/embed.js";
3
+ import {IExtractKeywords} from "../components/keywords/extractKeywords.js";
4
+ import {ICleanUpKeywords} from "../components/keywords/cleanUpKeywords.js";
5
+ import {ILocateInFile} from "../components/locate/locateInFile.js";
6
6
 
7
7
  export type IIndexRecord = {
8
8
  score: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xindex",
3
- "version": "1.0.12",
3
+ "version": "1.0.14",
4
4
  "description": "Local semantic code search — index codebase, search by meaning or keywords",
5
5
  "type": "module",
6
6
  "main": "xindex.ts",
@@ -1,20 +0,0 @@
1
- import {pipeline} from "@huggingface/transformers";
2
-
3
- const generator = await pipeline(
4
- "text-generation",
5
- "HuggingFaceTB/SmolLM2-135M-Instruct"
6
- );
7
-
8
- export type IQueryLLM = (prompt: string, input: string, maxTokens?: number) => Promise<string>;
9
-
10
- export function QueryLLM({maxTokens}: { maxTokens: number }): IQueryLLM {
11
- return async function queryLLM(prompt, input, overrideMaxTokens?) {
12
- const messages = [
13
- {role: "system", content: prompt},
14
- {role: "user", content: input},
15
- ];
16
- const output = await generator(messages, {max_new_tokens: overrideMaxTokens ?? maxTokens});
17
- return (output[0].generated_text.at(-1)?.content as string) ?? "";
18
- }
19
- }
20
-
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes