@milo4jo/contextkit 0.1.0 → 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.
- package/README.md +237 -72
- package/dist/commands/index-cmd.d.ts.map +1 -1
- package/dist/commands/index-cmd.js +10 -2
- package/dist/commands/index-cmd.js.map +1 -1
- package/dist/commands/mcp.d.ts +8 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +23 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/watch.d.ts +8 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +171 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +11 -2
- package/dist/db/index.js.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/indexer/chunker.d.ts.map +1 -1
- package/dist/indexer/chunker.js +14 -15
- package/dist/indexer/chunker.js.map +1 -1
- package/dist/indexer/discovery.d.ts +7 -0
- package/dist/indexer/discovery.d.ts.map +1 -1
- package/dist/indexer/discovery.js +9 -0
- package/dist/indexer/discovery.js.map +1 -1
- package/dist/indexer/index.d.ts +17 -3
- package/dist/indexer/index.d.ts.map +1 -1
- package/dist/indexer/index.js +135 -24
- package/dist/indexer/index.js.map +1 -1
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +7 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +20 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +252 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp-server.d.ts +18 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +22 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/selector/budget.d.ts +2 -0
- package/dist/selector/budget.d.ts.map +1 -1
- package/dist/selector/budget.js +19 -6
- package/dist/selector/budget.js.map +1 -1
- package/dist/selector/formatter.d.ts.map +1 -1
- package/dist/selector/formatter.js +7 -5
- package/dist/selector/formatter.js.map +1 -1
- package/dist/selector/scoring.d.ts +15 -5
- package/dist/selector/scoring.d.ts.map +1 -1
- package/dist/selector/scoring.js +193 -19
- package/dist/selector/scoring.js.map +1 -1
- package/dist/utils/streams.d.ts +4 -0
- package/dist/utils/streams.d.ts.map +1 -1
- package/dist/utils/streams.js +7 -0
- package/dist/utils/streams.js.map +1 -1
- package/package.json +19 -7
package/dist/indexer/index.js
CHANGED
|
@@ -2,18 +2,73 @@
|
|
|
2
2
|
* Main Indexer Module
|
|
3
3
|
*
|
|
4
4
|
* Orchestrates file discovery, chunking, embedding, and storage.
|
|
5
|
+
* Supports incremental indexing via content hashing.
|
|
5
6
|
*/
|
|
7
|
+
import { createHash } from 'crypto';
|
|
6
8
|
import { discoverFiles } from './discovery.js';
|
|
7
9
|
import { chunkFiles } from './chunker.js';
|
|
8
10
|
import { embedChunks } from './embeddings.js';
|
|
9
11
|
/**
|
|
10
|
-
*
|
|
12
|
+
* Get all stored file hashes for a source
|
|
11
13
|
*/
|
|
12
|
-
|
|
14
|
+
function getStoredFiles(db, sourceId) {
|
|
15
|
+
const rows = db.prepare('SELECT file_path, content_hash FROM files WHERE source_id = ?').all(sourceId);
|
|
16
|
+
const map = new Map();
|
|
17
|
+
for (const row of rows) {
|
|
18
|
+
map.set(row.file_path, row.content_hash);
|
|
19
|
+
}
|
|
20
|
+
return map;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Determine which files need to be indexed
|
|
24
|
+
*/
|
|
25
|
+
function categorizeFiles(discovered, stored) {
|
|
26
|
+
const newFiles = [];
|
|
27
|
+
const changedFiles = [];
|
|
28
|
+
const unchangedFiles = [];
|
|
29
|
+
const currentPaths = new Set();
|
|
30
|
+
for (const file of discovered) {
|
|
31
|
+
currentPaths.add(file.relativePath);
|
|
32
|
+
const storedHash = stored.get(file.relativePath);
|
|
33
|
+
if (!storedHash) {
|
|
34
|
+
// New file
|
|
35
|
+
newFiles.push(file);
|
|
36
|
+
}
|
|
37
|
+
else if (storedHash !== file.contentHash) {
|
|
38
|
+
// Changed file
|
|
39
|
+
changedFiles.push(file);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// Unchanged
|
|
43
|
+
unchangedFiles.push(file);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Find removed files
|
|
47
|
+
const removedFiles = [];
|
|
48
|
+
for (const [path] of stored) {
|
|
49
|
+
if (!currentPaths.has(path)) {
|
|
50
|
+
removedFiles.push(path);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
new: newFiles,
|
|
55
|
+
changed: changedFiles,
|
|
56
|
+
unchanged: unchangedFiles,
|
|
57
|
+
removed: removedFiles,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Index all sources with incremental support
|
|
62
|
+
*/
|
|
63
|
+
export async function indexSources(sources, baseDir, db, chunkOptions, onProgress, options) {
|
|
13
64
|
const startTime = Date.now();
|
|
14
65
|
let totalFiles = 0;
|
|
15
66
|
let totalChunks = 0;
|
|
16
67
|
let totalSkipped = 0;
|
|
68
|
+
let totalFilesChanged = 0;
|
|
69
|
+
let totalFilesUnchanged = 0;
|
|
70
|
+
let totalFilesRemoved = 0;
|
|
71
|
+
const forceReindex = options?.force ?? false;
|
|
17
72
|
for (const source of sources) {
|
|
18
73
|
// Phase 1: Discovery
|
|
19
74
|
onProgress?.({
|
|
@@ -31,37 +86,48 @@ export async function indexSources(sources, baseDir, db, chunkOptions, onProgres
|
|
|
31
86
|
current: discovered.files.length,
|
|
32
87
|
total: discovered.files.length,
|
|
33
88
|
});
|
|
34
|
-
//
|
|
89
|
+
// Get stored file hashes for incremental indexing
|
|
90
|
+
const storedFiles = forceReindex ? new Map() : getStoredFiles(db, source.id);
|
|
91
|
+
const { new: newFiles, changed: changedFiles, unchanged: unchangedFiles, removed: removedFiles } = categorizeFiles(discovered.files, storedFiles);
|
|
92
|
+
// Files to process = new + changed
|
|
93
|
+
const filesToProcess = [...newFiles, ...changedFiles];
|
|
94
|
+
totalFilesChanged += filesToProcess.length;
|
|
95
|
+
totalFilesUnchanged += unchangedFiles.length;
|
|
96
|
+
totalFilesRemoved += removedFiles.length;
|
|
97
|
+
// Phase 2: Chunking (only for new/changed files)
|
|
35
98
|
onProgress?.({
|
|
36
99
|
phase: 'chunking',
|
|
37
100
|
sourceId: source.id,
|
|
38
101
|
current: 0,
|
|
39
|
-
total:
|
|
102
|
+
total: filesToProcess.length,
|
|
40
103
|
});
|
|
41
|
-
const chunks = chunkFiles(
|
|
104
|
+
const chunks = chunkFiles(filesToProcess, chunkOptions);
|
|
42
105
|
onProgress?.({
|
|
43
106
|
phase: 'chunking',
|
|
44
107
|
sourceId: source.id,
|
|
45
|
-
current:
|
|
46
|
-
total:
|
|
108
|
+
current: filesToProcess.length,
|
|
109
|
+
total: filesToProcess.length,
|
|
47
110
|
});
|
|
48
|
-
// Phase 3: Embedding
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
111
|
+
// Phase 3: Embedding (only for new/changed files)
|
|
112
|
+
let embeddedChunks = [];
|
|
113
|
+
if (chunks.length > 0) {
|
|
114
|
+
embeddedChunks = await embedChunks(chunks, (current, total) => {
|
|
115
|
+
onProgress?.({
|
|
116
|
+
phase: 'embedding',
|
|
117
|
+
sourceId: source.id,
|
|
118
|
+
current,
|
|
119
|
+
total,
|
|
120
|
+
});
|
|
55
121
|
});
|
|
56
|
-
}
|
|
57
|
-
// Phase 4: Store in database
|
|
122
|
+
}
|
|
123
|
+
// Phase 4: Store in database (incremental)
|
|
58
124
|
onProgress?.({
|
|
59
125
|
phase: 'storing',
|
|
60
126
|
sourceId: source.id,
|
|
61
127
|
current: 0,
|
|
62
128
|
total: embeddedChunks.length,
|
|
63
129
|
});
|
|
64
|
-
|
|
130
|
+
storeChunksIncremental(db, source.id, source.path, embeddedChunks, filesToProcess, removedFiles, discovered.files.length);
|
|
65
131
|
totalChunks += embeddedChunks.length;
|
|
66
132
|
onProgress?.({
|
|
67
133
|
phase: 'storing',
|
|
@@ -75,18 +141,63 @@ export async function indexSources(sources, baseDir, db, chunkOptions, onProgres
|
|
|
75
141
|
files: totalFiles,
|
|
76
142
|
chunks: totalChunks,
|
|
77
143
|
skipped: totalSkipped,
|
|
144
|
+
filesChanged: totalFilesChanged,
|
|
145
|
+
filesUnchanged: totalFilesUnchanged,
|
|
146
|
+
filesRemoved: totalFilesRemoved,
|
|
78
147
|
timeMs: Date.now() - startTime,
|
|
79
148
|
};
|
|
80
149
|
}
|
|
81
150
|
/**
|
|
82
|
-
*
|
|
151
|
+
* Generate unique file ID
|
|
83
152
|
*/
|
|
84
|
-
function
|
|
153
|
+
function generateFileId(sourceId, filePath) {
|
|
154
|
+
const base = `${sourceId}:${filePath}`;
|
|
155
|
+
return createHash('sha256').update(base).digest('hex').slice(0, 16);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Store chunks incrementally (only for changed files)
|
|
159
|
+
*/
|
|
160
|
+
function storeChunksIncremental(db, sourceId, sourcePath, chunks, processedFiles, removedFiles, totalFileCount) {
|
|
85
161
|
// Begin transaction for performance
|
|
86
162
|
const transaction = db.transaction(() => {
|
|
87
|
-
//
|
|
88
|
-
db.prepare(
|
|
163
|
+
// FIRST: Ensure source exists (for foreign key constraints)
|
|
164
|
+
db.prepare(`
|
|
165
|
+
INSERT INTO sources (id, path, file_count, chunk_count, indexed_at)
|
|
166
|
+
VALUES (?, ?, 0, 0, datetime('now'))
|
|
167
|
+
ON CONFLICT(id) DO NOTHING
|
|
168
|
+
`).run(sourceId, sourcePath);
|
|
169
|
+
// Delete chunks for removed files
|
|
170
|
+
if (removedFiles.length > 0) {
|
|
171
|
+
const deleteChunks = db.prepare('DELETE FROM chunks WHERE source_id = ? AND file_path = ?');
|
|
172
|
+
const deleteFile = db.prepare('DELETE FROM files WHERE source_id = ? AND file_path = ?');
|
|
173
|
+
for (const filePath of removedFiles) {
|
|
174
|
+
deleteChunks.run(sourceId, filePath);
|
|
175
|
+
deleteFile.run(sourceId, filePath);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Delete chunks for processed (changed) files - they'll be replaced
|
|
179
|
+
if (processedFiles.length > 0) {
|
|
180
|
+
const deleteChunks = db.prepare('DELETE FROM chunks WHERE source_id = ? AND file_path = ?');
|
|
181
|
+
for (const file of processedFiles) {
|
|
182
|
+
deleteChunks.run(sourceId, file.relativePath);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Insert/update file records with new hashes
|
|
186
|
+
const upsertFile = db.prepare(`
|
|
187
|
+
INSERT INTO files (id, source_id, file_path, content_hash, indexed_at)
|
|
188
|
+
VALUES (?, ?, ?, ?, datetime('now'))
|
|
189
|
+
ON CONFLICT(source_id, file_path) DO UPDATE SET
|
|
190
|
+
content_hash = excluded.content_hash,
|
|
191
|
+
indexed_at = excluded.indexed_at
|
|
192
|
+
`);
|
|
193
|
+
for (const file of processedFiles) {
|
|
194
|
+
const fileId = generateFileId(sourceId, file.relativePath);
|
|
195
|
+
upsertFile.run(fileId, sourceId, file.relativePath, file.contentHash);
|
|
196
|
+
}
|
|
197
|
+
// Get current total chunk count for this source
|
|
198
|
+
const currentChunkCount = db.prepare('SELECT COUNT(*) as count FROM chunks WHERE source_id = ?').get(sourceId);
|
|
89
199
|
// Update source record
|
|
200
|
+
const newChunkCount = currentChunkCount.count + chunks.length;
|
|
90
201
|
db.prepare(`
|
|
91
202
|
INSERT INTO sources (id, path, file_count, chunk_count, indexed_at)
|
|
92
203
|
VALUES (?, ?, ?, ?, datetime('now'))
|
|
@@ -95,8 +206,8 @@ function storeChunks(db, sourceId, sourcePath, chunks, fileCount) {
|
|
|
95
206
|
file_count = excluded.file_count,
|
|
96
207
|
chunk_count = excluded.chunk_count,
|
|
97
208
|
indexed_at = excluded.indexed_at
|
|
98
|
-
`).run(sourceId, sourcePath,
|
|
99
|
-
// Insert chunks
|
|
209
|
+
`).run(sourceId, sourcePath, totalFileCount, newChunkCount);
|
|
210
|
+
// Insert new chunks
|
|
100
211
|
const insertChunk = db.prepare(`
|
|
101
212
|
INSERT INTO chunks (id, source_id, file_path, content, start_line, end_line, tokens, embedding)
|
|
102
213
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
@@ -117,7 +228,7 @@ export function readEmbedding(blob) {
|
|
|
117
228
|
return Array.from(float32Array);
|
|
118
229
|
}
|
|
119
230
|
// Re-export types and functions
|
|
120
|
-
export { discoverFiles } from './discovery.js';
|
|
231
|
+
export { discoverFiles, computeContentHash } from './discovery.js';
|
|
121
232
|
export { chunkFiles, chunkFile, countTokens } from './chunker.js';
|
|
122
233
|
export { embed, embedBatch, embedChunks, cosineSimilarity, EMBEDDING_DIM, } from './embeddings.js';
|
|
123
234
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContextKit MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Model Context Protocol server for ContextKit.
|
|
5
|
+
* Allows AI assistants (Claude Desktop, etc.) to use ContextKit for context selection.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* contextkit mcp # Start MCP server (stdio)
|
|
9
|
+
* contextkit-mcp # Standalone MCP server
|
|
10
|
+
*/
|
|
11
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
12
|
+
/**
|
|
13
|
+
* Create and configure the MCP server
|
|
14
|
+
*/
|
|
15
|
+
export declare function createMcpServer(): Server;
|
|
16
|
+
/**
|
|
17
|
+
* Start the MCP server with stdio transport
|
|
18
|
+
*/
|
|
19
|
+
export declare function startMcpServer(): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAwCnE;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAuOxC;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContextKit MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Model Context Protocol server for ContextKit.
|
|
5
|
+
* Allows AI assistants (Claude Desktop, etc.) to use ContextKit for context selection.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* contextkit mcp # Start MCP server (stdio)
|
|
9
|
+
* contextkit-mcp # Standalone MCP server
|
|
10
|
+
*/
|
|
11
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
12
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
13
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
14
|
+
import { readFileSync } from "fs";
|
|
15
|
+
import { fileURLToPath } from "url";
|
|
16
|
+
import { dirname, join } from "path";
|
|
17
|
+
import { isInitialized, loadConfig } from "../config/index.js";
|
|
18
|
+
import { openDatabase } from "../db/index.js";
|
|
19
|
+
import { selectContext } from "../selector/index.js";
|
|
20
|
+
import { indexSources } from "../indexer/index.js";
|
|
21
|
+
// Get version from package.json
|
|
22
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
23
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, '..', '..', 'package.json'), 'utf-8'));
|
|
24
|
+
const VERSION = pkg.version;
|
|
25
|
+
/**
|
|
26
|
+
* Get index statistics from database
|
|
27
|
+
*/
|
|
28
|
+
function getIndexStats(db) {
|
|
29
|
+
const chunkCount = db
|
|
30
|
+
.prepare("SELECT COUNT(*) as count FROM chunks")
|
|
31
|
+
.get();
|
|
32
|
+
const sourceCount = db
|
|
33
|
+
.prepare("SELECT COUNT(DISTINCT source_id) as count FROM chunks")
|
|
34
|
+
.get();
|
|
35
|
+
return {
|
|
36
|
+
totalChunks: chunkCount.count,
|
|
37
|
+
totalSources: sourceCount.count,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create and configure the MCP server
|
|
42
|
+
*/
|
|
43
|
+
export function createMcpServer() {
|
|
44
|
+
const server = new Server({
|
|
45
|
+
name: "contextkit",
|
|
46
|
+
version: VERSION,
|
|
47
|
+
}, {
|
|
48
|
+
capabilities: {
|
|
49
|
+
tools: {},
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
// List available tools
|
|
53
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
54
|
+
return {
|
|
55
|
+
tools: [
|
|
56
|
+
{
|
|
57
|
+
name: "contextkit_select",
|
|
58
|
+
description: "Select optimal context chunks for a query from indexed codebase. Returns the most relevant code and documentation for your task.",
|
|
59
|
+
inputSchema: {
|
|
60
|
+
type: "object",
|
|
61
|
+
properties: {
|
|
62
|
+
query: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "What you need context for (e.g., 'How does authentication work?')",
|
|
65
|
+
},
|
|
66
|
+
budget: {
|
|
67
|
+
type: "number",
|
|
68
|
+
description: "Maximum tokens to return (default: 8000)",
|
|
69
|
+
},
|
|
70
|
+
sources: {
|
|
71
|
+
type: "string",
|
|
72
|
+
description: "Comma-separated list of sources to filter (optional)",
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
required: ["query"],
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: "contextkit_index",
|
|
80
|
+
description: "Index or re-index the codebase. Run this after making changes to ensure context is up to date.",
|
|
81
|
+
inputSchema: {
|
|
82
|
+
type: "object",
|
|
83
|
+
properties: {},
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: "contextkit_status",
|
|
88
|
+
description: "Get the current status of the ContextKit index, including chunk counts and source information.",
|
|
89
|
+
inputSchema: {
|
|
90
|
+
type: "object",
|
|
91
|
+
properties: {},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
// Handle tool calls
|
|
98
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
99
|
+
const { name, arguments: args } = request.params;
|
|
100
|
+
try {
|
|
101
|
+
switch (name) {
|
|
102
|
+
case "contextkit_select": {
|
|
103
|
+
if (!isInitialized()) {
|
|
104
|
+
return {
|
|
105
|
+
content: [
|
|
106
|
+
{
|
|
107
|
+
type: "text",
|
|
108
|
+
text: "ContextKit not initialized. Run `contextkit init` first.",
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
isError: true,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const query = args?.query || "";
|
|
115
|
+
const budget = args?.budget || 8000;
|
|
116
|
+
const sourcesStr = args?.sources;
|
|
117
|
+
const sources = sourcesStr
|
|
118
|
+
? sourcesStr.split(",").map((s) => s.trim())
|
|
119
|
+
: undefined;
|
|
120
|
+
if (!query) {
|
|
121
|
+
return {
|
|
122
|
+
content: [{ type: "text", text: "Error: query is required" }],
|
|
123
|
+
isError: true,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const db = openDatabase();
|
|
127
|
+
try {
|
|
128
|
+
const options = {
|
|
129
|
+
query,
|
|
130
|
+
budget,
|
|
131
|
+
sources,
|
|
132
|
+
};
|
|
133
|
+
const result = await selectContext(db, options);
|
|
134
|
+
if (result.isEmpty) {
|
|
135
|
+
return {
|
|
136
|
+
content: [
|
|
137
|
+
{
|
|
138
|
+
type: "text",
|
|
139
|
+
text: "No indexed content. Run `contextkit index` first.",
|
|
140
|
+
},
|
|
141
|
+
],
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
if (result.output.data.chunks.length === 0) {
|
|
145
|
+
return {
|
|
146
|
+
content: [
|
|
147
|
+
{
|
|
148
|
+
type: "text",
|
|
149
|
+
text: `No relevant context found for query: "${query}"`,
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
// Return formatted output
|
|
155
|
+
return {
|
|
156
|
+
content: [{ type: "text", text: result.output.text }],
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
db.close();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
case "contextkit_index": {
|
|
164
|
+
if (!isInitialized()) {
|
|
165
|
+
return {
|
|
166
|
+
content: [
|
|
167
|
+
{
|
|
168
|
+
type: "text",
|
|
169
|
+
text: "ContextKit not initialized. Run `contextkit init` first.",
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
isError: true,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
const config = loadConfig();
|
|
176
|
+
const db = openDatabase();
|
|
177
|
+
try {
|
|
178
|
+
const stats = await indexSources(config.sources, process.cwd(), db, {
|
|
179
|
+
chunkSize: config.settings.chunk_size,
|
|
180
|
+
chunkOverlap: config.settings.chunk_overlap,
|
|
181
|
+
});
|
|
182
|
+
return {
|
|
183
|
+
content: [
|
|
184
|
+
{
|
|
185
|
+
type: "text",
|
|
186
|
+
text: `Indexed ${stats.chunks} chunks from ${stats.files} files.`,
|
|
187
|
+
},
|
|
188
|
+
],
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
db.close();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
case "contextkit_status": {
|
|
196
|
+
if (!isInitialized()) {
|
|
197
|
+
return {
|
|
198
|
+
content: [
|
|
199
|
+
{
|
|
200
|
+
type: "text",
|
|
201
|
+
text: "ContextKit not initialized in current directory.",
|
|
202
|
+
},
|
|
203
|
+
],
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
const config = loadConfig();
|
|
207
|
+
const db = openDatabase();
|
|
208
|
+
try {
|
|
209
|
+
const stats = getIndexStats(db);
|
|
210
|
+
const statusText = [
|
|
211
|
+
"ContextKit Status",
|
|
212
|
+
"=================",
|
|
213
|
+
`Sources configured: ${config.sources.length}`,
|
|
214
|
+
`Chunks indexed: ${stats.totalChunks}`,
|
|
215
|
+
"",
|
|
216
|
+
"Sources:",
|
|
217
|
+
...config.sources.map((s) => ` - ${s.id}: ${s.path}`),
|
|
218
|
+
].join("\n");
|
|
219
|
+
return {
|
|
220
|
+
content: [{ type: "text", text: statusText }],
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
db.close();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
default:
|
|
228
|
+
return {
|
|
229
|
+
content: [{ type: "text", text: `Unknown tool: ${name}` }],
|
|
230
|
+
isError: true,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
236
|
+
return {
|
|
237
|
+
content: [{ type: "text", text: `Error: ${message}` }],
|
|
238
|
+
isError: true,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
return server;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Start the MCP server with stdio transport
|
|
246
|
+
*/
|
|
247
|
+
export async function startMcpServer() {
|
|
248
|
+
const server = createMcpServer();
|
|
249
|
+
const transport = new StdioServerTransport();
|
|
250
|
+
await server.connect(transport);
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAsB,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,gCAAgC;AAChC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC3F,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AAE5B;;GAEG;AACH,SAAS,aAAa,CAAC,EAAqB;IAI1C,MAAM,UAAU,GAAG,EAAE;SAClB,OAAO,CAAC,sCAAsC,CAAC;SAC/C,GAAG,EAAuB,CAAC;IAC9B,MAAM,WAAW,GAAG,EAAE;SACnB,OAAO,CAAC,uDAAuD,CAAC;SAChE,GAAG,EAAuB,CAAC;IAE9B,OAAO;QACL,WAAW,EAAE,UAAU,CAAC,KAAK;QAC7B,YAAY,EAAE,WAAW,CAAC,KAAK;KAChC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAC;IAEF,uBAAuB;IACvB,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QAC1D,OAAO;YACL,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,mBAAmB;oBACzB,WAAW,EACT,kIAAkI;oBACpI,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EACT,mEAAmE;6BACtE;4BACD,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,0CAA0C;6BACxD;4BACD,OAAO,EAAE;gCACP,IAAI,EAAE,QAAQ;gCACd,WAAW,EACT,sDAAsD;6BACzD;yBACF;wBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;qBACpB;iBACF;gBACD;oBACE,IAAI,EAAE,kBAAkB;oBACxB,WAAW,EACT,gGAAgG;oBAClG,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE,EAAE;qBACf;iBACF;gBACD;oBACE,IAAI,EAAE,mBAAmB;oBACzB,WAAW,EACT,gGAAgG;oBAClG,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE,EAAE;qBACf;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAEjD,IAAI,CAAC;YACH,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,mBAAmB,CAAC,CAAC,CAAC;oBACzB,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;wBACrB,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAM;oCACZ,IAAI,EAAE,0DAA0D;iCACjE;6BACF;4BACD,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,CAAC;oBAED,MAAM,KAAK,GAAI,IAAI,EAAE,KAAgB,IAAI,EAAE,CAAC;oBAC5C,MAAM,MAAM,GAAI,IAAI,EAAE,MAAiB,IAAI,IAAI,CAAC;oBAChD,MAAM,UAAU,GAAG,IAAI,EAAE,OAA6B,CAAC;oBACvD,MAAM,OAAO,GAAG,UAAU;wBACxB,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC5C,CAAC,CAAC,SAAS,CAAC;oBAEd,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,OAAO;4BACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;4BAC7D,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,CAAC;oBAED,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;oBAE1B,IAAI,CAAC;wBACH,MAAM,OAAO,GAAkB;4BAC7B,KAAK;4BACL,MAAM;4BACN,OAAO;yBACR,CAAC;wBAEF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;wBAEhD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;4BACnB,OAAO;gCACL,OAAO,EAAE;oCACP;wCACE,IAAI,EAAE,MAAM;wCACZ,IAAI,EAAE,mDAAmD;qCAC1D;iCACF;6BACF,CAAC;wBACJ,CAAC;wBAED,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;4BAC3C,OAAO;gCACL,OAAO,EAAE;oCACP;wCACE,IAAI,EAAE,MAAM;wCACZ,IAAI,EAAE,yCAAyC,KAAK,GAAG;qCACxD;iCACF;6BACF,CAAC;wBACJ,CAAC;wBAED,0BAA0B;wBAC1B,OAAO;4BACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;yBACtD,CAAC;oBACJ,CAAC;4BAAS,CAAC;wBACT,EAAE,CAAC,KAAK,EAAE,CAAC;oBACb,CAAC;gBACH,CAAC;gBAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;oBACxB,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;wBACrB,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAM;oCACZ,IAAI,EAAE,0DAA0D;iCACjE;6BACF;4BACD,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,CAAC;oBAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;oBAC5B,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;oBAE1B,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAC9B,MAAM,CAAC,OAAO,EACd,OAAO,CAAC,GAAG,EAAE,EACb,EAAE,EACF;4BACE,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;4BACrC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa;yBAC5C,CACF,CAAC;wBAEF,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAM;oCACZ,IAAI,EAAE,WAAW,KAAK,CAAC,MAAM,gBAAgB,KAAK,CAAC,KAAK,SAAS;iCAClE;6BACF;yBACF,CAAC;oBACJ,CAAC;4BAAS,CAAC;wBACT,EAAE,CAAC,KAAK,EAAE,CAAC;oBACb,CAAC;gBACH,CAAC;gBAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;oBACzB,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;wBACrB,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAM;oCACZ,IAAI,EAAE,kDAAkD;iCACzD;6BACF;yBACF,CAAC;oBACJ,CAAC;oBAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;oBAC5B,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;oBAE1B,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;wBAEhC,MAAM,UAAU,GAAG;4BACjB,mBAAmB;4BACnB,mBAAmB;4BACnB,uBAAuB,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;4BAC9C,mBAAmB,KAAK,CAAC,WAAW,EAAE;4BACtC,EAAE;4BACF,UAAU;4BACV,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;yBACvD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAEb,OAAO;4BACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;yBAC9C,CAAC;oBACJ,CAAC;4BAAS,CAAC;wBACT,EAAE,CAAC,KAAK,EAAE,CAAC;oBACb,CAAC;gBACH,CAAC;gBAED;oBACE,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;wBAC1D,OAAO,EAAE,IAAI;qBACd,CAAC;YACN,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBACtD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ContextKit MCP Server (Standalone)
|
|
4
|
+
*
|
|
5
|
+
* Start the MCP server directly without the CLI wrapper.
|
|
6
|
+
* This is useful for Claude Desktop configuration.
|
|
7
|
+
*
|
|
8
|
+
* Usage in claude_desktop_config.json:
|
|
9
|
+
* {
|
|
10
|
+
* "mcpServers": {
|
|
11
|
+
* "contextkit": {
|
|
12
|
+
* "command": "contextkit-mcp"
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
* }
|
|
16
|
+
*/
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=mcp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ContextKit MCP Server (Standalone)
|
|
4
|
+
*
|
|
5
|
+
* Start the MCP server directly without the CLI wrapper.
|
|
6
|
+
* This is useful for Claude Desktop configuration.
|
|
7
|
+
*
|
|
8
|
+
* Usage in claude_desktop_config.json:
|
|
9
|
+
* {
|
|
10
|
+
* "mcpServers": {
|
|
11
|
+
* "contextkit": {
|
|
12
|
+
* "command": "contextkit-mcp"
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
* }
|
|
16
|
+
*/
|
|
17
|
+
import { startMcpServer } from "./mcp/server.js";
|
|
18
|
+
startMcpServer().catch((error) => {
|
|
19
|
+
console.error("Failed to start MCP server:", error);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC/B,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -21,6 +21,8 @@ export declare function fitToBudget(chunks: RankedChunk[], budget: number): Budg
|
|
|
21
21
|
/**
|
|
22
22
|
* Merge adjacent chunks from the same file
|
|
23
23
|
* (Optional optimization for cleaner output)
|
|
24
|
+
*
|
|
25
|
+
* Handles overlapping chunks by removing duplicate lines.
|
|
24
26
|
*/
|
|
25
27
|
export declare function mergeAdjacentChunks(chunks: RankedChunk[]): RankedChunk[];
|
|
26
28
|
//# sourceMappingURL=budget.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../src/selector/budget.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,uBAAuB;AACvB,MAAM,WAAW,YAAY;IAC3B,sBAAsB;IACtB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAsC/E;AAED
|
|
1
|
+
{"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../src/selector/budget.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,uBAAuB;AACvB,MAAM,WAAW,YAAY;IAC3B,sBAAsB;IACtB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAsC/E;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CA8CxE"}
|