@millstone/synapse-context-mcp 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 (140) hide show
  1. package/README.md +217 -0
  2. package/dist/bundled/code-structure.js +12427 -0
  3. package/dist/bundled/file-search.js +40278 -0
  4. package/dist/bundled/semantic-search.js +40245 -0
  5. package/dist/bundled/tree-sitter-wasms/tree-sitter-bash.wasm +0 -0
  6. package/dist/bundled/tree-sitter-wasms/tree-sitter-c.wasm +0 -0
  7. package/dist/bundled/tree-sitter-wasms/tree-sitter-c_sharp.wasm +0 -0
  8. package/dist/bundled/tree-sitter-wasms/tree-sitter-cpp.wasm +0 -0
  9. package/dist/bundled/tree-sitter-wasms/tree-sitter-css.wasm +0 -0
  10. package/dist/bundled/tree-sitter-wasms/tree-sitter-dart.wasm +0 -0
  11. package/dist/bundled/tree-sitter-wasms/tree-sitter-elisp.wasm +0 -0
  12. package/dist/bundled/tree-sitter-wasms/tree-sitter-elixir.wasm +0 -0
  13. package/dist/bundled/tree-sitter-wasms/tree-sitter-elm.wasm +0 -0
  14. package/dist/bundled/tree-sitter-wasms/tree-sitter-embedded_template.wasm +0 -0
  15. package/dist/bundled/tree-sitter-wasms/tree-sitter-go.wasm +0 -0
  16. package/dist/bundled/tree-sitter-wasms/tree-sitter-html.wasm +0 -0
  17. package/dist/bundled/tree-sitter-wasms/tree-sitter-java.wasm +0 -0
  18. package/dist/bundled/tree-sitter-wasms/tree-sitter-javascript.wasm +0 -0
  19. package/dist/bundled/tree-sitter-wasms/tree-sitter-json.wasm +0 -0
  20. package/dist/bundled/tree-sitter-wasms/tree-sitter-kotlin.wasm +0 -0
  21. package/dist/bundled/tree-sitter-wasms/tree-sitter-lua.wasm +0 -0
  22. package/dist/bundled/tree-sitter-wasms/tree-sitter-objc.wasm +0 -0
  23. package/dist/bundled/tree-sitter-wasms/tree-sitter-ocaml.wasm +0 -0
  24. package/dist/bundled/tree-sitter-wasms/tree-sitter-php.wasm +0 -0
  25. package/dist/bundled/tree-sitter-wasms/tree-sitter-python.wasm +0 -0
  26. package/dist/bundled/tree-sitter-wasms/tree-sitter-ql.wasm +0 -0
  27. package/dist/bundled/tree-sitter-wasms/tree-sitter-rescript.wasm +0 -0
  28. package/dist/bundled/tree-sitter-wasms/tree-sitter-ruby.wasm +0 -0
  29. package/dist/bundled/tree-sitter-wasms/tree-sitter-rust.wasm +0 -0
  30. package/dist/bundled/tree-sitter-wasms/tree-sitter-scala.wasm +0 -0
  31. package/dist/bundled/tree-sitter-wasms/tree-sitter-solidity.wasm +0 -0
  32. package/dist/bundled/tree-sitter-wasms/tree-sitter-swift.wasm +0 -0
  33. package/dist/bundled/tree-sitter-wasms/tree-sitter-systemrdl.wasm +0 -0
  34. package/dist/bundled/tree-sitter-wasms/tree-sitter-tlaplus.wasm +0 -0
  35. package/dist/bundled/tree-sitter-wasms/tree-sitter-toml.wasm +0 -0
  36. package/dist/bundled/tree-sitter-wasms/tree-sitter-tsx.wasm +0 -0
  37. package/dist/bundled/tree-sitter-wasms/tree-sitter-typescript.wasm +0 -0
  38. package/dist/bundled/tree-sitter-wasms/tree-sitter-vue.wasm +0 -0
  39. package/dist/bundled/tree-sitter-wasms/tree-sitter-yaml.wasm +0 -0
  40. package/dist/bundled/tree-sitter-wasms/tree-sitter-zig.wasm +0 -0
  41. package/dist/bundled/tree-sitter-wasms/tree-sitter.wasm +0 -0
  42. package/dist/bundled/tree-sitter.wasm +0 -0
  43. package/dist/continue/ContinueIDE.d.ts +70 -0
  44. package/dist/continue/ContinueIDE.d.ts.map +1 -0
  45. package/dist/continue/ContinueIDE.js +251 -0
  46. package/dist/continue/ContinueIDE.js.map +1 -0
  47. package/dist/embeddings/embeddings-provider.d.ts +53 -0
  48. package/dist/embeddings/embeddings-provider.d.ts.map +1 -0
  49. package/dist/embeddings/embeddings-provider.js +138 -0
  50. package/dist/embeddings/embeddings-provider.js.map +1 -0
  51. package/dist/embeddings/index.d.ts +10 -0
  52. package/dist/embeddings/index.d.ts.map +1 -0
  53. package/dist/embeddings/index.js +10 -0
  54. package/dist/embeddings/index.js.map +1 -0
  55. package/dist/embeddings/vector-index.d.ts +43 -0
  56. package/dist/embeddings/vector-index.d.ts.map +1 -0
  57. package/dist/embeddings/vector-index.js +174 -0
  58. package/dist/embeddings/vector-index.js.map +1 -0
  59. package/dist/index.d.ts +3 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +53 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/selection/SelectionManager.d.ts +90 -0
  64. package/dist/selection/SelectionManager.d.ts.map +1 -0
  65. package/dist/selection/SelectionManager.js +167 -0
  66. package/dist/selection/SelectionManager.js.map +1 -0
  67. package/dist/server.d.ts +28 -0
  68. package/dist/server.d.ts.map +1 -0
  69. package/dist/server.js +480 -0
  70. package/dist/server.js.map +1 -0
  71. package/dist/shims/continue-worker-paths.d.ts +47 -0
  72. package/dist/shims/continue-worker-paths.d.ts.map +1 -0
  73. package/dist/shims/continue-worker-paths.js +94 -0
  74. package/dist/shims/continue-worker-paths.js.map +1 -0
  75. package/dist/shims/workerpool-shim.d.ts +43 -0
  76. package/dist/shims/workerpool-shim.d.ts.map +1 -0
  77. package/dist/shims/workerpool-shim.js +37 -0
  78. package/dist/shims/workerpool-shim.js.map +1 -0
  79. package/dist/tools/code-structure.d.ts +36 -0
  80. package/dist/tools/code-structure.d.ts.map +1 -0
  81. package/dist/tools/code-structure.js +131 -0
  82. package/dist/tools/code-structure.js.map +1 -0
  83. package/dist/tools/file-search.d.ts +35 -0
  84. package/dist/tools/file-search.d.ts.map +1 -0
  85. package/dist/tools/file-search.js +286 -0
  86. package/dist/tools/file-search.js.map +1 -0
  87. package/dist/tools/file-tree.d.ts +18 -0
  88. package/dist/tools/file-tree.d.ts.map +1 -0
  89. package/dist/tools/file-tree.js +45 -0
  90. package/dist/tools/file-tree.js.map +1 -0
  91. package/dist/tools/manage-selection.d.ts +28 -0
  92. package/dist/tools/manage-selection.d.ts.map +1 -0
  93. package/dist/tools/manage-selection.js +98 -0
  94. package/dist/tools/manage-selection.js.map +1 -0
  95. package/dist/tools/read-file.d.ts +19 -0
  96. package/dist/tools/read-file.d.ts.map +1 -0
  97. package/dist/tools/read-file.js +35 -0
  98. package/dist/tools/read-file.js.map +1 -0
  99. package/dist/tools/semantic-search.d.ts +50 -0
  100. package/dist/tools/semantic-search.d.ts.map +1 -0
  101. package/dist/tools/semantic-search.js +243 -0
  102. package/dist/tools/semantic-search.js.map +1 -0
  103. package/dist/tools/workspace-context.d.ts +20 -0
  104. package/dist/tools/workspace-context.d.ts.map +1 -0
  105. package/dist/tools/workspace-context.js +36 -0
  106. package/dist/tools/workspace-context.js.map +1 -0
  107. package/dist/tree-sitter/code-snippet-queries/bash.scm +7 -0
  108. package/dist/tree-sitter/code-snippet-queries/c.scm +34 -0
  109. package/dist/tree-sitter/code-snippet-queries/c_sharp.scm +42 -0
  110. package/dist/tree-sitter/code-snippet-queries/cpp.scm +34 -0
  111. package/dist/tree-sitter/code-snippet-queries/dart.scm +33 -0
  112. package/dist/tree-sitter/code-snippet-queries/elisp.scm +21 -0
  113. package/dist/tree-sitter/code-snippet-queries/elixir.scm +32 -0
  114. package/dist/tree-sitter/code-snippet-queries/elm.scm +17 -0
  115. package/dist/tree-sitter/code-snippet-queries/go.scm +28 -0
  116. package/dist/tree-sitter/code-snippet-queries/java.scm +34 -0
  117. package/dist/tree-sitter/code-snippet-queries/javascript.scm +22 -0
  118. package/dist/tree-sitter/code-snippet-queries/kotlin.scm +32 -0
  119. package/dist/tree-sitter/code-snippet-queries/lua.scm +34 -0
  120. package/dist/tree-sitter/code-snippet-queries/ocaml.scm +27 -0
  121. package/dist/tree-sitter/code-snippet-queries/php.scm +43 -0
  122. package/dist/tree-sitter/code-snippet-queries/python.scm +17 -0
  123. package/dist/tree-sitter/code-snippet-queries/rescript.scm +23 -0
  124. package/dist/tree-sitter/code-snippet-queries/ruby.scm +33 -0
  125. package/dist/tree-sitter/code-snippet-queries/rust.scm +42 -0
  126. package/dist/tree-sitter/code-snippet-queries/scala.scm +32 -0
  127. package/dist/tree-sitter/code-snippet-queries/solidity.scm +33 -0
  128. package/dist/tree-sitter/code-snippet-queries/swift.scm +40 -0
  129. package/dist/tree-sitter/code-snippet-queries/tsx.scm +54 -0
  130. package/dist/tree-sitter/code-snippet-queries/typescript.scm +28 -0
  131. package/dist/tree-sitter/code-snippet-queries/zig.scm +16 -0
  132. package/dist/utils/file-walker.d.ts +19 -0
  133. package/dist/utils/file-walker.d.ts.map +1 -0
  134. package/dist/utils/file-walker.js +82 -0
  135. package/dist/utils/file-walker.js.map +1 -0
  136. package/dist/utils/token-counter.d.ts +16 -0
  137. package/dist/utils/token-counter.d.ts.map +1 -0
  138. package/dist/utils/token-counter.js +30 -0
  139. package/dist/utils/token-counter.js.map +1 -0
  140. package/package.json +64 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC/F,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,GACxB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Embeddings module for Context-MCP
