@devflow-tools/context-engine 0.14.4 → 0.16.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/dist/claude-rerank.d.ts +0 -3
- package/dist/claude-rerank.d.ts.map +1 -1
- package/dist/claude-rerank.js +0 -88
- package/dist/claude-rerank.js.map +1 -1
- package/dist/compressor.d.ts +8 -1
- package/dist/compressor.d.ts.map +1 -1
- package/dist/compressor.js +186 -19
- package/dist/compressor.js.map +1 -1
- package/dist/context-engine.d.ts +12 -0
- package/dist/context-engine.d.ts.map +1 -1
- package/dist/context-engine.js +202 -26
- package/dist/context-engine.js.map +1 -1
- package/dist/create-engines.d.ts +5 -2
- package/dist/create-engines.d.ts.map +1 -1
- package/dist/create-engines.js +35 -14
- package/dist/create-engines.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/indexer-adapter.d.ts +6 -2
- package/dist/indexer-adapter.d.ts.map +1 -1
- package/dist/indexer-adapter.js +34 -5
- package/dist/indexer-adapter.js.map +1 -1
- package/dist/intent-parser.d.ts +6 -0
- package/dist/intent-parser.d.ts.map +1 -1
- package/dist/intent-parser.js +263 -98
- package/dist/intent-parser.js.map +1 -1
- package/dist/onboarding-pack-builder.d.ts +31 -3
- package/dist/onboarding-pack-builder.d.ts.map +1 -1
- package/dist/onboarding-pack-builder.js +124 -7
- package/dist/onboarding-pack-builder.js.map +1 -1
- package/dist/retrieval-handlers.d.ts +42 -0
- package/dist/retrieval-handlers.d.ts.map +1 -0
- package/dist/retrieval-handlers.js +74 -0
- package/dist/retrieval-handlers.js.map +1 -0
- package/dist/symbol-embedder.d.ts +38 -0
- package/dist/symbol-embedder.d.ts.map +1 -0
- package/dist/symbol-embedder.js +174 -0
- package/dist/symbol-embedder.js.map +1 -0
- package/dist/symbol-vector-store.d.ts +25 -0
- package/dist/symbol-vector-store.d.ts.map +1 -0
- package/dist/symbol-vector-store.js +125 -0
- package/dist/symbol-vector-store.js.map +1 -0
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +9 -6
- package/dist/llm-translator.d.ts +0 -6
- package/dist/llm-translator.d.ts.map +0 -1
- package/dist/llm-translator.js +0 -143
- package/dist/llm-translator.js.map +0 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import * as sqliteVec from "sqlite-vec";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
5
|
+
export class SymbolVectorStore {
|
|
6
|
+
db;
|
|
7
|
+
initialized = false;
|
|
8
|
+
constructor(projectRoot) {
|
|
9
|
+
const dir = join(projectRoot, ".devflow");
|
|
10
|
+
if (!existsSync(dir))
|
|
11
|
+
mkdirSync(dir, { recursive: true });
|
|
12
|
+
const dbPath = join(dir, "symbols-vec.db");
|
|
13
|
+
this.db = new Database(dbPath);
|
|
14
|
+
this.db.pragma("journal_mode = WAL");
|
|
15
|
+
this.db.pragma("busy_timeout = 5000");
|
|
16
|
+
}
|
|
17
|
+
initialize() {
|
|
18
|
+
if (this.initialized)
|
|
19
|
+
return;
|
|
20
|
+
sqliteVec.load(this.db);
|
|
21
|
+
this.db.exec(`
|
|
22
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS symbols_vec USING vec0(
|
|
23
|
+
id TEXT PRIMARY KEY,
|
|
24
|
+
embedding FLOAT[384]
|
|
25
|
+
);
|
|
26
|
+
CREATE TABLE IF NOT EXISTS symbol_sources (
|
|
27
|
+
id TEXT PRIMARY KEY,
|
|
28
|
+
file_path TEXT NOT NULL
|
|
29
|
+
);
|
|
30
|
+
CREATE INDEX IF NOT EXISTS idx_symbol_sources_file
|
|
31
|
+
ON symbol_sources(file_path);
|
|
32
|
+
`);
|
|
33
|
+
this.initialized = true;
|
|
34
|
+
}
|
|
35
|
+
upsert(id, filePath, embedding) {
|
|
36
|
+
this.upsertBatch([{ id, filePath, embedding }]);
|
|
37
|
+
}
|
|
38
|
+
upsertBatch(entries) {
|
|
39
|
+
if (entries.length === 0)
|
|
40
|
+
return;
|
|
41
|
+
const deleteVector = this.db.prepare("DELETE FROM symbols_vec WHERE id = ?");
|
|
42
|
+
const insertVector = this.db.prepare("INSERT INTO symbols_vec(id, embedding) VALUES (?, ?)");
|
|
43
|
+
const upsertSource = this.db.prepare(`
|
|
44
|
+
INSERT INTO symbol_sources(id, file_path) VALUES (?, ?)
|
|
45
|
+
ON CONFLICT(id) DO UPDATE SET file_path = excluded.file_path
|
|
46
|
+
`);
|
|
47
|
+
const runAll = this.db.transaction(() => {
|
|
48
|
+
for (const { id, filePath, embedding } of entries) {
|
|
49
|
+
deleteVector.run(id);
|
|
50
|
+
insertVector.run(id, Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength));
|
|
51
|
+
upsertSource.run(id, filePath);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
runAll();
|
|
55
|
+
}
|
|
56
|
+
replaceAll(entries) {
|
|
57
|
+
const deleteVectors = this.db.prepare("DELETE FROM symbols_vec");
|
|
58
|
+
const deleteSources = this.db.prepare("DELETE FROM symbol_sources");
|
|
59
|
+
const insertVector = this.db.prepare("INSERT INTO symbols_vec(id, embedding) VALUES (?, ?)");
|
|
60
|
+
const insertSource = this.db.prepare("INSERT INTO symbol_sources(id, file_path) VALUES (?, ?)");
|
|
61
|
+
const replace = this.db.transaction(() => {
|
|
62
|
+
deleteVectors.run();
|
|
63
|
+
deleteSources.run();
|
|
64
|
+
for (const { id, filePath, embedding } of entries) {
|
|
65
|
+
insertVector.run(id, Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength));
|
|
66
|
+
insertSource.run(id, filePath);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
replace();
|
|
70
|
+
}
|
|
71
|
+
search(embedding, limit) {
|
|
72
|
+
const buffer = Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength);
|
|
73
|
+
return this.db
|
|
74
|
+
.prepare(`SELECT id, vec_distance_cosine(embedding, ?) as distance
|
|
75
|
+
FROM symbols_vec
|
|
76
|
+
ORDER BY distance
|
|
77
|
+
LIMIT ?`)
|
|
78
|
+
.all(buffer, limit);
|
|
79
|
+
}
|
|
80
|
+
delete(ids) {
|
|
81
|
+
if (ids.length === 0)
|
|
82
|
+
return;
|
|
83
|
+
const placeholders = ids.map(() => "?").join(",");
|
|
84
|
+
const deleteRows = this.db.transaction(() => {
|
|
85
|
+
this.db
|
|
86
|
+
.prepare(`DELETE FROM symbols_vec WHERE id IN (${placeholders})`)
|
|
87
|
+
.run(...ids);
|
|
88
|
+
this.db
|
|
89
|
+
.prepare(`DELETE FROM symbol_sources WHERE id IN (${placeholders})`)
|
|
90
|
+
.run(...ids);
|
|
91
|
+
});
|
|
92
|
+
deleteRows();
|
|
93
|
+
}
|
|
94
|
+
deleteByFiles(filePaths) {
|
|
95
|
+
if (filePaths.length === 0)
|
|
96
|
+
return;
|
|
97
|
+
const placeholders = filePaths.map(() => "?").join(",");
|
|
98
|
+
const rows = this.db
|
|
99
|
+
.prepare(`SELECT id FROM symbol_sources WHERE file_path IN (${placeholders})`)
|
|
100
|
+
.all(...filePaths);
|
|
101
|
+
this.delete(rows.map(({ id }) => id));
|
|
102
|
+
}
|
|
103
|
+
get(id) {
|
|
104
|
+
const row = this.db
|
|
105
|
+
.prepare("SELECT embedding FROM symbols_vec WHERE id = ?")
|
|
106
|
+
.get(id);
|
|
107
|
+
return row?.embedding ?? null;
|
|
108
|
+
}
|
|
109
|
+
count() {
|
|
110
|
+
const row = this.db
|
|
111
|
+
.prepare("SELECT COUNT(*) as c FROM symbols_vec")
|
|
112
|
+
.get();
|
|
113
|
+
return row.c;
|
|
114
|
+
}
|
|
115
|
+
countSources() {
|
|
116
|
+
const row = this.db
|
|
117
|
+
.prepare("SELECT COUNT(*) as c FROM symbol_sources")
|
|
118
|
+
.get();
|
|
119
|
+
return row.c;
|
|
120
|
+
}
|
|
121
|
+
close() {
|
|
122
|
+
this.db.close();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=symbol-vector-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-vector-store.js","sourceRoot":"","sources":["../src/symbol-vector-store.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -16,7 +16,8 @@ export type TaskType = "debug" | "feature" | "understand" | "review" | "refactor
|
|
|
16
16
|
export interface OnboardingPack {
|
|
17
17
|
projectName: string;
|
|
18
18
|
createdAt: string;
|
|
19
|
-
|
|
19
|
+
rootPath: string;
|
|
20
|
+
projectHash: string;
|
|
20
21
|
stats: {
|
|
21
22
|
files: number;
|
|
22
23
|
symbols: number;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC/E,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAE9F,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC/E,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAE9F,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAChG,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,kBAAkB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/context-engine",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -22,10 +22,13 @@
|
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@colbymchenry/codegraph": "^1.1.1",
|
|
25
|
-
"@devflow-tools/knowledge-engine": "
|
|
26
|
-
"@devflow-tools/memory-engine": "
|
|
27
|
-
"@devflow-tools/sdk": "
|
|
28
|
-
"@devflow-tools/telemetry": "
|
|
25
|
+
"@devflow-tools/knowledge-engine": "0.16.0",
|
|
26
|
+
"@devflow-tools/memory-engine": "0.16.0",
|
|
27
|
+
"@devflow-tools/sdk": "0.16.0",
|
|
28
|
+
"@devflow-tools/telemetry": "0.16.0",
|
|
29
|
+
"better-sqlite3": "^12.11.1",
|
|
30
|
+
"nodejieba": "^3.5.8",
|
|
31
|
+
"sqlite-vec": "^0.1.9"
|
|
29
32
|
},
|
|
30
33
|
"devDependencies": {
|
|
31
34
|
"typescript": "^5.5.0",
|
|
@@ -34,5 +37,5 @@
|
|
|
34
37
|
"files": [
|
|
35
38
|
"dist"
|
|
36
39
|
],
|
|
37
|
-
"gitHead": "
|
|
40
|
+
"gitHead": "2f52776bda72517354d44453756cccb9e8de9afa"
|
|
38
41
|
}
|
package/dist/llm-translator.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Layer 2: Translate Chinese query terms using LLM with disk cache.
|
|
3
|
-
* On failure (timeout, no API key, network error), returns the original query unchanged.
|
|
4
|
-
*/
|
|
5
|
-
export declare function translateQuery(query: string, projectRoot: string, _existingExpandedTerms?: string[]): Promise<string>;
|
|
6
|
-
//# sourceMappingURL=llm-translator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm-translator.d.ts","sourceRoot":"","sources":["../src/llm-translator.ts"],"names":[],"mappings":"AAmHA;;;GAGG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,sBAAsB,GAAE,MAAM,EAAO,GACpC,OAAO,CAAC,MAAM,CAAC,CAiCjB"}
|
package/dist/llm-translator.js
DELETED
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
let cache = null;
|
|
4
|
-
let cachePath = "";
|
|
5
|
-
let cacheLoaded = false;
|
|
6
|
-
function loadCache(projectRoot) {
|
|
7
|
-
const cgDir = join(projectRoot, ".codegraph");
|
|
8
|
-
const file = join(cgDir, "zh-en-cache.json");
|
|
9
|
-
cachePath = file;
|
|
10
|
-
if (!existsSync(file))
|
|
11
|
-
return {};
|
|
12
|
-
try {
|
|
13
|
-
return JSON.parse(readFileSync(file, "utf-8"));
|
|
14
|
-
}
|
|
15
|
-
catch {
|
|
16
|
-
return {};
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
function saveCache() {
|
|
20
|
-
if (!cachePath || !cache)
|
|
21
|
-
return;
|
|
22
|
-
const dir = join(cachePath, "..");
|
|
23
|
-
if (!existsSync(dir))
|
|
24
|
-
mkdirSync(dir, { recursive: true });
|
|
25
|
-
try {
|
|
26
|
-
writeFileSync(cachePath, JSON.stringify(cache, null, 2));
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
// Cache write failure is non-fatal
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
function getCached(projectRoot, term) {
|
|
33
|
-
if (!cacheLoaded) {
|
|
34
|
-
cache = loadCache(projectRoot);
|
|
35
|
-
cacheLoaded = true;
|
|
36
|
-
}
|
|
37
|
-
return cache?.[term] ?? null;
|
|
38
|
-
}
|
|
39
|
-
function setCached(projectRoot, term, translation) {
|
|
40
|
-
if (!cacheLoaded) {
|
|
41
|
-
cache = loadCache(projectRoot);
|
|
42
|
-
cacheLoaded = true;
|
|
43
|
-
}
|
|
44
|
-
if (!cache)
|
|
45
|
-
cache = {};
|
|
46
|
-
cache[term] = translation;
|
|
47
|
-
saveCache();
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Call OpenRouter (OpenAI-compatible) API to translate Chinese terms to English
|
|
51
|
-
* code-relevant keywords. Timeout at 2s. Returns empty object on any failure.
|
|
52
|
-
*/
|
|
53
|
-
async function callLLM(terms) {
|
|
54
|
-
const baseUrl = process.env.OPENROUTER_BASE_URL ??
|
|
55
|
-
"https://openrouter.ai/api/v1";
|
|
56
|
-
const apiKey = process.env.OPENROUTER_API_KEY ?? "";
|
|
57
|
-
if (!apiKey)
|
|
58
|
-
return {};
|
|
59
|
-
const controller = new AbortController();
|
|
60
|
-
const timeout = setTimeout(() => controller.abort(), 2000);
|
|
61
|
-
try {
|
|
62
|
-
const response = await fetch(`${baseUrl}/chat/completions`, {
|
|
63
|
-
method: "POST",
|
|
64
|
-
headers: {
|
|
65
|
-
"Content-Type": "application/json",
|
|
66
|
-
Authorization: `Bearer ${apiKey}`,
|
|
67
|
-
},
|
|
68
|
-
body: JSON.stringify({
|
|
69
|
-
model: "qwen/qwen-2.5-72b-instruct",
|
|
70
|
-
max_tokens: 100,
|
|
71
|
-
temperature: 0.1,
|
|
72
|
-
messages: [
|
|
73
|
-
{
|
|
74
|
-
role: "system",
|
|
75
|
-
content: "You are a code term translator. Translate Chinese phrases to English code-relevant keywords. Output one line per term in format: chinese=english keywords",
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
role: "user",
|
|
79
|
-
content: terms.join("\n"),
|
|
80
|
-
},
|
|
81
|
-
],
|
|
82
|
-
}),
|
|
83
|
-
signal: controller.signal,
|
|
84
|
-
});
|
|
85
|
-
const data = (await response.json());
|
|
86
|
-
const text = data?.choices?.[0]?.message?.content ?? "";
|
|
87
|
-
const result = {};
|
|
88
|
-
for (const line of text.split("\n")) {
|
|
89
|
-
const eqIdx = line.indexOf("=");
|
|
90
|
-
if (eqIdx === -1)
|
|
91
|
-
continue;
|
|
92
|
-
const chinese = line.slice(0, eqIdx).trim();
|
|
93
|
-
const english = line.slice(eqIdx + 1).trim();
|
|
94
|
-
if (chinese && english) {
|
|
95
|
-
result[chinese] = english;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return result;
|
|
99
|
-
}
|
|
100
|
-
catch {
|
|
101
|
-
return {};
|
|
102
|
-
}
|
|
103
|
-
finally {
|
|
104
|
-
clearTimeout(timeout);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Layer 2: Translate Chinese query terms using LLM with disk cache.
|
|
109
|
-
* On failure (timeout, no API key, network error), returns the original query unchanged.
|
|
110
|
-
*/
|
|
111
|
-
export async function translateQuery(query, projectRoot, _existingExpandedTerms = []) {
|
|
112
|
-
const hasChinese = /[一-鿿]/.test(query);
|
|
113
|
-
if (!hasChinese)
|
|
114
|
-
return query;
|
|
115
|
-
// Extract consecutive Chinese phrases (2+ chars)
|
|
116
|
-
const chinesePhrases = query.match(/[一-鿿]{2,}/g) ?? [];
|
|
117
|
-
if (chinesePhrases.length === 0)
|
|
118
|
-
return query;
|
|
119
|
-
// Check cache and collect uncached terms
|
|
120
|
-
const translations = [];
|
|
121
|
-
const uncached = [];
|
|
122
|
-
for (const phrase of chinesePhrases) {
|
|
123
|
-
const cached = getCached(projectRoot, phrase);
|
|
124
|
-
if (cached) {
|
|
125
|
-
translations.push(cached);
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
uncached.push(phrase);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
// Call LLM for uncached terms
|
|
132
|
-
if (uncached.length > 0) {
|
|
133
|
-
const llmResult = await callLLM(uncached);
|
|
134
|
-
for (const [chinese, english] of Object.entries(llmResult)) {
|
|
135
|
-
setCached(projectRoot, chinese, english);
|
|
136
|
-
translations.push(english);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
if (translations.length === 0)
|
|
140
|
-
return query;
|
|
141
|
-
return query + " " + translations.join(" ");
|
|
142
|
-
}
|
|
143
|
-
//# sourceMappingURL=llm-translator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm-translator.js","sourceRoot":"","sources":["../src/llm-translator.ts"],"names":[],"mappings":"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"}
|