skill-creator 0.0.0 → 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 +148 -19
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +265 -260
- package/dist/cli.js.map +1 -1
- package/dist/commands/addContent.d.ts +5 -0
- package/dist/commands/addContent.d.ts.map +1 -0
- package/dist/commands/addContent.js +74 -0
- package/dist/commands/addContent.js.map +1 -0
- package/dist/commands/buildIndex.d.ts +5 -0
- package/dist/commands/buildIndex.d.ts.map +1 -0
- package/dist/commands/buildIndex.js +17 -0
- package/dist/commands/buildIndex.js.map +1 -0
- package/dist/commands/downloadContext7.d.ts +5 -0
- package/dist/commands/downloadContext7.d.ts.map +1 -0
- package/dist/commands/downloadContext7.js +62 -0
- package/dist/commands/downloadContext7.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +89 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/initCc.d.ts +5 -0
- package/dist/commands/initCc.d.ts.map +1 -0
- package/dist/commands/initCc.js +26 -0
- package/dist/commands/initCc.js.map +1 -0
- package/dist/commands/listContent.d.ts +5 -0
- package/dist/commands/listContent.d.ts.map +1 -0
- package/dist/commands/listContent.js +35 -0
- package/dist/commands/listContent.js.map +1 -0
- package/dist/commands/searchContent.d.ts +5 -0
- package/dist/commands/searchContent.d.ts.map +1 -0
- package/dist/commands/searchContent.js +98 -0
- package/dist/commands/searchContent.js.map +1 -0
- package/dist/commands/shared.d.ts +23 -0
- package/dist/commands/shared.d.ts.map +1 -0
- package/dist/commands/shared.js +92 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/updateContext7.d.ts +5 -0
- package/dist/commands/updateContext7.d.ts.map +1 -0
- package/dist/commands/updateContext7.js +28 -0
- package/dist/commands/updateContext7.js.map +1 -0
- package/dist/core/autoSearchAdapter.d.ts +42 -0
- package/dist/core/autoSearchAdapter.d.ts.map +1 -0
- package/dist/core/autoSearchAdapter.js +116 -0
- package/dist/core/autoSearchAdapter.js.map +1 -0
- package/dist/core/chromaLocalSearch.d.ts +26 -0
- package/dist/core/chromaLocalSearch.d.ts.map +1 -0
- package/dist/core/chromaLocalSearch.js +212 -0
- package/dist/core/chromaLocalSearch.js.map +1 -0
- package/dist/core/chromaLocalSimple.d.ts +24 -0
- package/dist/core/chromaLocalSimple.d.ts.map +1 -0
- package/dist/core/chromaLocalSimple.js +216 -0
- package/dist/core/chromaLocalSimple.js.map +1 -0
- package/dist/core/chromaSearchAdapter.d.ts +86 -0
- package/dist/core/chromaSearchAdapter.d.ts.map +1 -0
- package/dist/core/chromaSearchAdapter.js +477 -0
- package/dist/core/chromaSearchAdapter.js.map +1 -0
- package/dist/core/chromaSearchImproved.d.ts +29 -0
- package/dist/core/chromaSearchImproved.d.ts.map +1 -0
- package/dist/core/chromaSearchImproved.js +259 -0
- package/dist/core/chromaSearchImproved.js.map +1 -0
- package/dist/core/chromaServerManager.d.ts +64 -0
- package/dist/core/chromaServerManager.d.ts.map +1 -0
- package/dist/core/chromaServerManager.js +186 -0
- package/dist/core/chromaServerManager.js.map +1 -0
- package/dist/core/contentManager.d.ts +1 -0
- package/dist/core/contentManager.d.ts.map +1 -1
- package/dist/core/contentManager.js +75 -21
- package/dist/core/contentManager.js.map +1 -1
- package/dist/core/fuseSearch.d.ts +25 -0
- package/dist/core/fuseSearch.d.ts.map +1 -0
- package/dist/core/fuseSearch.js +198 -0
- package/dist/core/fuseSearch.js.map +1 -0
- package/dist/core/fuzzySearch.d.ts +66 -0
- package/dist/core/fuzzySearch.d.ts.map +1 -0
- package/dist/core/fuzzySearch.js +271 -0
- package/dist/core/fuzzySearch.js.map +1 -0
- package/dist/core/fuzzySearchAdapter.d.ts +33 -0
- package/dist/core/fuzzySearchAdapter.d.ts.map +1 -0
- package/dist/core/fuzzySearchAdapter.js +185 -0
- package/dist/core/fuzzySearchAdapter.js.map +1 -0
- package/dist/core/portUtils.d.ts +51 -0
- package/dist/core/portUtils.d.ts.map +1 -0
- package/dist/core/portUtils.js +120 -0
- package/dist/core/portUtils.js.map +1 -0
- package/dist/core/runScript.d.ts +1 -1
- package/dist/core/runScript.d.ts.map +1 -1
- package/dist/core/runScript.js +27 -210
- package/dist/core/runScript.js.map +1 -1
- package/dist/core/searchAdapter.d.ts +48 -0
- package/dist/core/searchAdapter.d.ts.map +1 -0
- package/dist/core/searchAdapter.js +6 -0
- package/dist/core/searchAdapter.js.map +1 -0
- package/dist/core/searchEngineFactory.d.ts +30 -0
- package/dist/core/searchEngineFactory.d.ts.map +1 -0
- package/dist/core/searchEngineFactory.js +41 -0
- package/dist/core/searchEngineFactory.js.map +1 -0
- package/dist/core/simpleLocalSearch.d.ts +50 -0
- package/dist/core/simpleLocalSearch.d.ts.map +1 -0
- package/dist/core/simpleLocalSearch.js +406 -0
- package/dist/core/simpleLocalSearch.js.map +1 -0
- package/dist/core/skillCreator.d.ts +0 -2
- package/dist/core/skillCreator.d.ts.map +1 -1
- package/dist/core/skillCreator.js +20 -92
- package/dist/core/skillCreator.js.map +1 -1
- package/dist/core/unifiedSearch.d.ts +57 -11
- package/dist/core/unifiedSearch.d.ts.map +1 -1
- package/dist/core/unifiedSearch.js +88 -29
- package/dist/core/unifiedSearch.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/search_format/enhancedFormatter.d.ts +109 -0
- package/dist/search_format/enhancedFormatter.d.ts.map +1 -0
- package/dist/search_format/enhancedFormatter.js +262 -0
- package/dist/search_format/enhancedFormatter.js.map +1 -0
- package/dist/search_format/index.d.ts +10 -0
- package/dist/search_format/index.d.ts.map +1 -0
- package/dist/search_format/index.js +22 -0
- package/dist/search_format/index.js.map +1 -0
- package/dist/search_format/listFormatter.d.ts +16 -0
- package/dist/search_format/listFormatter.d.ts.map +1 -0
- package/dist/search_format/listFormatter.js +51 -0
- package/dist/search_format/listFormatter.js.map +1 -0
- package/dist/search_format/types.d.ts +69 -0
- package/dist/search_format/types.d.ts.map +1 -0
- package/dist/search_format/types.js +5 -0
- package/dist/search_format/types.js.map +1 -0
- package/dist/test/testFuzzy.d.ts +3 -0
- package/dist/test/testFuzzy.d.ts.map +1 -0
- package/dist/test/testFuzzy.js +72 -0
- package/dist/test/testFuzzy.js.map +1 -0
- package/dist/test-fuzzy.d.ts +6 -0
- package/dist/test-fuzzy.d.ts.map +1 -0
- package/dist/test-fuzzy.js +65 -0
- package/dist/test-fuzzy.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/package.d.ts +17 -0
- package/dist/utils/package.d.ts.map +1 -1
- package/dist/utils/package.js +51 -14
- package/dist/utils/package.js.map +1 -1
- package/package.json +9 -8
- package/templates/skill-creator.md +65 -153
- package/templates/skill-creator.zh-CN.md +93 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for commands
|
|
3
|
+
*/
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { Config } from '../utils/config.js';
|
|
7
|
+
/**
|
|
8
|
+
* Load skill configuration from current directory
|
|
9
|
+
*/
|
|
10
|
+
export function loadSkillConfig() {
|
|
11
|
+
const configPath = join(process.cwd(), 'config.json');
|
|
12
|
+
if (!existsSync(configPath)) {
|
|
13
|
+
console.error('❌ config.json not found. Are you in a skill directory?');
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
return Config.load(configPath);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse command line arguments
|
|
20
|
+
*/
|
|
21
|
+
export function parseArgs(args, definitions) {
|
|
22
|
+
const result = {};
|
|
23
|
+
for (let i = 0; i < args.length; i++) {
|
|
24
|
+
const arg = args[i];
|
|
25
|
+
if (arg.startsWith('--')) {
|
|
26
|
+
const key = arg.slice(2);
|
|
27
|
+
const def = definitions.find((d) => d.name === key || d.alias === key);
|
|
28
|
+
if (def) {
|
|
29
|
+
if (def.type === 'boolean') {
|
|
30
|
+
result[key] = true;
|
|
31
|
+
}
|
|
32
|
+
else if (i + 1 < args.length) {
|
|
33
|
+
const value = args[++i];
|
|
34
|
+
result[key] = def.type === 'number' ? Number(value) : value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (arg.startsWith('-')) {
|
|
39
|
+
const key = arg.slice(1);
|
|
40
|
+
const def = definitions.find((d) => d.alias === key);
|
|
41
|
+
if (def) {
|
|
42
|
+
if (def.type === 'boolean') {
|
|
43
|
+
result[def.name] = true;
|
|
44
|
+
}
|
|
45
|
+
else if (i + 1 < args.length) {
|
|
46
|
+
const value = args[++i];
|
|
47
|
+
result[def.name] = def.type === 'number' ? Number(value) : value;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Check for required arguments
|
|
53
|
+
for (const def of definitions) {
|
|
54
|
+
if (def.required && !(def.name in result)) {
|
|
55
|
+
console.error(`❌ Required argument --${def.name} is missing`);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Apply defaults
|
|
60
|
+
for (const def of definitions) {
|
|
61
|
+
if (!(def.name in result) && def.default !== undefined) {
|
|
62
|
+
result[def.name] = def.default;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create search engine instance
|
|
69
|
+
*/
|
|
70
|
+
export async function createSearchEngine(config, searchMode = 'auto', useFormatting = true) {
|
|
71
|
+
const { UnifiedSearchEngine } = await import('../core/unifiedSearch.js');
|
|
72
|
+
return new UnifiedSearchEngine({
|
|
73
|
+
mode: searchMode,
|
|
74
|
+
skillDir: join(process.cwd(), 'assets'),
|
|
75
|
+
referencesDir: join(process.cwd(), 'assets', 'references'),
|
|
76
|
+
config,
|
|
77
|
+
skillPath: process.cwd(),
|
|
78
|
+
format: useFormatting ? 'enhanced' : undefined,
|
|
79
|
+
adapterOptions: {
|
|
80
|
+
enableChromaFallback: true,
|
|
81
|
+
chromaStartupTimeout: 15000,
|
|
82
|
+
qualityThreshold: 0.3,
|
|
83
|
+
},
|
|
84
|
+
formatting: {
|
|
85
|
+
maxPreviewLength: 200,
|
|
86
|
+
showFullContentThreshold: 0.8,
|
|
87
|
+
minScoreForPreview: 0.3,
|
|
88
|
+
showLineNumbers: true,
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateContext7.d.ts","sourceRoot":"","sources":["../../src/commands/updateContext7.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BlE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Update Context7 documentation command
|
|
3
|
+
*/
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { loadSkillConfig, parseArgs, createSearchEngine } from './shared.js';
|
|
6
|
+
export async function updateContext7(args) {
|
|
7
|
+
const config = loadSkillConfig();
|
|
8
|
+
const searchEngine = await createSearchEngine(config);
|
|
9
|
+
const { ContentManager } = await import('../core/contentManager.js');
|
|
10
|
+
const contentManager = new ContentManager({
|
|
11
|
+
searchEngine,
|
|
12
|
+
referencesDir: join(process.cwd(), 'assets', 'references'),
|
|
13
|
+
});
|
|
14
|
+
// Parse arguments
|
|
15
|
+
const options = parseArgs(args, [
|
|
16
|
+
{ name: 'force', type: 'boolean' },
|
|
17
|
+
{ name: 'project-id', type: 'string' },
|
|
18
|
+
]);
|
|
19
|
+
const projectId = options['project-id'] || config.context7LibraryId;
|
|
20
|
+
if (!projectId) {
|
|
21
|
+
console.error('❌ No Context7 project ID provided');
|
|
22
|
+
console.error(' Use --project-id <id> or set context7LibraryId in config.json');
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const result = await contentManager.updateFromContext7(projectId, options.force);
|
|
26
|
+
console.log(result.message);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=updateContext7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateContext7.js","sourceRoot":"","sources":["../../src/commands/updateContext7.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAE5E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAChC,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAErD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAA;IAEpE,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;QACxC,YAAY;QACZ,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC;KAC3D,CAAC,CAAA;IAEF,kBAAkB;IAClB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE;QAC9B,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;QAClC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE;KACvC,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAA;IACnE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;QAClD,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAA;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;IAEhF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AAC7B,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto Search Adapter
|
|
3
|
+
* Intelligently selects and switches between search engines based on query characteristics
|
|
4
|
+
* and search quality evaluation
|
|
5
|
+
*/
|
|
6
|
+
import type { SearchEngine, SearchResult, SearchOptions } from './searchAdapter.js';
|
|
7
|
+
export interface AutoSearchOptions {
|
|
8
|
+
/** Skill directory for ChromaDB */
|
|
9
|
+
skillDir: string;
|
|
10
|
+
/** ChromaDB collection name */
|
|
11
|
+
collectionName: string;
|
|
12
|
+
/** Enable ChromaDB fallback on failure */
|
|
13
|
+
enableChromaFallback?: boolean;
|
|
14
|
+
/** ChromaDB startup timeout in milliseconds */
|
|
15
|
+
chromaStartupTimeout?: number;
|
|
16
|
+
/** Quality threshold for switching engines */
|
|
17
|
+
qualityThreshold?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Auto Search Adapter
|
|
21
|
+
* Implements intelligent search engine selection and automatic switching
|
|
22
|
+
*/
|
|
23
|
+
export declare class AutoSearchAdapter implements SearchEngine {
|
|
24
|
+
private fuzzyAdapter;
|
|
25
|
+
private chromaAdapter;
|
|
26
|
+
private options;
|
|
27
|
+
constructor(options: AutoSearchOptions);
|
|
28
|
+
private getChromaAdapter;
|
|
29
|
+
buildIndex(referencesDir: string): Promise<void>;
|
|
30
|
+
search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Evaluate search result quality
|
|
33
|
+
*/
|
|
34
|
+
private evaluateSearchQuality;
|
|
35
|
+
isBuilt(): boolean;
|
|
36
|
+
getStats(): Promise<{
|
|
37
|
+
totalDocuments: number;
|
|
38
|
+
}>;
|
|
39
|
+
searchByPriority(query: string, topK?: number): Promise<SearchResult[]>;
|
|
40
|
+
clearIndex(): void;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=autoSearchAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoSearchAdapter.d.ts","sourceRoot":"","sources":["../../src/core/autoSearchAdapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAInF,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,+BAA+B;IAC/B,cAAc,EAAE,MAAM,CAAA;IACtB,0CAA0C;IAC1C,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,+CAA+C;IAC/C,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,OAAO,CAAmB;gBAEtB,OAAO,EAAE,iBAAiB;YAOxB,gBAAgB;IAYxB,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoCjF;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA4C7B,OAAO,IAAI,OAAO;IAIZ,QAAQ,IAAI,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAI/C,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAIhF,UAAU,IAAI,IAAI;CAMnB"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto Search Adapter
|
|
3
|
+
* Intelligently selects and switches between search engines based on query characteristics
|
|
4
|
+
* and search quality evaluation
|
|
5
|
+
*/
|
|
6
|
+
import { FuzzySearchAdapter } from './fuzzySearchAdapter.js';
|
|
7
|
+
import { ChromaSearchAdapter } from './chromaSearchAdapter.js';
|
|
8
|
+
/**
|
|
9
|
+
* Auto Search Adapter
|
|
10
|
+
* Implements intelligent search engine selection and automatic switching
|
|
11
|
+
*/
|
|
12
|
+
export class AutoSearchAdapter {
|
|
13
|
+
fuzzyAdapter;
|
|
14
|
+
chromaAdapter = null;
|
|
15
|
+
options;
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.options = options;
|
|
18
|
+
this.fuzzyAdapter = new FuzzySearchAdapter();
|
|
19
|
+
// ChromaDB adapter created on-demand for better performance
|
|
20
|
+
}
|
|
21
|
+
async getChromaAdapter() {
|
|
22
|
+
if (!this.chromaAdapter) {
|
|
23
|
+
this.chromaAdapter = new ChromaSearchAdapter({
|
|
24
|
+
skillDir: this.options.skillDir,
|
|
25
|
+
collectionName: this.options.collectionName,
|
|
26
|
+
startupTimeout: this.options.chromaStartupTimeout || 15000,
|
|
27
|
+
enableFallback: this.options.enableChromaFallback || true,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return this.chromaAdapter;
|
|
31
|
+
}
|
|
32
|
+
async buildIndex(referencesDir) {
|
|
33
|
+
// Always build fuzzy index (fast and reliable)
|
|
34
|
+
await this.fuzzyAdapter.buildIndex(referencesDir);
|
|
35
|
+
// Build ChromaDB index only if needed (on-demand)
|
|
36
|
+
// This prevents unnecessary ChromaDB startup for simple searches
|
|
37
|
+
}
|
|
38
|
+
async search(query, options = {}) {
|
|
39
|
+
const { topK = 5, where } = options;
|
|
40
|
+
const qualityThreshold = this.options.qualityThreshold || 0.3;
|
|
41
|
+
console.log('🤖 Auto Mode: Starting with Fuzzy search...');
|
|
42
|
+
// Always start with fuzzy search (fast, reliable, no external dependencies)
|
|
43
|
+
const fuzzyResults = await this.fuzzyAdapter.search(query, { topK, where });
|
|
44
|
+
// Evaluate search quality
|
|
45
|
+
const quality = this.evaluateSearchQuality(fuzzyResults, query);
|
|
46
|
+
console.log(`📊 Fuzzy search quality: ${quality.score.toFixed(2)} (${quality.reason})`);
|
|
47
|
+
// If fuzzy search quality is good, return results
|
|
48
|
+
if (quality.score >= qualityThreshold) {
|
|
49
|
+
console.log('✅ Fuzzy search quality satisfactory, returning results');
|
|
50
|
+
return fuzzyResults;
|
|
51
|
+
}
|
|
52
|
+
// Try ChromaDB for better semantic understanding
|
|
53
|
+
console.log('🔄 Fuzzy search quality below threshold, trying ChromaDB...');
|
|
54
|
+
try {
|
|
55
|
+
const chromaAdapter = await this.getChromaAdapter();
|
|
56
|
+
const chromaResults = await chromaAdapter.search(query, { topK, where });
|
|
57
|
+
console.log(`✅ ChromaDB search completed, found ${chromaResults.length} results`);
|
|
58
|
+
return chromaResults;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.log(`❌ ChromaDB search failed, returning fuzzy results:`, error instanceof Error ? error.message : String(error));
|
|
62
|
+
return fuzzyResults;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Evaluate search result quality
|
|
67
|
+
*/
|
|
68
|
+
evaluateSearchQuality(results, query) {
|
|
69
|
+
if (results.length === 0) {
|
|
70
|
+
return { score: 0, reason: 'No results found' };
|
|
71
|
+
}
|
|
72
|
+
// Quick win: check for exact matches
|
|
73
|
+
const topResult = results[0];
|
|
74
|
+
const queryLower = query.toLowerCase();
|
|
75
|
+
if (topResult.title.toLowerCase().includes(queryLower)) {
|
|
76
|
+
return { score: 1.0, reason: 'Exact title match found' };
|
|
77
|
+
}
|
|
78
|
+
// Check score distribution
|
|
79
|
+
const scores = results.map((r) => r.score);
|
|
80
|
+
const maxScore = Math.max(...scores);
|
|
81
|
+
const avgScore = scores.reduce((sum, score) => sum + score, 0) / scores.length;
|
|
82
|
+
// High score threshold
|
|
83
|
+
if (maxScore >= 0.8) {
|
|
84
|
+
return { score: maxScore, reason: 'High quality matches found' };
|
|
85
|
+
}
|
|
86
|
+
// Multiple decent results
|
|
87
|
+
if (results.length >= 3 && avgScore >= 0.5) {
|
|
88
|
+
return { score: avgScore, reason: 'Multiple decent quality results' };
|
|
89
|
+
}
|
|
90
|
+
// Low quality indicators
|
|
91
|
+
if (maxScore < 0.3) {
|
|
92
|
+
return { score: maxScore, reason: 'Low quality matches only' };
|
|
93
|
+
}
|
|
94
|
+
if (results.length < 2) {
|
|
95
|
+
return { score: maxScore * 0.8, reason: 'Too few results' };
|
|
96
|
+
}
|
|
97
|
+
// Default: return average score
|
|
98
|
+
return { score: avgScore, reason: 'Average quality results' };
|
|
99
|
+
}
|
|
100
|
+
isBuilt() {
|
|
101
|
+
return this.fuzzyAdapter.isBuilt();
|
|
102
|
+
}
|
|
103
|
+
async getStats() {
|
|
104
|
+
return this.fuzzyAdapter.getStats();
|
|
105
|
+
}
|
|
106
|
+
async searchByPriority(query, topK = 5) {
|
|
107
|
+
return this.search(query, { topK });
|
|
108
|
+
}
|
|
109
|
+
clearIndex() {
|
|
110
|
+
this.fuzzyAdapter.clearIndex();
|
|
111
|
+
if (this.chromaAdapter) {
|
|
112
|
+
this.chromaAdapter.clearIndex();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=autoSearchAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoSearchAdapter.js","sourceRoot":"","sources":["../../src/core/autoSearchAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 纯本地模式的 ChromaDB 搜索引擎
|
|
3
|
+
* 专为 skill-creator 的嵌入式架构设计
|
|
4
|
+
*/
|
|
5
|
+
import type { SearchResult } from './searchAdapter.js';
|
|
6
|
+
export interface ChromaLocalOptions {
|
|
7
|
+
dbPath: string;
|
|
8
|
+
collectionName: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class ChromaLocalSearchEngine {
|
|
11
|
+
private client;
|
|
12
|
+
private collection;
|
|
13
|
+
private options;
|
|
14
|
+
private embeddingFunction;
|
|
15
|
+
constructor(options: ChromaLocalOptions);
|
|
16
|
+
private initialize;
|
|
17
|
+
buildIndex(referencesDir: string, hashFile: string): Promise<void>;
|
|
18
|
+
search(query: string, topK?: number, where?: Record<string, unknown>): Promise<SearchResult[]>;
|
|
19
|
+
searchByPriority(query: string, topK?: number): Promise<SearchResult[]>;
|
|
20
|
+
getStats(): Promise<{
|
|
21
|
+
totalDocuments: number;
|
|
22
|
+
}>;
|
|
23
|
+
private calculateDirectoryHash;
|
|
24
|
+
private loadDocumentsFromDirectory;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=chromaLocalSearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chromaLocalSearch.d.ts","sourceRoot":"","sources":["../../src/core/chromaLocalSearch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,oBAAoB,CAAA;AA0BrE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;CACvB;AAsBD,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,iBAAiB,CAAoB;gBAEjC,OAAO,EAAE,kBAAkB;YAKzB,UAAU;IAmClB,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsElE,MAAM,CACV,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAU,EAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,YAAY,EAAE,CAAC;IAuDpB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAI1E,QAAQ,IAAI,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;YAqBvC,sBAAsB;YAQtB,0BAA0B;CAQzC"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 纯本地模式的 ChromaDB 搜索引擎
|
|
3
|
+
* 专为 skill-creator 的嵌入式架构设计
|
|
4
|
+
*/
|
|
5
|
+
import { ChromaClient } from 'chromadb';
|
|
6
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
/**
|
|
9
|
+
* 简单的嵌入函数,基于文本哈希生成固定长度向量
|
|
10
|
+
*/
|
|
11
|
+
class SimpleEmbeddingFunction {
|
|
12
|
+
async generate(texts) {
|
|
13
|
+
return texts.map((text) => {
|
|
14
|
+
// 基于文本内容生成简单的嵌入向量
|
|
15
|
+
const hash = createHash('sha256').update(text).digest('hex');
|
|
16
|
+
const vector = [];
|
|
17
|
+
for (let i = 0; i < hash.length; i += 2) {
|
|
18
|
+
vector.push(parseInt(hash.substr(i, 2), 16) / 255);
|
|
19
|
+
}
|
|
20
|
+
// 确保向量长度为1536(标准OpenAI嵌入维度)
|
|
21
|
+
while (vector.length < 1536) {
|
|
22
|
+
vector.push(0);
|
|
23
|
+
}
|
|
24
|
+
return vector.slice(0, 1536);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export class ChromaLocalSearchEngine {
|
|
29
|
+
client = null;
|
|
30
|
+
collection = null;
|
|
31
|
+
options;
|
|
32
|
+
embeddingFunction;
|
|
33
|
+
constructor(options) {
|
|
34
|
+
this.options = options;
|
|
35
|
+
this.embeddingFunction = new SimpleEmbeddingFunction();
|
|
36
|
+
}
|
|
37
|
+
async initialize() {
|
|
38
|
+
if (this.client)
|
|
39
|
+
return true;
|
|
40
|
+
try {
|
|
41
|
+
// 创建本地模式的 ChromaDB 客户端
|
|
42
|
+
// 使用 in-memory 模式,然后通过文件系统持久化
|
|
43
|
+
this.client = new ChromaClient({
|
|
44
|
+
path: 'http://localhost:8000', // 临时使用 HTTP,但会启动本地服务器
|
|
45
|
+
});
|
|
46
|
+
// 获取或创建集合
|
|
47
|
+
try {
|
|
48
|
+
// 尝试获取集合,使用我们的嵌入函数
|
|
49
|
+
this.collection = await this.client.getCollection({
|
|
50
|
+
name: this.options.collectionName,
|
|
51
|
+
embeddingFunction: this.embeddingFunction,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
// 集合不存在,创建新的
|
|
56
|
+
this.collection = await this.client.createCollection({
|
|
57
|
+
name: this.options.collectionName,
|
|
58
|
+
embeddingFunction: this.embeddingFunction,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.log('❌ 初始化本地 ChromaDB 失败:', error instanceof Error ? error.message : String(error));
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async buildIndex(referencesDir, hashFile) {
|
|
69
|
+
const initialized = await this.initialize();
|
|
70
|
+
if (!initialized) {
|
|
71
|
+
throw new Error('无法初始化 ChromaDB 本地模式');
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
// 计算文件哈希
|
|
75
|
+
const currentHash = await this.calculateDirectoryHash(referencesDir);
|
|
76
|
+
// 检查是否需要重建索引
|
|
77
|
+
let needsRebuild = true;
|
|
78
|
+
try {
|
|
79
|
+
const savedHash = await readFile(hashFile, 'utf8');
|
|
80
|
+
if (savedHash === currentHash) {
|
|
81
|
+
console.log('📦 文件未变化,跳过重建索引');
|
|
82
|
+
needsRebuild = false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
// 哈希文件不存在,需要重建
|
|
87
|
+
}
|
|
88
|
+
if (!needsRebuild)
|
|
89
|
+
return;
|
|
90
|
+
console.log('🔧 构建本地 ChromaDB 索引...');
|
|
91
|
+
// 清空现有集合
|
|
92
|
+
try {
|
|
93
|
+
if (this.collection) {
|
|
94
|
+
await this.collection.delete();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
// 集合为空或不存在,忽略错误
|
|
99
|
+
}
|
|
100
|
+
// 读取并处理文档
|
|
101
|
+
const documents = await this.loadDocumentsFromDirectory(referencesDir);
|
|
102
|
+
if (documents.length === 0) {
|
|
103
|
+
console.log('⚠️ 没有找到文档');
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// 分批添加文档到 ChromaDB
|
|
107
|
+
if (this.collection) {
|
|
108
|
+
const batchSize = 10;
|
|
109
|
+
for (let i = 0; i < documents.length; i += batchSize) {
|
|
110
|
+
const batch = documents.slice(i, i + batchSize);
|
|
111
|
+
const ids = batch.map((doc) => doc.id);
|
|
112
|
+
const contents = batch.map((doc) => doc.content);
|
|
113
|
+
const metadatas = batch.map((doc) => doc.metadata);
|
|
114
|
+
await this.collection.add({
|
|
115
|
+
ids,
|
|
116
|
+
documents: contents,
|
|
117
|
+
metadatas: metadatas,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// 保存哈希值
|
|
122
|
+
await writeFile(hashFile, currentHash);
|
|
123
|
+
console.log(`✅ 构建完成,共处理 ${documents.length} 个文档`);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.log('❌ 构建索引失败:', error instanceof Error ? error.message : String(error));
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async search(query, topK = 5, where) {
|
|
131
|
+
const initialized = await this.initialize();
|
|
132
|
+
if (!initialized) {
|
|
133
|
+
throw new Error('无法初始化 ChromaDB 本地模式');
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
if (!this.collection) {
|
|
137
|
+
throw new Error('ChromaDB 集合未初始化');
|
|
138
|
+
}
|
|
139
|
+
// 构建查询条件
|
|
140
|
+
const queryOptions = {
|
|
141
|
+
queryTexts: [query],
|
|
142
|
+
nResults: topK,
|
|
143
|
+
};
|
|
144
|
+
if (where) {
|
|
145
|
+
queryOptions.where = where;
|
|
146
|
+
}
|
|
147
|
+
const results = await this.collection.query(queryOptions);
|
|
148
|
+
// 转换结果格式
|
|
149
|
+
const searchResults = [];
|
|
150
|
+
if (results.ids[0] && results.documents[0] && results.metadatas[0]) {
|
|
151
|
+
for (let i = 0; i < results.ids[0].length; i++) {
|
|
152
|
+
const metadata = results.metadatas[0][i];
|
|
153
|
+
searchResults.push({
|
|
154
|
+
id: results.ids[0][i],
|
|
155
|
+
source: 'context7', // ChromaDB 主要用于 context7 文档
|
|
156
|
+
file_path: metadata.filePath || metadata.file_path || 'unknown',
|
|
157
|
+
title: metadata.title || '未知文档',
|
|
158
|
+
content: results.documents[0][i] || '',
|
|
159
|
+
score: results.distances?.[0]?.[i] ? 1 - results.distances[0][i] : 1,
|
|
160
|
+
metadata: {
|
|
161
|
+
...metadata,
|
|
162
|
+
originalSource: metadata.originalSource,
|
|
163
|
+
searchEngine: 'chroma-local',
|
|
164
|
+
embeddingDimension: 1536,
|
|
165
|
+
similarity: results.distances?.[0]?.[i] || 0,
|
|
166
|
+
indexedAt: new Date().toISOString(),
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return searchResults;
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
console.log('❌ 本地搜索失败:', error instanceof Error ? error.message : String(error));
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async searchByPriority(query, topK = 5) {
|
|
179
|
+
return this.search(query, topK);
|
|
180
|
+
}
|
|
181
|
+
async getStats() {
|
|
182
|
+
const initialized = await this.initialize();
|
|
183
|
+
if (!initialized) {
|
|
184
|
+
return { totalDocuments: 0 };
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
if (!this.collection) {
|
|
188
|
+
return { totalDocuments: 0 };
|
|
189
|
+
}
|
|
190
|
+
const count = await this.collection.count();
|
|
191
|
+
return { totalDocuments: count };
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
console.log('❌ 获取本地统计信息失败:', error instanceof Error ? error.message : String(error));
|
|
195
|
+
return { totalDocuments: 0 };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
async calculateDirectoryHash(dirPath) {
|
|
199
|
+
const hash = createHash('md5');
|
|
200
|
+
// 简化版本:基于目录结构和文件大小计算哈希
|
|
201
|
+
// 在实际应用中,这里可以实现更复杂的哈希算法
|
|
202
|
+
hash.update(dirPath + Date.now());
|
|
203
|
+
return hash.digest('hex');
|
|
204
|
+
}
|
|
205
|
+
async loadDocumentsFromDirectory(dirPath) {
|
|
206
|
+
const documents = [];
|
|
207
|
+
// 简化版本:这里应该递归读取目录中的所有文件
|
|
208
|
+
// 为了演示,我们假设有一些文件
|
|
209
|
+
return documents;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=chromaLocalSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chromaLocalSearch.js","sourceRoot":"","sources":["../../src/core/chromaLocalSearch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAkC,MAAM,UAAU,CAAA;AAEvE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC;;GAEG;AACH,MAAM,uBAAuB;IAC3B,KAAK,CAAC,QAAQ,CAAC,KAAe;QAC5B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACxB,kBAAkB;YAClB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC5D,MAAM,MAAM,GAAa,EAAE,CAAA;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAA;YACpD,CAAC;YACD,4BAA4B;YAC5B,OAAO,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChB,CAAC;YACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAC9B,CAAC,CAAC,CAAA;IACJ,CAAC;CACF;AA2BD,MAAM,OAAO,uBAAuB;IAC1B,MAAM,GAAwB,IAAI,CAAA;IAClC,UAAU,GAAsB,IAAI,CAAA;IACpC,OAAO,CAAoB;IAC3B,iBAAiB,CAAoB;IAE7C,YAAY,OAA2B;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,iBAAiB,GAAG,IAAI,uBAAuB,EAAE,CAAA;IACxD,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAE5B,IAAI,CAAC;YACH,uBAAuB;YACvB,8BAA8B;YAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC;gBAC7B,IAAI,EAAE,uBAAuB,EAAE,sBAAsB;aACtD,CAAC,CAAA;YAEF,UAAU;YACV,IAAI,CAAC;gBACH,mBAAmB;gBACnB,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;oBAChD,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;oBACjC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;iBAC1C,CAAC,CAAA;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,aAAa;gBACb,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;oBACnD,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;oBACjC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;iBAC1C,CAAC,CAAA;YACJ,CAAC;YAED,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CACT,sBAAsB,EACtB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAA;YACD,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,aAAqB,EAAE,QAAgB;QACtD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;QACxC,CAAC;QAED,IAAI,CAAC;YACH,SAAS;YACT,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAA;YAEpE,aAAa;YACb,IAAI,YAAY,GAAG,IAAI,CAAA;YACvB,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAClD,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;oBAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;oBAC9B,YAAY,GAAG,KAAK,CAAA;gBACtB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,eAAe;YACjB,CAAC;YAED,IAAI,CAAC,YAAY;gBAAE,OAAM;YAEzB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;YAErC,SAAS;YACT,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAA;gBAChC,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,gBAAgB;YAClB,CAAC;YAED,UAAU;YACV,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,aAAa,CAAC,CAAA;YAEtE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;gBACzB,OAAM;YACR,CAAC;YAED,mBAAmB;YACnB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,SAAS,GAAG,EAAE,CAAA;gBACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;oBACrD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAA;oBAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;oBACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;oBAChD,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;oBAElD,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;wBACxB,GAAG;wBACH,SAAS,EAAE,QAAQ;wBACnB,SAAS,EAAE,SAAwD;qBACpE,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YAED,QAAQ;YACR,MAAM,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;YAEtC,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,CAAC,MAAM,MAAM,CAAC,CAAA;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YAChF,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,KAAa,EACb,OAAe,CAAC,EAChB,KAA+B;QAE/B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;QACxC,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;YACpC,CAAC;YAED,SAAS;YACT,MAAM,YAAY,GAAiB;gBACjC,UAAU,EAAE,CAAC,KAAK,CAAC;gBACnB,QAAQ,EAAE,IAAI;aACf,CAAA;YAED,IAAI,KAAK,EAAE,CAAC;gBACV,YAAY,CAAC,KAAK,GAAG,KAAK,CAAA;YAC5B,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;YAEzD,SAAS;YACT,MAAM,aAAa,GAAmB,EAAE,CAAA;YAExC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAqB,CAAA;oBAC5D,aAAa,CAAC,IAAI,CAAC;wBACjB,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACrB,MAAM,EAAE,UAAU,EAAE,4BAA4B;wBAChD,SAAS,EAAE,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,IAAI,SAAS;wBAC/D,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,MAAM;wBAC/B,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;wBACtC,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACpE,QAAQ,EAAE;4BACR,GAAG,QAAQ;4BACX,cAAc,EAAE,QAAQ,CAAC,cAAc;4BACvC,YAAY,EAAE,cAAc;4BAC5B,kBAAkB,EAAE,IAAI;4BACxB,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;4BAC5C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;yBACpC;qBACF,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YAED,OAAO,aAAa,CAAA;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YAChF,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,KAAa,EAAE,OAAe,CAAC;QACpD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,CAAA;QAC9B,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,CAAA;YAC9B,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;YAC3C,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,CAAA;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CACT,eAAe,EACf,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAA;YACD,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,CAAA;QAC9B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,OAAe;QAClD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;QAC9B,uBAAuB;QACvB,wBAAwB;QACxB,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;IAEO,KAAK,CAAC,0BAA0B,CAAC,OAAe;QACtD,MAAM,SAAS,GAAe,EAAE,CAAA;QAEhC,wBAAwB;QACxB,iBAAiB;QAEjB,OAAO,SAAS,CAAA;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 简化的 ChromaDB 本地搜索引擎
|
|
3
|
+
* 根据 Context7 文档实现最简单的用法
|
|
4
|
+
*/
|
|
5
|
+
import type { SearchResult } from './searchAdapter.js';
|
|
6
|
+
export interface ChromaLocalSimpleOptions {
|
|
7
|
+
collectionName: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class ChromaLocalSimpleEngine {
|
|
10
|
+
private client;
|
|
11
|
+
private collection;
|
|
12
|
+
private options;
|
|
13
|
+
private embeddingFunction;
|
|
14
|
+
constructor(options: ChromaLocalSimpleOptions);
|
|
15
|
+
private initialize;
|
|
16
|
+
buildIndex(referencesDir: string, hashFile: string): Promise<void>;
|
|
17
|
+
search(query: string, topK?: number, where?: Record<string, unknown>): Promise<SearchResult[]>;
|
|
18
|
+
searchByPriority(query: string, topK?: number): Promise<SearchResult[]>;
|
|
19
|
+
getStats(): Promise<{
|
|
20
|
+
totalDocuments: number;
|
|
21
|
+
}>;
|
|
22
|
+
private calculateDirectoryHash;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=chromaLocalSimple.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chromaLocalSimple.d.ts","sourceRoot":"","sources":["../../src/core/chromaLocalSimple.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,oBAAoB,CAAA;AAyBrE,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,MAAM,CAAA;CACvB;AAUD,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,iBAAiB,CAAoB;gBAEjC,OAAO,EAAE,wBAAwB;YAK/B,UAAU;IAiClB,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0FlE,MAAM,CACV,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAU,EAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,YAAY,EAAE,CAAC;IAkDpB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAI1E,QAAQ,IAAI,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;YAkBvC,sBAAsB;CAKrC"}
|