3
+ *
4
+ * Provides semantic search capabilities using:
5
+ * - TransformersJS embeddings (all-MiniLM-L6-v2)
6
+ * - LanceDB vector storage and ANN search
7
+ */
8
+ export { ContextMcpEmbeddingsProvider, getEmbeddingsProvider } from './embeddings-provider.js';
9
+ export { getLanceDbIndex, buildVectorIndex, vectorSearch, isVectorSearchAvailable, } from './vector-index.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC/F,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,GACxB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Vector Index Wrapper for Context-MCP
3
+ *
4
+ * This wraps Continue's LanceDbIndex to provide vector-based semantic search
5
+ * for code files. Uses all-MiniLM-L6-v2 embeddings and LanceDB for fast
6
+ * approximate nearest neighbor (ANN) search.
7
+ *
8
+ * The index is built incrementally and persisted to disk at ~/.continue/index/lancedb/
9
+ *
10
+ * @see docs/BUNDLING_SOLUTION.md for architecture details
11
+ */
12
+ import type { IndexTag, Chunk } from '@continuedev/core';
13
+ import { LanceDbIndex } from '@continuedev/core/dist/indexing/LanceDbIndex.js';
14
+ import type { ContinueIDE } from '../continue/ContinueIDE.js';
15
+ /**
16
+ * Initialize or get the LanceDbIndex singleton.
17
+ * Returns null if LanceDB fails to load (unsupported platform).
18
+ */
19
+ export declare function getLanceDbIndex(): Promise<LanceDbIndex | null>;
20
+ /**
21
+ * Build vector embeddings index for all workspace directories.
22
+ * Returns array of IndexTags for querying.
23
+ */
24
+ export declare function buildVectorIndex(workspaceDirs: string[], ide: ContinueIDE): Promise<IndexTag[]>;
25
+ /**
26
+ * Search using vector embeddings for semantic similarity.
27
+ */
28
+ export declare function vectorSearch(query: string, workspaceDirs: string[], ide: ContinueIDE, options?: {
29
+ maxResults?: number;
30
+ filterDirectory?: string;
31
+ }): Promise<Chunk[]>;
32
+ /**
33
+ * Check if LanceDB is available on this platform.
34
+ */
35
+ export declare function isVectorSearchAvailable(): Promise<boolean>;
36
+ declare const _default: {
37
+ getLanceDbIndex: typeof getLanceDbIndex;
38
+ buildVectorIndex: typeof buildVectorIndex;
39
+ vectorSearch: typeof vectorSearch;
40
+ isVectorSearchAvailable: typeof isVectorSearchAvailable;
41
+ };
42
+ export default _default;
43
+ //# sourceMappingURL=vector-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-index.d.ts","sourceRoot":"","sources":["../../src/embeddings/vector-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAgB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAC;AAI/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAS9D;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAkCpE;AAiFD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EAAE,EACvB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,QAAQ,EAAE,CAAC,CAuCrB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EAAE,EACvB,GAAG,EAAE,WAAW,EAChB,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CACrB,GACL,OAAO,CAAC,KAAK,EAAE,CAAC,CAsClB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC,CAGhE;;;;;;;AAED,wBAKE"}
@@ -0,0 +1,174 @@
1
+ import { promises as fs } from "node:fs";
2
+ import { LanceDbIndex } from "@continuedev/core/dist/indexing/LanceDbIndex.js";
3
+ import { getComputeDeleteAddRemove } from "@continuedev/core/dist/indexing/refreshIndex.js";
4
+ import { getEmbeddingsProvider } from "./embeddings-provider.js";
5
+ import { FileWalker } from "../utils/file-walker.js";
6
+ const indexedDirs = /* @__PURE__ */ new Set();
7
+ let lanceDbIndex = null;
8
+ let indexInitPromise = null;
9
+ async function getLanceDbIndex() {
10
+ if (lanceDbIndex !== null) {
11
+ return lanceDbIndex;
12
+ }
13
+ if (indexInitPromise !== null) {
14
+ return indexInitPromise;
15
+ }
16
+ indexInitPromise = (async () => {
17
+ try {
18
+ console.error("[vector-index] Initializing LanceDB...");
19
+ const embeddingsProvider = await getEmbeddingsProvider();
20
+ const readFile = async (filepath) => {
21
+ return await fs.readFile(filepath, "utf-8");
22
+ };
23
+ lanceDbIndex = await LanceDbIndex.create(embeddingsProvider, readFile);
24
+ if (lanceDbIndex) {
25
+ console.error("[vector-index] LanceDB initialized successfully");
26
+ } else {
27
+ console.error("[vector-index] LanceDB not available on this platform");
28
+ }
29
+ return lanceDbIndex;
30
+ } catch (error) {
31
+ console.error("[vector-index] Failed to initialize LanceDB:", error);
32
+ return null;
33
+ }
34
+ })();
35
+ return indexInitPromise;
36
+ }
37
+ async function buildVectorIndexForDir(workspaceDir, ide) {
38
+ const index = await getLanceDbIndex();
39
+ if (!index) {
40
+ console.error("[vector-index] LanceDB not available, skipping vector indexing");
41
+ return null;
42
+ }
43
+ console.error(`[vector-index] Building embeddings index for: ${workspaceDir}`);
44
+ const tag = {
45
+ branch: "main",
46
+ // TODO: Detect from git
47
+ directory: workspaceDir,
48
+ artifactId: index.artifactId
49
+ };
50
+ const walker = new FileWalker(workspaceDir);
51
+ const allFiles = await walker.walk();
52
+ const fileStats = {};
53
+ for (const file of allFiles) {
54
+ try {
55
+ const stats = await fs.stat(file);
56
+ fileStats[file] = {
57
+ size: stats.size,
58
+ lastModified: stats.mtimeMs
59
+ };
60
+ } catch (error) {
61
+ }
62
+ }
63
+ const [results, _pathsAndCacheKeys, markComplete] = await getComputeDeleteAddRemove(
64
+ tag,
65
+ fileStats,
66
+ async (path) => await fs.readFile(path, "utf-8"),
67
+ void 0
68
+ // repoName
69
+ );
70
+ console.error(
71
+ `[vector-index] Indexing ${results.compute.length} files, adding tags to ${results.addTag.length}, removing ${results.del.length}...`
72
+ );
73
+ if (results.compute.length === 0 && results.addTag.length === 0) {
74
+ console.error("[vector-index] No files to index, using cached embeddings");
75
+ indexedDirs.add(workspaceDir);
76
+ return tag;
77
+ }
78
+ try {
79
+ for await (const progress of index.update(tag, results, markComplete, void 0)) {
80
+ if (progress.status === "indexing") {
81
+ const pct = Math.round(progress.progress * 100);
82
+ if (pct % 20 === 0 || pct >= 95) {
83
+ console.error(`[vector-index] Embeddings progress: ${pct}% - ${progress.desc}`);
84
+ }
85
+ }
86
+ }
87
+ console.error(`[vector-index] \u2705 Embeddings index built for ${workspaceDir}`);
88
+ indexedDirs.add(workspaceDir);
89
+ return tag;
90
+ } catch (error) {
91
+ console.error(`[vector-index] \u274C Error building embeddings index:`, error);
92
+ throw error;
93
+ }
94
+ }
95
+ async function buildVectorIndex(workspaceDirs, ide) {
96
+ const tags = [];
97
+ const dirsToIndex = workspaceDirs.filter((dir) => !indexedDirs.has(dir));
98
+ if (dirsToIndex.length === 0) {
99
+ console.error("[vector-index] All directories already indexed");
100
+ const index2 = await getLanceDbIndex();
101
+ return workspaceDirs.map((dir) => ({
102
+ branch: "main",
103
+ directory: dir,
104
+ artifactId: index2?.artifactId || "vectordb::transformers.js::all-MiniLM-L6-v2"
105
+ }));
106
+ }
107
+ console.error(`[vector-index] Building embeddings for ${dirsToIndex.length} directory(ies)...`);
108
+ for (const dir of dirsToIndex) {
109
+ const tag = await buildVectorIndexForDir(dir, ide);
110
+ if (tag) {
111
+ tags.push(tag);
112
+ }
113
+ }
114
+ const index = await getLanceDbIndex();
115
+ for (const dir of workspaceDirs) {
116
+ if (!dirsToIndex.includes(dir)) {
117
+ tags.push({
118
+ branch: "main",
119
+ directory: dir,
120
+ artifactId: index?.artifactId || "vectordb::transformers.js::all-MiniLM-L6-v2"
121
+ });
122
+ }
123
+ }
124
+ return tags;
125
+ }
126
+ async function vectorSearch(query, workspaceDirs, ide, options = {}) {
127
+ const index = await getLanceDbIndex();
128
+ if (!index) {
129
+ console.error("[vector-index] LanceDB not available, returning empty results");
130
+ return [];
131
+ }
132
+ const maxResults = options.maxResults || 20;
133
+ const tags = await buildVectorIndex(workspaceDirs, ide);
134
+ if (tags.length === 0) {
135
+ console.error("[vector-index] No indexed directories, returning empty results");
136
+ return [];
137
+ }
138
+ const branchAndDirs = tags.map((tag) => ({
139
+ branch: tag.branch,
140
+ directory: tag.directory
141
+ }));
142
+ try {
143
+ const startTime = Date.now();
144
+ const results = await index.retrieve(
145
+ query,
146
+ maxResults,
147
+ branchAndDirs,
148
+ options.filterDirectory
149
+ );
150
+ const elapsed = Date.now() - startTime;
151
+ console.error(`[vector-index] Retrieved ${results.length} results in ${elapsed}ms`);
152
+ return results;
153
+ } catch (error) {
154
+ console.error("[vector-index] Search error:", error);
155
+ return [];
156
+ }
157
+ }
158
+ async function isVectorSearchAvailable() {
159
+ const index = await getLanceDbIndex();
160
+ return index !== null;
161
+ }
162
+ var vector_index_default = {
163
+ getLanceDbIndex,
164
+ buildVectorIndex,
165
+ vectorSearch,
166
+ isVectorSearchAvailable
167
+ };
168
+ export {
169
+ buildVectorIndex,
170
+ vector_index_default as default,
171
+ getLanceDbIndex,
172
+ isVectorSearchAvailable,
173
+ vectorSearch
174
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-index.js","sourceRoot":"","sources":["../../src/embeddings/vector-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env node
2
+ import { ContextMCPServer } from './server.js';
3
+ /**
4
+ * Entry point for Context MCP Server
5
+ *
6
+ * Uses Continue's FTS5 search and tree-sitter for fast, accurate code analysis.
7
+ *
8
+ * Environment Variables:
9
+ * - WORKSPACE_DIRS: Comma-separated list of directories to index (e.g., "/path/to/repoA,/path/to/synapse")
10
+ * - WORKSPACE_DIR: Single directory (legacy, used if WORKSPACE_DIRS not set)
11
+ *
12
+ * Falls back to process.cwd() if neither is set.
13
+ */
14
+ function parseWorkspaceDirs() {
15
+ // Check for multi-directory config first
16
+ const workspaceDirs = process.env.WORKSPACE_DIRS;
17
+ if (workspaceDirs) {
18
+ return workspaceDirs
19
+ .split(',')
20
+ .map(dir => dir.trim())
21
+ .filter(dir => dir.length > 0);
22
+ }
23
+ // Fall back to single directory (legacy)
24
+ const workspaceDir = process.env.WORKSPACE_DIR || process.cwd();
25
+ return [workspaceDir];
26
+ }
27
+ async function main() {
28
+ const workspaceDirs = parseWorkspaceDirs();
29
+ console.error(`Starting Context MCP Server for ${workspaceDirs.length} workspace(s):`);
30
+ workspaceDirs.forEach(dir => console.error(` - ${dir}`));
31
+ console.error('Features: FTS5 search (BM25), Tree-sitter code structure');
32
+ try {
33
+ const server = new ContextMCPServer(workspaceDirs);
34
+ // Handle cleanup on exit
35
+ process.on('SIGINT', () => {
36
+ console.error('Shutting down...');
37
+ server.dispose();
38
+ process.exit(0);
39
+ });
40
+ process.on('SIGTERM', () => {
41
+ console.error('Shutting down...');
42
+ server.dispose();
43
+ process.exit(0);
44
+ });
45
+ await server.run();
46
+ }
47
+ catch (error) {
48
+ console.error('Fatal error:', error);
49
+ process.exit(1);
50
+ }
51
+ }
52
+ main();
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;GAUG;AAEH,SAAS,kBAAkB;IACzB,yCAAyC;IACzC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACjD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,aAAa;aACjB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;aACtB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,yCAAyC;IACzC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAChE,OAAO,CAAC,YAAY,CAAC,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAC;IAE3C,OAAO,CAAC,KAAK,CAAC,mCAAmC,aAAa,CAAC,MAAM,gBAAgB,CAAC,CAAC;IACvF,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAE1E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAEnD,yBAAyB;QACzB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAClC,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACzB,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAClC,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1,90 @@
1
+ export type SelectionMode = 'full' | 'slices' | 'codemap_only';
2
+ export interface Slice {
3
+ startLine: number;
4
+ endLine: number;
5
+ description?: string;
6
+ }
7
+ export interface SelectedFile {
8
+ path: string;
9
+ mode: SelectionMode;
10
+ slices?: Slice[];
11
+ }
12
+ export interface SelectionSummary {
13
+ files: SelectedFile[];
14
+ totalFiles: number;
15
+ totalTokens: number;
16
+ }
17
+ /**
18
+ * Manages which files/slices are currently in context
19
+ */
20
+ export declare class SelectionManager {
21
+ private workspaceDir;
22
+ private selection;
23
+ private tokenCounter;
24
+ constructor(workspaceDir: string);
25
+ /**
26
+ * Add file to selection
27
+ */
28
+ add(path: string, mode?: SelectionMode): Promise<void>;
29
+ /**
30
+ * Add file with specific slices
31
+ * If the file already has slices, new slices are appended
32
+ */
33
+ addSlices(path: string, slices: Slice[]): Promise<void>;
34
+ /**
35
+ * Remove file from selection
36
+ */
37
+ remove(path: string): void;
38
+ /**
39
+ * Remove multiple files from selection
40
+ */
41
+ removeMultiple(paths: string[]): void;
42
+ /**
43
+ * Clear all selections
44
+ */
45
+ clear(): void;
46
+ /**
47
+ * Replace entire selection
48
+ */
49
+ set(files: SelectedFile[]): Promise<void>;
50
+ /**
51
+ * Check if file is selected
52
+ */
53
+ has(path: string): boolean;
54
+ /**
55
+ * Get selection for a specific file
56
+ */
57
+ get(path: string): SelectedFile | undefined;
58
+ /**
59
+ * Get all selected files
60
+ */
61
+ getAll(): SelectedFile[];
62
+ /**
63
+ * Get current selection summary
64
+ */
65
+ getSummary(): Promise<SelectionSummary>;
66
+ /**
67
+ * Get full content for LLM context
68
+ */
69
+ getContent(): Promise<string>;
70
+ /**
71
+ * Preview what would be sent to LLM
72
+ */
73
+ preview(): Promise<{
74
+ content: string;
75
+ tokens: number;
76
+ }>;
77
+ /**
78
+ * Promote codemap_only to full content
79
+ */
80
+ promote(path: string): Promise<void>;
81
+ /**
82
+ * Demote full content to codemap_only
83
+ */
84
+ demote(path: string): Promise<void>;
85
+ /**
86
+ * Clean up resources
87
+ */
88
+ dispose(): void;
89
+ }
90
+ //# sourceMappingURL=SelectionManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionManager.d.ts","sourceRoot":"","sources":["../../src/selection/SelectionManager.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,cAAc,CAAC;AAE/D,MAAM,WAAW,KAAK;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAIf,OAAO,CAAC,YAAY;IAHhC,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,YAAY,CAAe;gBAEf,YAAY,EAAE,MAAM;IAIxC;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,aAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE;;;OAGG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7D;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI1B;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAIrC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACG,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI3C;;OAEG;IACH,MAAM,IAAI,YAAY,EAAE;IAIxB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAY7C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IA0CnC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAM7D;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1C;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzC;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,167 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { TokenCounter } from '../utils/token-counter.js';
4
+ /**
5
+ * Manages which files/slices are currently in context
6
+ */
7
+ export class SelectionManager {
8
+ workspaceDir;
9
+ selection = new Map();
10
+ tokenCounter;
11
+ constructor(workspaceDir) {
12
+ this.workspaceDir = workspaceDir;
13
+ this.tokenCounter = new TokenCounter();
14
+ }
15
+ /**
16
+ * Add file to selection
17
+ */
18
+ async add(path, mode = 'full') {
19
+ this.selection.set(path, { path, mode });
20
+ }
21
+ /**
22
+ * Add file with specific slices
23
+ * If the file already has slices, new slices are appended
24
+ */
25
+ async addSlices(path, slices) {
26
+ const existing = this.selection.get(path);
27
+ if (existing && existing.mode === 'slices' && existing.slices) {
28
+ // Merge new slices with existing ones
29
+ const mergedSlices = [...existing.slices, ...slices];
30
+ this.selection.set(path, { path, mode: 'slices', slices: mergedSlices });
31
+ }
32
+ else {
33
+ // No existing slices, just set the new ones
34
+ this.selection.set(path, { path, mode: 'slices', slices });
35
+ }
36
+ }
37
+ /**
38
+ * Remove file from selection
39
+ */
40
+ remove(path) {
41
+ this.selection.delete(path);
42
+ }
43
+ /**
44
+ * Remove multiple files from selection
45
+ */
46
+ removeMultiple(paths) {
47
+ paths.forEach(path => this.selection.delete(path));
48
+ }
49
+ /**
50
+ * Clear all selections
51
+ */
52
+ clear() {
53
+ this.selection.clear();
54
+ }
55
+ /**
56
+ * Replace entire selection
57
+ */
58
+ async set(files) {
59
+ this.selection.clear();
60
+ for (const file of files) {
61
+ this.selection.set(file.path, file);
62
+ }
63
+ }
64
+ /**
65
+ * Check if file is selected
66
+ */
67
+ has(path) {
68
+ return this.selection.has(path);
69
+ }
70
+ /**
71
+ * Get selection for a specific file
72
+ */
73
+ get(path) {
74
+ return this.selection.get(path);
75
+ }
76
+ /**
77
+ * Get all selected files
78
+ */
79
+ getAll() {
80
+ return Array.from(this.selection.values());
81
+ }
82
+ /**
83
+ * Get current selection summary
84
+ */
85
+ async getSummary() {
86
+ const files = this.getAll();
87
+ const content = await this.getContent();
88
+ const totalTokens = this.tokenCounter.count(content);
89
+ return {
90
+ files,
91
+ totalFiles: files.length,
92
+ totalTokens,
93
+ };
94
+ }
95
+ /**
96
+ * Get full content for LLM context
97
+ */
98
+ async getContent() {
99
+ const parts = [];
100
+ for (const selected of this.selection.values()) {
101
+ try {
102
+ // Resolve path relative to workspace directory
103
+ const resolvedPath = path.resolve(this.workspaceDir, selected.path);
104
+ switch (selected.mode) {
105
+ case 'full':
106
+ const fullContent = await fs.readFile(resolvedPath, 'utf-8');
107
+ parts.push(`\`\`\`${selected.path}\n${fullContent}\n\`\`\``);
108
+ break;
109
+ case 'slices':
110
+ const fileContent = await fs.readFile(resolvedPath, 'utf-8');
111
+ const lines = fileContent.split('\n');
112
+ for (const slice of selected.slices || []) {
113
+ const sliceLines = lines.slice(slice.startLine, slice.endLine + 1);
114
+ const content = sliceLines.join('\n');
115
+ const desc = slice.description ? ` (${slice.description})` : '';
116
+ parts.push(`\`\`\`${selected.path}:${slice.startLine}-${slice.endLine}${desc}\n${content}\n\`\`\``);
117
+ }
118
+ break;
119
+ case 'codemap_only':
120
+ // For codemap_only, we'll just show the file path
121
+ // TODO: Add actual code structure extraction in V2
122
+ parts.push(`\`\`\`${selected.path} (structure only)\n// Code structure extraction not yet implemented\n\`\`\``);
123
+ break;
124
+ }
125
+ }
126
+ catch (error) {
127
+ console.error(`Error reading file ${selected.path}:`, error);
128
+ }
129
+ }
130
+ return parts.join('\n\n');
131
+ }
132
+ /**
133
+ * Preview what would be sent to LLM
134
+ */
135
+ async preview() {
136
+ const content = await this.getContent();
137
+ const tokens = this.tokenCounter.count(content);
138
+ return { content, tokens };
139
+ }
140
+ /**
141
+ * Promote codemap_only to full content
142
+ */
143
+ async promote(path) {
144
+ const selected = this.selection.get(path);
145
+ if (selected && selected.mode === 'codemap_only') {
146
+ selected.mode = 'full';
147
+ this.selection.set(path, selected);
148
+ }
149
+ }
150
+ /**
151
+ * Demote full content to codemap_only
152
+ */
153
+ async demote(path) {
154
+ const selected = this.selection.get(path);
155
+ if (selected && selected.mode === 'full') {
156
+ selected.mode = 'codemap_only';
157
+ this.selection.set(path, selected);
158
+ }
159
+ }
160
+ /**
161
+ * Clean up resources
162
+ */
163
+ dispose() {
164
+ this.tokenCounter.free();
165
+ }
166
+ }
167
+ //# sourceMappingURL=SelectionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionManager.js","sourceRoot":"","sources":["../../src/selection/SelectionManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Context MCP Server (Full Continue Integration)
3
+ *
4
+ * Uses bundled Continue modules for:
5
+ * - FTS5 full-text search with BM25 ranking (220x faster than grep)
6
+ * - Tree-sitter code structure extraction (40+ languages)
7
+ * - Continue-compatible IDE/LLM shims
8
+ *
9
+ * Supports multiple workspace directories for cross-repository indexing.
10
+ *
11
+ * Bundling solves ESM import issues in @continuedev/core package.
12
+ * See docs/BUNDLING_SOLUTION.md for details.
13
+ */
14
+ export declare class ContextMCPServer {
15
+ private server;
16
+ private ide;
17
+ private selectionManager;
18
+ private workspaceDirs;
19
+ private bundledModulesLoaded;
20
+ private bundledModulesPromise;
21
+ constructor(workspaceDirs: string[]);
22
+ private loadBundledModules;
23
+ private setupHandlers;
24
+ private getTools;
25
+ run(): Promise<void>;
26
+ dispose(): void;
27
+ }
28
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAuBA;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,oBAAoB,CAAkB;IAC9C,OAAO,CAAC,qBAAqB,CAAgB;gBAEjC,aAAa,EAAE,MAAM,EAAE;YA4BrB,kBAAkB;IAoDhC,OAAO,CAAC,aAAa;IAyGrB,OAAO,CAAC,QAAQ;IAyQV,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB1B,OAAO,IAAI,IAAI;CAGhB"}