dep-context-mcp 1.0.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 +380 -0
- package/dist/analysis/relationships.d.ts +25 -0
- package/dist/analysis/relationships.d.ts.map +1 -0
- package/dist/analysis/relationships.js +26 -0
- package/dist/analysis/relationships.js.map +1 -0
- package/dist/build-info.d.ts +15 -0
- package/dist/build-info.d.ts.map +1 -0
- package/dist/build-info.js +24 -0
- package/dist/build-info.js.map +1 -0
- package/dist/cache/manager.d.ts +19 -0
- package/dist/cache/manager.d.ts.map +1 -0
- package/dist/cache/manager.js +131 -0
- package/dist/cache/manager.js.map +1 -0
- package/dist/cache/registry.d.ts +44 -0
- package/dist/cache/registry.d.ts.map +1 -0
- package/dist/cache/registry.js +92 -0
- package/dist/cache/registry.js.map +1 -0
- package/dist/config/loader.d.ts +62 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +193 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/extraction/examples.d.ts +22 -0
- package/dist/extraction/examples.d.ts.map +1 -0
- package/dist/extraction/examples.js +109 -0
- package/dist/extraction/examples.js.map +1 -0
- package/dist/extraction/external-resolver.d.ts +26 -0
- package/dist/extraction/external-resolver.d.ts.map +1 -0
- package/dist/extraction/external-resolver.js +79 -0
- package/dist/extraction/external-resolver.js.map +1 -0
- package/dist/extraction/import-tracker.d.ts +58 -0
- package/dist/extraction/import-tracker.d.ts.map +1 -0
- package/dist/extraction/import-tracker.js +113 -0
- package/dist/extraction/import-tracker.js.map +1 -0
- package/dist/extraction/readme.d.ts +19 -0
- package/dist/extraction/readme.d.ts.map +1 -0
- package/dist/extraction/readme.js +79 -0
- package/dist/extraction/readme.js.map +1 -0
- package/dist/extraction/snapshot.d.ts +32 -0
- package/dist/extraction/snapshot.d.ts.map +1 -0
- package/dist/extraction/snapshot.js +258 -0
- package/dist/extraction/snapshot.js.map +1 -0
- package/dist/extraction/typescript.d.ts +104 -0
- package/dist/extraction/typescript.d.ts.map +1 -0
- package/dist/extraction/typescript.js +647 -0
- package/dist/extraction/typescript.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +329 -0
- package/dist/index.js.map +1 -0
- package/dist/resolver/package.d.ts +62 -0
- package/dist/resolver/package.d.ts.map +1 -0
- package/dist/resolver/package.js +334 -0
- package/dist/resolver/package.js.map +1 -0
- package/dist/tools/get-dependency.d.ts +55 -0
- package/dist/tools/get-dependency.d.ts.map +1 -0
- package/dist/tools/get-dependency.js +105 -0
- package/dist/tools/get-dependency.js.map +1 -0
- package/dist/tools/index-dependencies.d.ts +51 -0
- package/dist/tools/index-dependencies.d.ts.map +1 -0
- package/dist/tools/index-dependencies.js +90 -0
- package/dist/tools/index-dependencies.js.map +1 -0
- package/dist/tools/index-status.d.ts +36 -0
- package/dist/tools/index-status.d.ts.map +1 -0
- package/dist/tools/index-status.js +45 -0
- package/dist/tools/index-status.js.map +1 -0
- package/dist/tools/list.d.ts +48 -0
- package/dist/tools/list.d.ts.map +1 -0
- package/dist/tools/list.js +55 -0
- package/dist/tools/list.js.map +1 -0
- package/dist/tools/refresh.d.ts +59 -0
- package/dist/tools/refresh.d.ts.map +1 -0
- package/dist/tools/refresh.js +109 -0
- package/dist/tools/refresh.js.map +1 -0
- package/dist/tools/relationships.d.ts +41 -0
- package/dist/tools/relationships.d.ts.map +1 -0
- package/dist/tools/relationships.js +36 -0
- package/dist/tools/relationships.js.map +1 -0
- package/dist/tools/search-codebase.d.ts +64 -0
- package/dist/tools/search-codebase.d.ts.map +1 -0
- package/dist/tools/search-codebase.js +117 -0
- package/dist/tools/search-codebase.js.map +1 -0
- package/dist/tools/search.d.ts +37 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +77 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/utils/logger.d.ts +19 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +71 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/vector/chroma.d.ts +38 -0
- package/dist/vector/chroma.d.ts.map +1 -0
- package/dist/vector/chroma.js +69 -0
- package/dist/vector/chroma.js.map +1 -0
- package/dist/vector/chunker.d.ts +29 -0
- package/dist/vector/chunker.d.ts.map +1 -0
- package/dist/vector/chunker.js +205 -0
- package/dist/vector/chunker.js.map +1 -0
- package/dist/vector/embeddings.d.ts +36 -0
- package/dist/vector/embeddings.d.ts.map +1 -0
- package/dist/vector/embeddings.js +106 -0
- package/dist/vector/embeddings.js.map +1 -0
- package/dist/vector/file-store.d.ts +10 -0
- package/dist/vector/file-store.d.ts.map +1 -0
- package/dist/vector/file-store.js +80 -0
- package/dist/vector/file-store.js.map +1 -0
- package/dist/vector/index-manager.d.ts +39 -0
- package/dist/vector/index-manager.d.ts.map +1 -0
- package/dist/vector/index-manager.js +105 -0
- package/dist/vector/index-manager.js.map +1 -0
- package/dist/vector/provider-factory.d.ts +23 -0
- package/dist/vector/provider-factory.d.ts.map +1 -0
- package/dist/vector/provider-factory.js +50 -0
- package/dist/vector/provider-factory.js.map +1 -0
- package/dist/vector/storage-factory.d.ts +17 -0
- package/dist/vector/storage-factory.d.ts.map +1 -0
- package/dist/vector/storage-factory.js +55 -0
- package/dist/vector/storage-factory.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: search_codebase
|
|
3
|
+
*
|
|
4
|
+
* Semantic search across indexed dependencies using vector embeddings.
|
|
5
|
+
* Auto-indexes on first search if no index exists.
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
import { extract, followReExports } from '../extraction/typescript.js';
|
|
9
|
+
import { createExternalPackageResolver } from '../extraction/external-resolver.js';
|
|
10
|
+
/**
|
|
11
|
+
* Auto-index production dependencies
|
|
12
|
+
*/
|
|
13
|
+
async function autoIndex(deps) {
|
|
14
|
+
const { indexManager, resolver, config, listProductionDeps } = deps;
|
|
15
|
+
if (!indexManager)
|
|
16
|
+
return { indexed: 0, failed: [] };
|
|
17
|
+
const packages = await listProductionDeps();
|
|
18
|
+
const failed = [];
|
|
19
|
+
let indexed = 0;
|
|
20
|
+
for (const pkg of packages) {
|
|
21
|
+
try {
|
|
22
|
+
if (indexManager.isPackageIndexed(pkg.name, pkg.version))
|
|
23
|
+
continue;
|
|
24
|
+
const resolved = await resolver.resolve(pkg.name);
|
|
25
|
+
if (!resolved.success || !resolved.metadata?.typesPath)
|
|
26
|
+
continue;
|
|
27
|
+
const externalResolver = createExternalPackageResolver(config.nodeModulesPath);
|
|
28
|
+
const extraction = await extract(resolved.metadata.typesPath);
|
|
29
|
+
const withReExports = await followReExports(extraction, resolved.metadata.typesPath, new Set(), { externalResolver });
|
|
30
|
+
const count = await indexManager.indexPackage(pkg.name, pkg.version, withReExports);
|
|
31
|
+
if (count > 0)
|
|
32
|
+
indexed++;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
failed.push(pkg.name);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { indexed, failed };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Creates the search_codebase tool handler
|
|
42
|
+
*/
|
|
43
|
+
export function createSearchCodebaseHandler(deps) {
|
|
44
|
+
return async function searchCodebase(input) {
|
|
45
|
+
const { indexManager } = deps;
|
|
46
|
+
const start = performance.now();
|
|
47
|
+
if (!indexManager) {
|
|
48
|
+
return {
|
|
49
|
+
results: [],
|
|
50
|
+
totalIndexed: 0,
|
|
51
|
+
message: 'Vector search is not enabled. Configure vectorSearch in config to enable semantic search.'
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
let status = indexManager.getStatus();
|
|
55
|
+
let autoIndexed = false;
|
|
56
|
+
// Auto-index if no packages indexed yet
|
|
57
|
+
if (status.totalChunks === 0) {
|
|
58
|
+
logger.debug('No index found, auto-indexing production dependencies');
|
|
59
|
+
const indexStart = performance.now();
|
|
60
|
+
const result = await autoIndex(deps);
|
|
61
|
+
autoIndexed = result.indexed > 0;
|
|
62
|
+
logger.debug('Auto-indexing complete', {
|
|
63
|
+
indexed: result.indexed,
|
|
64
|
+
failed: result.failed.length,
|
|
65
|
+
durationMs: Math.round(performance.now() - indexStart)
|
|
66
|
+
});
|
|
67
|
+
status = indexManager.getStatus();
|
|
68
|
+
}
|
|
69
|
+
if (status.totalChunks === 0) {
|
|
70
|
+
return {
|
|
71
|
+
results: [],
|
|
72
|
+
totalIndexed: 0,
|
|
73
|
+
message: 'No packages with type definitions found to index.'
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
const searchStart = performance.now();
|
|
77
|
+
const results = await indexManager.search(input.query, {
|
|
78
|
+
limit: input.limit ?? 10,
|
|
79
|
+
packageName: input.packageName
|
|
80
|
+
});
|
|
81
|
+
logger.debug('Search complete', {
|
|
82
|
+
query: input.query,
|
|
83
|
+
results: results.length,
|
|
84
|
+
searchMs: Math.round(performance.now() - searchStart),
|
|
85
|
+
totalMs: Math.round(performance.now() - start)
|
|
86
|
+
});
|
|
87
|
+
return {
|
|
88
|
+
results,
|
|
89
|
+
totalIndexed: status.totalChunks,
|
|
90
|
+
autoIndexed: autoIndexed || undefined
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/** Tool definition for MCP */
|
|
95
|
+
export const searchCodebaseToolDef = {
|
|
96
|
+
name: 'search_codebase',
|
|
97
|
+
description: 'Search installed package APIs by natural language. Use BEFORE implementing features to find relevant functions. Auto-indexes on first use. Examples: "validation utilities", "date formatting", "HTTP client methods"',
|
|
98
|
+
inputSchema: {
|
|
99
|
+
type: 'object',
|
|
100
|
+
properties: {
|
|
101
|
+
query: {
|
|
102
|
+
type: 'string',
|
|
103
|
+
description: 'Natural language description of what you\'re looking for (e.g., "function to debounce calls")'
|
|
104
|
+
},
|
|
105
|
+
limit: {
|
|
106
|
+
type: 'number',
|
|
107
|
+
description: 'Maximum results to return (default: 10)'
|
|
108
|
+
},
|
|
109
|
+
packageName: {
|
|
110
|
+
type: 'string',
|
|
111
|
+
description: 'Optional: limit search to a specific package when user explicitly names one'
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
required: ['query']
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=search-codebase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-codebase.js","sourceRoot":"","sources":["../../src/tools/search-codebase.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AACtE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAA;AA6BlF;;GAEG;AACH,KAAK,UAAU,SAAS,CAAC,IAAwB;IAC/C,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAA;IACnE,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IAEpD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAA;IAE3C,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,OAAO,GAAG,CAAC,CAAA;IAEf,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,IAAI,YAAY,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC;gBAAE,SAAQ;YAElE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACjD,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS;gBAAE,SAAQ;YAEhE,MAAM,gBAAgB,GAAG,6BAA6B,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;YAC9E,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YAC7D,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAA;YAErH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;YACnF,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO,EAAE,CAAA;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAAwB;IAClE,OAAO,KAAK,UAAU,cAAc,CAClC,KAA0B;QAE1B,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAA;QAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QAE/B,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO;gBACL,OAAO,EAAE,EAAE;gBACX,YAAY,EAAE,CAAC;gBACf,OAAO,EAAE,2FAA2F;aACrG,CAAA;QACH,CAAC;QAED,IAAI,MAAM,GAAG,YAAY,CAAC,SAAS,EAAE,CAAA;QACrC,IAAI,WAAW,GAAG,KAAK,CAAA;QAEvB,wCAAwC;QACxC,IAAI,MAAM,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAA;YACrE,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;YACpC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAA;YACpC,WAAW,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC,CAAA;YAChC,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;gBACrC,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;gBAC5B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;aACvD,CAAC,CAAA;YACF,MAAM,GAAG,YAAY,CAAC,SAAS,EAAE,CAAA;QACnC,CAAC;QAED,IAAI,MAAM,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,OAAO,EAAE,EAAE;gBACX,YAAY,EAAE,CAAC;gBACf,OAAO,EAAE,mDAAmD;aAC7D,CAAA;QACH,CAAC;QAED,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QACrC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;YACrD,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;YACxB,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC,CAAA;QAEF,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;YACrD,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;SAC/C,CAAC,CAAA;QAEF,OAAO;YACL,OAAO;YACP,YAAY,EAAE,MAAM,CAAC,WAAW;YAChC,WAAW,EAAE,WAAW,IAAI,SAAS;SACtC,CAAA;IACH,CAAC,CAAA;AACH,CAAC;AAED,8BAA8B;AAC9B,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,uNAAuN;IACpO,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+FAA+F;aAC7G;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yCAAyC;aACvD;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,6EAA6E;aAC3F;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB;CACF,CAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: search_dependencies
|
|
3
|
+
*
|
|
4
|
+
* Text-based search across installed dependencies.
|
|
5
|
+
* Searches package names and descriptions with relevance scoring.
|
|
6
|
+
*/
|
|
7
|
+
export interface SearchDependenciesInput {
|
|
8
|
+
query: string;
|
|
9
|
+
limit?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface SearchResult {
|
|
12
|
+
packageName: string;
|
|
13
|
+
version: string;
|
|
14
|
+
description: string | undefined;
|
|
15
|
+
score: number;
|
|
16
|
+
matchType: 'exact' | 'prefix' | 'contains' | 'description';
|
|
17
|
+
}
|
|
18
|
+
export interface SearchDependenciesOutput {
|
|
19
|
+
results: SearchResult[];
|
|
20
|
+
totalMatches: number;
|
|
21
|
+
query: string;
|
|
22
|
+
}
|
|
23
|
+
export interface PackageResolverLike {
|
|
24
|
+
listAllDependencies(includeDev?: boolean): Promise<Array<{
|
|
25
|
+
name: string;
|
|
26
|
+
version: string;
|
|
27
|
+
description: string | undefined;
|
|
28
|
+
}>>;
|
|
29
|
+
}
|
|
30
|
+
export interface SearchDependenciesDeps {
|
|
31
|
+
resolver: PackageResolverLike;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Creates the search_dependencies tool handler
|
|
35
|
+
*/
|
|
36
|
+
export declare function createSearchDependenciesHandler(deps: SearchDependenciesDeps): (input: SearchDependenciesInput) => Promise<SearchDependenciesOutput>;
|
|
37
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAA;CAC3D;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,mBAAmB,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;QACvD,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,MAAM,CAAA;QACf,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;KAChC,CAAC,CAAC,CAAA;CACJ;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,mBAAmB,CAAA;CAC9B;AA2CD;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,sBAAsB,IAExE,OAAO,uBAAuB,KAC7B,OAAO,CAAC,wBAAwB,CAAC,CAyCrC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: search_dependencies
|
|
3
|
+
*
|
|
4
|
+
* Text-based search across installed dependencies.
|
|
5
|
+
* Searches package names and descriptions with relevance scoring.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Calculates relevance score for a package match
|
|
9
|
+
*
|
|
10
|
+
* Scoring:
|
|
11
|
+
* - Exact name match: 1.0
|
|
12
|
+
* - Name starts with query: 0.9
|
|
13
|
+
* - Name contains query: 0.7
|
|
14
|
+
* - Description contains query: 0.5
|
|
15
|
+
*/
|
|
16
|
+
function calculateScore(packageName, description, query) {
|
|
17
|
+
const lowerName = packageName.toLowerCase();
|
|
18
|
+
const lowerQuery = query.toLowerCase();
|
|
19
|
+
const lowerDesc = description?.toLowerCase() ?? '';
|
|
20
|
+
// Exact match
|
|
21
|
+
if (lowerName === lowerQuery) {
|
|
22
|
+
return { score: 1.0, matchType: 'exact' };
|
|
23
|
+
}
|
|
24
|
+
// Name starts with query
|
|
25
|
+
if (lowerName.startsWith(lowerQuery)) {
|
|
26
|
+
return { score: 0.9, matchType: 'prefix' };
|
|
27
|
+
}
|
|
28
|
+
// Name contains query
|
|
29
|
+
if (lowerName.includes(lowerQuery)) {
|
|
30
|
+
return { score: 0.7, matchType: 'contains' };
|
|
31
|
+
}
|
|
32
|
+
// Description contains query
|
|
33
|
+
if (lowerDesc.includes(lowerQuery)) {
|
|
34
|
+
return { score: 0.5, matchType: 'description' };
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Creates the search_dependencies tool handler
|
|
40
|
+
*/
|
|
41
|
+
export function createSearchDependenciesHandler(deps) {
|
|
42
|
+
return async function searchDependencies(input) {
|
|
43
|
+
const { query, limit = 10 } = input;
|
|
44
|
+
const { resolver } = deps;
|
|
45
|
+
// Get all dependencies
|
|
46
|
+
const dependencies = await resolver.listAllDependencies(true);
|
|
47
|
+
// Score and filter matches
|
|
48
|
+
const matches = [];
|
|
49
|
+
for (const dep of dependencies) {
|
|
50
|
+
const result = calculateScore(dep.name, dep.description, query);
|
|
51
|
+
if (result) {
|
|
52
|
+
matches.push({
|
|
53
|
+
packageName: dep.name,
|
|
54
|
+
version: dep.version,
|
|
55
|
+
description: dep.description,
|
|
56
|
+
score: result.score,
|
|
57
|
+
matchType: result.matchType
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Sort by score (descending), then by name (ascending)
|
|
62
|
+
matches.sort((a, b) => {
|
|
63
|
+
if (b.score !== a.score) {
|
|
64
|
+
return b.score - a.score;
|
|
65
|
+
}
|
|
66
|
+
return a.packageName.localeCompare(b.packageName);
|
|
67
|
+
});
|
|
68
|
+
// Apply limit
|
|
69
|
+
const results = matches.slice(0, limit);
|
|
70
|
+
return {
|
|
71
|
+
results,
|
|
72
|
+
totalMatches: matches.length,
|
|
73
|
+
query
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiCH;;;;;;;;GAQG;AACH,SAAS,cAAc,CACrB,WAAmB,EACnB,WAA+B,EAC/B,KAAa;IAEb,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,CAAA;IAC3C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;IACtC,MAAM,SAAS,GAAG,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;IAElD,cAAc;IACd,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;IAC3C,CAAC;IAED,yBAAyB;IACzB,IAAI,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;IAC5C,CAAC;IAED,sBAAsB;IACtB,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,CAAA;IAC9C,CAAC;IAED,6BAA6B;IAC7B,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA;IACjD,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,+BAA+B,CAAC,IAA4B;IAC1E,OAAO,KAAK,UAAU,kBAAkB,CACtC,KAA8B;QAE9B,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,KAAK,CAAA;QACnC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;QAEzB,uBAAuB;QACvB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;QAE7D,2BAA2B;QAC3B,MAAM,OAAO,GAAmB,EAAE,CAAA;QAElC,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;YAE/D,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC;oBACX,WAAW,EAAE,GAAG,CAAC,IAAI;oBACrB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,WAAW,EAAE,GAAG,CAAC,WAAW;oBAC5B,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;iBAC5B,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACpB,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;gBACxB,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAA;YAC1B,CAAC;YACD,OAAO,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;QAEF,cAAc;QACd,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QAEvC,OAAO;YACL,OAAO;YACP,YAAY,EAAE,OAAO,CAAC,MAAM;YAC5B,KAAK;SACN,CAAA;IACH,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple logger with level support
|
|
3
|
+
* Logs to stderr so MCP clients can capture
|
|
4
|
+
*/
|
|
5
|
+
export type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace';
|
|
6
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
7
|
+
export declare function getLogLevel(): LogLevel;
|
|
8
|
+
export declare const logger: {
|
|
9
|
+
error(message: string, data?: Record<string, unknown>): void;
|
|
10
|
+
warn(message: string, data?: Record<string, unknown>): void;
|
|
11
|
+
info(message: string, data?: Record<string, unknown>): void;
|
|
12
|
+
debug(message: string, data?: Record<string, unknown>): void;
|
|
13
|
+
trace(message: string, data?: Record<string, unknown>): void;
|
|
14
|
+
/** Log with timing info */
|
|
15
|
+
timed<T>(label: string, fn: () => T): T;
|
|
16
|
+
/** Log async with timing info */
|
|
17
|
+
timedAsync<T>(label: string, fn: () => Promise<T>): Promise<T>;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAA;AAYpE,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAcD,eAAO,MAAM,MAAM;mBACF,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;kBAG9C,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;kBAG7C,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;mBAG5C,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;mBAG7C,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI5D,2BAA2B;UACrB,CAAC,SAAS,MAAM,MAAM,MAAM,CAAC,GAAG,CAAC;IASvC,iCAAiC;eAChB,CAAC,SAAS,MAAM,MAAM,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAQrE,CAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple logger with level support
|
|
3
|
+
* Logs to stderr so MCP clients can capture
|
|
4
|
+
*/
|
|
5
|
+
const LEVELS = {
|
|
6
|
+
error: 0,
|
|
7
|
+
warn: 1,
|
|
8
|
+
info: 2,
|
|
9
|
+
debug: 3,
|
|
10
|
+
trace: 4
|
|
11
|
+
};
|
|
12
|
+
let currentLevel = process.env.LOG_LEVEL || 'info';
|
|
13
|
+
export function setLogLevel(level) {
|
|
14
|
+
currentLevel = level;
|
|
15
|
+
}
|
|
16
|
+
export function getLogLevel() {
|
|
17
|
+
return currentLevel;
|
|
18
|
+
}
|
|
19
|
+
function shouldLog(level) {
|
|
20
|
+
return LEVELS[level] <= LEVELS[currentLevel];
|
|
21
|
+
}
|
|
22
|
+
function formatMessage(level, message, data) {
|
|
23
|
+
const prefix = `[dep-context] [${level.toUpperCase()}]`;
|
|
24
|
+
if (data) {
|
|
25
|
+
return `${prefix} ${message} ${JSON.stringify(data)}`;
|
|
26
|
+
}
|
|
27
|
+
return `${prefix} ${message}`;
|
|
28
|
+
}
|
|
29
|
+
export const logger = {
|
|
30
|
+
error(message, data) {
|
|
31
|
+
if (shouldLog('error'))
|
|
32
|
+
console.error(formatMessage('error', message, data));
|
|
33
|
+
},
|
|
34
|
+
warn(message, data) {
|
|
35
|
+
if (shouldLog('warn'))
|
|
36
|
+
console.error(formatMessage('warn', message, data));
|
|
37
|
+
},
|
|
38
|
+
info(message, data) {
|
|
39
|
+
if (shouldLog('info'))
|
|
40
|
+
console.error(formatMessage('info', message, data));
|
|
41
|
+
},
|
|
42
|
+
debug(message, data) {
|
|
43
|
+
if (shouldLog('debug'))
|
|
44
|
+
console.error(formatMessage('debug', message, data));
|
|
45
|
+
},
|
|
46
|
+
trace(message, data) {
|
|
47
|
+
if (shouldLog('trace'))
|
|
48
|
+
console.error(formatMessage('trace', message, data));
|
|
49
|
+
},
|
|
50
|
+
/** Log with timing info */
|
|
51
|
+
timed(label, fn) {
|
|
52
|
+
if (!shouldLog('debug'))
|
|
53
|
+
return fn();
|
|
54
|
+
const start = performance.now();
|
|
55
|
+
const result = fn();
|
|
56
|
+
const duration = Math.round(performance.now() - start);
|
|
57
|
+
console.error(formatMessage('debug', `${label} completed`, { durationMs: duration }));
|
|
58
|
+
return result;
|
|
59
|
+
},
|
|
60
|
+
/** Log async with timing info */
|
|
61
|
+
async timedAsync(label, fn) {
|
|
62
|
+
if (!shouldLog('debug'))
|
|
63
|
+
return fn();
|
|
64
|
+
const start = performance.now();
|
|
65
|
+
const result = await fn();
|
|
66
|
+
const duration = Math.round(performance.now() - start);
|
|
67
|
+
console.error(formatMessage('debug', `${label} completed`, { durationMs: duration }));
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChromaDB integration for vector storage and search
|
|
3
|
+
*/
|
|
4
|
+
export interface ChunkDocument {
|
|
5
|
+
id: string;
|
|
6
|
+
content: string;
|
|
7
|
+
embedding: number[];
|
|
8
|
+
metadata: {
|
|
9
|
+
packageName: string;
|
|
10
|
+
version: string;
|
|
11
|
+
contentType: string;
|
|
12
|
+
name: string;
|
|
13
|
+
signature?: string;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface SearchResult {
|
|
17
|
+
id: string;
|
|
18
|
+
content: string;
|
|
19
|
+
score: number;
|
|
20
|
+
metadata: ChunkDocument['metadata'];
|
|
21
|
+
}
|
|
22
|
+
export interface SearchOptions {
|
|
23
|
+
limit?: number;
|
|
24
|
+
packageName?: string;
|
|
25
|
+
contentType?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface VectorStore {
|
|
28
|
+
add(docs: ChunkDocument[]): Promise<void>;
|
|
29
|
+
search(embedding: number[], options?: SearchOptions): Promise<SearchResult[]>;
|
|
30
|
+
removeByPackage(packageName: string): Promise<void>;
|
|
31
|
+
clear(): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
export interface ChromaConfig {
|
|
34
|
+
host?: string;
|
|
35
|
+
collectionName?: string;
|
|
36
|
+
}
|
|
37
|
+
export declare function createChromaStore(config?: ChromaConfig): Promise<VectorStore>;
|
|
38
|
+
//# sourceMappingURL=chroma.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chroma.d.ts","sourceRoot":"","sources":["../../src/vector/chroma.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAA;QACnB,OAAO,EAAE,MAAM,CAAA;QACf,WAAW,EAAE,MAAM,CAAA;QACnB,IAAI,EAAE,MAAM,CAAA;QACZ,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IAC7E,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,wBAAsB,iBAAiB,CAAC,MAAM,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAmEvF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChromaDB integration for vector storage and search
|
|
3
|
+
*/
|
|
4
|
+
import { ChromaClient } from 'chromadb';
|
|
5
|
+
export async function createChromaStore(config = {}) {
|
|
6
|
+
// Use ephemeral (in-memory) if no host specified
|
|
7
|
+
const client = config.host
|
|
8
|
+
? new ChromaClient({ path: config.host })
|
|
9
|
+
: new ChromaClient();
|
|
10
|
+
const collectionName = config.collectionName ?? 'dep-context';
|
|
11
|
+
let collection;
|
|
12
|
+
try {
|
|
13
|
+
collection = await client.getOrCreateCollection({ name: collectionName });
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
const host = config.host ?? 'localhost:8000';
|
|
17
|
+
throw new Error(`ChromaDB not available at ${host}. Is it running? Try: docker run -d -p 8000:8000 chromadb/chroma`);
|
|
18
|
+
}
|
|
19
|
+
async function add(docs) {
|
|
20
|
+
if (docs.length === 0)
|
|
21
|
+
return;
|
|
22
|
+
try {
|
|
23
|
+
await collection.upsert({
|
|
24
|
+
ids: docs.map(d => d.id),
|
|
25
|
+
embeddings: docs.map(d => d.embedding),
|
|
26
|
+
documents: docs.map(d => d.content),
|
|
27
|
+
metadatas: docs.map(d => d.metadata)
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
throw new Error(`ChromaDB write failed: ${err.message}. Is ChromaDB still running?`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function search(embedding, options = {}) {
|
|
35
|
+
const where = {};
|
|
36
|
+
if (options.packageName)
|
|
37
|
+
where.packageName = options.packageName;
|
|
38
|
+
if (options.contentType)
|
|
39
|
+
where.contentType = options.contentType;
|
|
40
|
+
let results;
|
|
41
|
+
try {
|
|
42
|
+
results = await collection.query({
|
|
43
|
+
queryEmbeddings: [embedding],
|
|
44
|
+
nResults: options.limit ?? 10,
|
|
45
|
+
where: Object.keys(where).length > 0 ? where : undefined
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
throw new Error(`ChromaDB query failed: ${err.message}. Is ChromaDB still running?`);
|
|
50
|
+
}
|
|
51
|
+
if (!results.ids[0])
|
|
52
|
+
return [];
|
|
53
|
+
return results.ids[0].map((id, i) => ({
|
|
54
|
+
id,
|
|
55
|
+
content: results.documents[0]?.[i] ?? '',
|
|
56
|
+
score: results.distances?.[0]?.[i] ?? 0,
|
|
57
|
+
metadata: results.metadatas[0]?.[i]
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
async function removeByPackage(packageName) {
|
|
61
|
+
await collection.delete({ where: { packageName } });
|
|
62
|
+
}
|
|
63
|
+
async function clear() {
|
|
64
|
+
await client.deleteCollection({ name: collectionName });
|
|
65
|
+
collection = await client.createCollection({ name: collectionName });
|
|
66
|
+
}
|
|
67
|
+
return { add, search, removeByPackage, clear };
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=chroma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chroma.js","sourceRoot":"","sources":["../../src/vector/chroma.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic chunker - breaks extracted API info into embeddable chunks
|
|
3
|
+
*/
|
|
4
|
+
import type { ExtractionResult } from '../extraction/typescript.js';
|
|
5
|
+
import type { CodeExample } from '../extraction/examples.js';
|
|
6
|
+
export interface ChunkMetadata {
|
|
7
|
+
packageName: string;
|
|
8
|
+
version: string;
|
|
9
|
+
contentType: 'function' | 'class' | 'method' | 'interface' | 'type';
|
|
10
|
+
name: string;
|
|
11
|
+
signature?: string;
|
|
12
|
+
importPath?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface Chunk {
|
|
15
|
+
id: string;
|
|
16
|
+
content: string;
|
|
17
|
+
metadata: ChunkMetadata;
|
|
18
|
+
}
|
|
19
|
+
export interface ChunkerOptions {
|
|
20
|
+
packageName: string;
|
|
21
|
+
version: string;
|
|
22
|
+
maxTokens?: number;
|
|
23
|
+
examples?: CodeExample[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Chunks extraction results into embeddable pieces
|
|
27
|
+
*/
|
|
28
|
+
export declare function chunkExtraction(extraction: ExtractionResult, options: ChunkerOptions): Chunk[];
|
|
29
|
+
//# sourceMappingURL=chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/vector/chunker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAKjB,MAAM,6BAA6B,CAAA;AACpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAE5D,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAA;IACnE,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,aAAa,CAAA;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAA;CACzB;AAwID;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,GAAG,KAAK,EAAE,CAoG9F"}
|