structx 2.2.1 → 3.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/dist/benchmark/baseline.d.ts +2 -1
- package/dist/benchmark/baseline.d.ts.map +1 -1
- package/dist/benchmark/baseline.js +7 -18
- package/dist/benchmark/baseline.js.map +1 -1
- package/dist/benchmark/runner.d.ts +2 -1
- package/dist/benchmark/runner.d.ts.map +1 -1
- package/dist/benchmark/runner.js +4 -4
- package/dist/benchmark/runner.js.map +1 -1
- package/dist/cli.js +100 -45
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +12 -1
- package/dist/config.js.map +1 -1
- package/dist/providers/anthropic.d.ts +12 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +32 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/factory.d.ts +18 -0
- package/dist/providers/factory.d.ts.map +1 -0
- package/dist/providers/factory.js +49 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/gemini.d.ts +12 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +35 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/interface.d.ts +18 -0
- package/dist/providers/interface.d.ts.map +1 -0
- package/dist/providers/interface.js +3 -0
- package/dist/providers/interface.js.map +1 -0
- package/dist/providers/openrouter.d.ts +12 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +38 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/query/answerer.d.ts +2 -1
- package/dist/query/answerer.d.ts.map +1 -1
- package/dist/query/answerer.js +7 -18
- package/dist/query/answerer.js.map +1 -1
- package/dist/query/classifier.d.ts +2 -1
- package/dist/query/classifier.d.ts.map +1 -1
- package/dist/query/classifier.js +4 -13
- package/dist/query/classifier.js.map +1 -1
- package/dist/semantic/analyzer.d.ts +5 -4
- package/dist/semantic/analyzer.d.ts.map +1 -1
- package/dist/semantic/analyzer.js +34 -61
- package/dist/semantic/analyzer.js.map +1 -1
- package/dist/utils/tokens.d.ts.map +1 -1
- package/dist/utils/tokens.js +6 -0
- package/dist/utils/tokens.js.map +1 -1
- package/package.json +3 -1
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAqB5D;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAqBnF"}
|
package/dist/config.js
CHANGED
|
@@ -60,10 +60,15 @@ function loadConfig(structxDir) {
|
|
|
60
60
|
}
|
|
61
61
|
const raw = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
62
62
|
const apiKey = raw.anthropicApiKey || process.env.ANTHROPIC_API_KEY || '';
|
|
63
|
+
const geminiApiKey = raw.geminiApiKey || process.env.GEMINI_API_KEY || '';
|
|
64
|
+
const openrouterApiKey = raw.openrouterApiKey || process.env.OPENROUTER_API_KEY || '';
|
|
63
65
|
return {
|
|
64
66
|
...DEFAULT_CONFIG,
|
|
65
67
|
...raw,
|
|
66
68
|
anthropicApiKey: apiKey,
|
|
69
|
+
geminiApiKey,
|
|
70
|
+
openrouterApiKey,
|
|
71
|
+
provider: raw.provider || null,
|
|
67
72
|
structxDir,
|
|
68
73
|
};
|
|
69
74
|
}
|
|
@@ -72,11 +77,17 @@ function saveConfig(structxDir, config) {
|
|
|
72
77
|
if (!fs.existsSync(structxDir)) {
|
|
73
78
|
fs.mkdirSync(structxDir, { recursive: true });
|
|
74
79
|
}
|
|
75
|
-
// Don't persist
|
|
80
|
+
// Don't persist API keys to disk if they came from env
|
|
76
81
|
const toSave = { ...config };
|
|
77
82
|
if (process.env.ANTHROPIC_API_KEY && toSave.anthropicApiKey === process.env.ANTHROPIC_API_KEY) {
|
|
78
83
|
delete toSave.anthropicApiKey;
|
|
79
84
|
}
|
|
85
|
+
if (process.env.GEMINI_API_KEY && toSave.geminiApiKey === process.env.GEMINI_API_KEY) {
|
|
86
|
+
delete toSave.geminiApiKey;
|
|
87
|
+
}
|
|
88
|
+
if (process.env.OPENROUTER_API_KEY && toSave.openrouterApiKey === process.env.OPENROUTER_API_KEY) {
|
|
89
|
+
delete toSave.openrouterApiKey;
|
|
90
|
+
}
|
|
80
91
|
delete toSave.structxDir;
|
|
81
92
|
fs.writeFileSync(configPath, JSON.stringify(toSave, null, 2), 'utf-8');
|
|
82
93
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { LLMProvider, LLMMessage, LLMResponse } from './interface';
|
|
2
|
+
export declare class AnthropicProvider implements LLMProvider {
|
|
3
|
+
private client;
|
|
4
|
+
constructor(apiKey: string);
|
|
5
|
+
chat(opts: {
|
|
6
|
+
model: string;
|
|
7
|
+
maxTokens: number;
|
|
8
|
+
messages: LLMMessage[];
|
|
9
|
+
system?: string;
|
|
10
|
+
}): Promise<LLMResponse>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExE,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,MAAM;IAIpB,IAAI,CAAC,IAAI,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,WAAW,CAAC;CAmBzB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AnthropicProvider = void 0;
|
|
7
|
+
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
8
|
+
class AnthropicProvider {
|
|
9
|
+
client;
|
|
10
|
+
constructor(apiKey) {
|
|
11
|
+
this.client = new sdk_1.default({ apiKey });
|
|
12
|
+
}
|
|
13
|
+
async chat(opts) {
|
|
14
|
+
const response = await this.client.messages.create({
|
|
15
|
+
model: opts.model,
|
|
16
|
+
max_tokens: opts.maxTokens,
|
|
17
|
+
messages: opts.messages.map(m => ({ role: m.role, content: m.content })),
|
|
18
|
+
...(opts.system ? { system: opts.system } : {}),
|
|
19
|
+
});
|
|
20
|
+
const text = response.content
|
|
21
|
+
.filter(block => block.type === 'text')
|
|
22
|
+
.map(block => block.text)
|
|
23
|
+
.join('');
|
|
24
|
+
return {
|
|
25
|
+
text,
|
|
26
|
+
inputTokens: response.usage?.input_tokens ?? 0,
|
|
27
|
+
outputTokens: response.usage?.output_tokens ?? 0,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.AnthropicProvider = AnthropicProvider;
|
|
32
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":";;;;;;AAAA,4DAA0C;AAG1C,MAAa,iBAAiB;IACpB,MAAM,CAAY;IAE1B,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,aAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAKV;QACC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,SAAS;YAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACxE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO;aAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;aACtC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAE,KAAa,CAAC,IAAI,CAAC;aACjC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEZ,OAAO;YACL,IAAI;YACJ,WAAW,EAAE,QAAQ,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC;YAC9C,YAAY,EAAE,QAAQ,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC;SACjD,CAAC;IACJ,CAAC;CACF;AA/BD,8CA+BC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LLMProvider } from './interface';
|
|
2
|
+
export type ProviderName = 'anthropic' | 'gemini' | 'openrouter';
|
|
3
|
+
export declare function createProvider(provider: ProviderName, apiKey: string): LLMProvider;
|
|
4
|
+
export declare function detectProvider(keys: {
|
|
5
|
+
anthropicApiKey?: string;
|
|
6
|
+
geminiApiKey?: string;
|
|
7
|
+
openrouterApiKey?: string;
|
|
8
|
+
}): {
|
|
9
|
+
provider: ProviderName;
|
|
10
|
+
apiKey: string;
|
|
11
|
+
} | null;
|
|
12
|
+
/** Default models per provider for each role */
|
|
13
|
+
export declare const DEFAULT_MODELS: Record<ProviderName, {
|
|
14
|
+
analysis: string;
|
|
15
|
+
classifier: string;
|
|
16
|
+
answer: string;
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/providers/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,YAAY,CAAC;AAEjE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CASlF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWpD;AAED,gDAAgD;AAChD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,YAAY,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAgBzG,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_MODELS = void 0;
|
|
4
|
+
exports.createProvider = createProvider;
|
|
5
|
+
exports.detectProvider = detectProvider;
|
|
6
|
+
const anthropic_1 = require("./anthropic");
|
|
7
|
+
const gemini_1 = require("./gemini");
|
|
8
|
+
const openrouter_1 = require("./openrouter");
|
|
9
|
+
function createProvider(provider, apiKey) {
|
|
10
|
+
switch (provider) {
|
|
11
|
+
case 'anthropic':
|
|
12
|
+
return new anthropic_1.AnthropicProvider(apiKey);
|
|
13
|
+
case 'gemini':
|
|
14
|
+
return new gemini_1.GeminiProvider(apiKey);
|
|
15
|
+
case 'openrouter':
|
|
16
|
+
return new openrouter_1.OpenRouterProvider(apiKey);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function detectProvider(keys) {
|
|
20
|
+
if (keys.anthropicApiKey) {
|
|
21
|
+
return { provider: 'anthropic', apiKey: keys.anthropicApiKey };
|
|
22
|
+
}
|
|
23
|
+
if (keys.geminiApiKey) {
|
|
24
|
+
return { provider: 'gemini', apiKey: keys.geminiApiKey };
|
|
25
|
+
}
|
|
26
|
+
if (keys.openrouterApiKey) {
|
|
27
|
+
return { provider: 'openrouter', apiKey: keys.openrouterApiKey };
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
/** Default models per provider for each role */
|
|
32
|
+
exports.DEFAULT_MODELS = {
|
|
33
|
+
anthropic: {
|
|
34
|
+
analysis: 'claude-haiku-4-5-20251001',
|
|
35
|
+
classifier: 'claude-haiku-4-5-20251001',
|
|
36
|
+
answer: 'claude-sonnet-4-5-20250929',
|
|
37
|
+
},
|
|
38
|
+
gemini: {
|
|
39
|
+
analysis: 'gemini-2.0-flash',
|
|
40
|
+
classifier: 'gemini-2.0-flash',
|
|
41
|
+
answer: 'gemini-2.5-pro-preview-06-05',
|
|
42
|
+
},
|
|
43
|
+
openrouter: {
|
|
44
|
+
analysis: 'anthropic/claude-3.5-sonnet',
|
|
45
|
+
classifier: 'anthropic/claude-3.5-sonnet',
|
|
46
|
+
answer: 'anthropic/claude-3.5-sonnet',
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/providers/factory.ts"],"names":[],"mappings":";;;AAOA,wCASC;AAED,wCAeC;AAhCD,2CAAgD;AAChD,qCAA0C;AAC1C,6CAAkD;AAIlD,SAAgB,cAAc,CAAC,QAAsB,EAAE,MAAc;IACnE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,WAAW;YACd,OAAO,IAAI,6BAAiB,CAAC,MAAM,CAAC,CAAC;QACvC,KAAK,QAAQ;YACX,OAAO,IAAI,uBAAc,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,YAAY;YACf,OAAO,IAAI,+BAAkB,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,SAAgB,cAAc,CAAC,IAI9B;IACC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;IAC3D,CAAC;IACD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gDAAgD;AACnC,QAAA,cAAc,GAAmF;IAC5G,SAAS,EAAE;QACT,QAAQ,EAAE,2BAA2B;QACrC,UAAU,EAAE,2BAA2B;QACvC,MAAM,EAAE,4BAA4B;KACrC;IACD,MAAM,EAAE;QACN,QAAQ,EAAE,kBAAkB;QAC5B,UAAU,EAAE,kBAAkB;QAC9B,MAAM,EAAE,8BAA8B;KACvC;IACD,UAAU,EAAE;QACV,QAAQ,EAAE,6BAA6B;QACvC,UAAU,EAAE,6BAA6B;QACzC,MAAM,EAAE,6BAA6B;KACtC;CACF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { LLMProvider, LLMMessage, LLMResponse } from './interface';
|
|
2
|
+
export declare class GeminiProvider implements LLMProvider {
|
|
3
|
+
private genAI;
|
|
4
|
+
constructor(apiKey: string);
|
|
5
|
+
chat(opts: {
|
|
6
|
+
model: string;
|
|
7
|
+
maxTokens: number;
|
|
8
|
+
messages: LLMMessage[];
|
|
9
|
+
system?: string;
|
|
10
|
+
}): Promise<LLMResponse>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExE,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,KAAK,CAAqB;gBAEtB,MAAM,EAAE,MAAM;IAIpB,IAAI,CAAC,IAAI,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,WAAW,CAAC;CA0BzB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeminiProvider = void 0;
|
|
4
|
+
const generative_ai_1 = require("@google/generative-ai");
|
|
5
|
+
class GeminiProvider {
|
|
6
|
+
genAI;
|
|
7
|
+
constructor(apiKey) {
|
|
8
|
+
this.genAI = new generative_ai_1.GoogleGenerativeAI(apiKey);
|
|
9
|
+
}
|
|
10
|
+
async chat(opts) {
|
|
11
|
+
const model = this.genAI.getGenerativeModel({
|
|
12
|
+
model: opts.model,
|
|
13
|
+
...(opts.system ? { systemInstruction: opts.system } : {}),
|
|
14
|
+
generationConfig: {
|
|
15
|
+
maxOutputTokens: opts.maxTokens,
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
// Build Gemini contents from messages
|
|
19
|
+
const contents = opts.messages.map(m => ({
|
|
20
|
+
role: m.role === 'assistant' ? 'model' : 'user',
|
|
21
|
+
parts: [{ text: m.content }],
|
|
22
|
+
}));
|
|
23
|
+
const result = await model.generateContent({ contents });
|
|
24
|
+
const response = result.response;
|
|
25
|
+
const text = response.text();
|
|
26
|
+
const usage = response.usageMetadata;
|
|
27
|
+
return {
|
|
28
|
+
text,
|
|
29
|
+
inputTokens: usage?.promptTokenCount ?? 0,
|
|
30
|
+
outputTokens: usage?.candidatesTokenCount ?? 0,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.GeminiProvider = GeminiProvider;
|
|
35
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":";;;AAAA,yDAA2D;AAG3D,MAAa,cAAc;IACjB,KAAK,CAAqB;IAElC,YAAY,MAAc;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,kCAAkB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAKV;QACC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,gBAAgB,EAAE;gBAChB,eAAe,EAAE,IAAI,CAAC,SAAS;aAChC;SACF,CAAC,CAAC;QAEH,sCAAsC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAgB,CAAC,CAAC,CAAC,MAAe;YACjE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;SAC7B,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC;QAErC,OAAO;YACL,IAAI;YACJ,WAAW,EAAE,KAAK,EAAE,gBAAgB,IAAI,CAAC;YACzC,YAAY,EAAE,KAAK,EAAE,oBAAoB,IAAI,CAAC;SAC/C,CAAC;IACJ,CAAC;CACF;AAtCD,wCAsCC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface LLMMessage {
|
|
2
|
+
role: 'user' | 'assistant';
|
|
3
|
+
content: string;
|
|
4
|
+
}
|
|
5
|
+
export interface LLMResponse {
|
|
6
|
+
text: string;
|
|
7
|
+
inputTokens: number;
|
|
8
|
+
outputTokens: number;
|
|
9
|
+
}
|
|
10
|
+
export interface LLMProvider {
|
|
11
|
+
chat(opts: {
|
|
12
|
+
model: string;
|
|
13
|
+
maxTokens: number;
|
|
14
|
+
messages: LLMMessage[];
|
|
15
|
+
system?: string;
|
|
16
|
+
}): Promise<LLMResponse>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/providers/interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,IAAI,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/providers/interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { LLMProvider, LLMMessage, LLMResponse } from './interface';
|
|
2
|
+
export declare class OpenRouterProvider implements LLMProvider {
|
|
3
|
+
private client;
|
|
4
|
+
constructor(apiKey: string);
|
|
5
|
+
chat(opts: {
|
|
6
|
+
model: string;
|
|
7
|
+
maxTokens: number;
|
|
8
|
+
messages: LLMMessage[];
|
|
9
|
+
system?: string;
|
|
10
|
+
}): Promise<LLMResponse>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=openrouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExE,qBAAa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAOpB,IAAI,CAAC,IAAI,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,WAAW,CAAC;CAyBzB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.OpenRouterProvider = void 0;
|
|
7
|
+
const openai_1 = __importDefault(require("openai"));
|
|
8
|
+
class OpenRouterProvider {
|
|
9
|
+
client;
|
|
10
|
+
constructor(apiKey) {
|
|
11
|
+
this.client = new openai_1.default({
|
|
12
|
+
apiKey,
|
|
13
|
+
baseURL: 'https://openrouter.ai/api/v1',
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
async chat(opts) {
|
|
17
|
+
const messages = [];
|
|
18
|
+
if (opts.system) {
|
|
19
|
+
messages.push({ role: 'system', content: opts.system });
|
|
20
|
+
}
|
|
21
|
+
for (const m of opts.messages) {
|
|
22
|
+
messages.push({ role: m.role, content: m.content });
|
|
23
|
+
}
|
|
24
|
+
const response = await this.client.chat.completions.create({
|
|
25
|
+
model: opts.model,
|
|
26
|
+
max_tokens: opts.maxTokens,
|
|
27
|
+
messages,
|
|
28
|
+
});
|
|
29
|
+
const text = response.choices[0]?.message?.content ?? '';
|
|
30
|
+
return {
|
|
31
|
+
text,
|
|
32
|
+
inputTokens: response.usage?.prompt_tokens ?? 0,
|
|
33
|
+
outputTokens: response.usage?.completion_tokens ?? 0,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.OpenRouterProvider = OpenRouterProvider;
|
|
38
|
+
//# sourceMappingURL=openrouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAG5B,MAAa,kBAAkB;IACrB,MAAM,CAAS;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAM,CAAC;YACvB,MAAM;YACN,OAAO,EAAE,8BAA8B;SACxC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAKV;QACC,MAAM,QAAQ,GAAwC,EAAE,CAAC;QAEzD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACzD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,SAAS;YAC1B,QAAQ;SACT,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;QAEzD,OAAO;YACL,IAAI;YACJ,WAAW,EAAE,QAAQ,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC;YAC/C,YAAY,EAAE,QAAQ,CAAC,KAAK,EAAE,iBAAiB,IAAI,CAAC;SACrD,CAAC;IACJ,CAAC;CACF;AAxCD,gDAwCC"}
|
package/dist/query/answerer.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { LLMProvider } from '../providers/interface';
|
|
1
2
|
export interface AnswerResult {
|
|
2
3
|
answer: string;
|
|
3
4
|
inputTokens: number;
|
|
@@ -5,5 +6,5 @@ export interface AnswerResult {
|
|
|
5
6
|
cost: number;
|
|
6
7
|
responseTimeMs: number;
|
|
7
8
|
}
|
|
8
|
-
export declare function generateAnswer(question: string, context: string, model: string,
|
|
9
|
+
export declare function generateAnswer(question: string, context: string, model: string, provider: LLMProvider): Promise<AnswerResult>;
|
|
9
10
|
//# sourceMappingURL=answerer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"answerer.d.ts","sourceRoot":"","sources":["../../src/query/answerer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"answerer.d.ts","sourceRoot":"","sources":["../../src/query/answerer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CACxB;AAeD,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,YAAY,CAAC,CAwBvB"}
|
package/dist/query/answerer.js
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.generateAnswer = generateAnswer;
|
|
7
|
-
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
8
4
|
const tokens_1 = require("../utils/tokens");
|
|
9
5
|
const SYSTEM_PROMPT = `You are a code intelligence assistant. You answer developer questions about a TypeScript codebase using structured context retrieved from a code graph database.
|
|
10
6
|
|
|
@@ -18,12 +14,11 @@ Rules:
|
|
|
18
14
|
- Do not make up information not present in the context
|
|
19
15
|
- When describing routes, include the HTTP method, path, and handler details
|
|
20
16
|
- When describing types, include the full definition when available`;
|
|
21
|
-
async function generateAnswer(question, context, model,
|
|
22
|
-
const client = new sdk_1.default({ apiKey });
|
|
17
|
+
async function generateAnswer(question, context, model, provider) {
|
|
23
18
|
const startTime = Date.now();
|
|
24
|
-
const response = await
|
|
19
|
+
const response = await provider.chat({
|
|
25
20
|
model,
|
|
26
|
-
|
|
21
|
+
maxTokens: 1024,
|
|
27
22
|
system: SYSTEM_PROMPT,
|
|
28
23
|
messages: [
|
|
29
24
|
{
|
|
@@ -33,17 +28,11 @@ async function generateAnswer(question, context, model, apiKey) {
|
|
|
33
28
|
],
|
|
34
29
|
});
|
|
35
30
|
const responseTimeMs = Date.now() - startTime;
|
|
36
|
-
const answer = response.content
|
|
37
|
-
.filter(block => block.type === 'text')
|
|
38
|
-
.map(block => block.text)
|
|
39
|
-
.join('');
|
|
40
|
-
const inputTokens = response.usage?.input_tokens ?? 0;
|
|
41
|
-
const outputTokens = response.usage?.output_tokens ?? 0;
|
|
42
31
|
return {
|
|
43
|
-
answer,
|
|
44
|
-
inputTokens,
|
|
45
|
-
outputTokens,
|
|
46
|
-
cost: (0, tokens_1.estimateCost)(model, inputTokens, outputTokens),
|
|
32
|
+
answer: response.text,
|
|
33
|
+
inputTokens: response.inputTokens,
|
|
34
|
+
outputTokens: response.outputTokens,
|
|
35
|
+
cost: (0, tokens_1.estimateCost)(model, response.inputTokens, response.outputTokens),
|
|
47
36
|
responseTimeMs,
|
|
48
37
|
};
|
|
49
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"answerer.js","sourceRoot":"","sources":["../../src/query/answerer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"answerer.js","sourceRoot":"","sources":["../../src/query/answerer.ts"],"names":[],"mappings":";;AAwBA,wCA6BC;AApDD,4CAA+C;AAU/C,MAAM,aAAa,GAAG;;;;;;;;;;;oEAW8C,CAAC;AAE9D,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,OAAe,EACf,KAAa,EACb,QAAqB;IAErB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;QACnC,KAAK;QACL,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,aAAa;QACrB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,GAAG,OAAO,iBAAiB,QAAQ,EAAE;aAC/C;SACF;KACF,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAE9C,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,IAAI;QACrB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,IAAI,EAAE,IAAA,qBAAY,EAAC,KAAK,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,YAAY,CAAC;QACtE,cAAc;KACf,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { LLMProvider } from '../providers/interface';
|
|
1
2
|
export type QueryStrategy = 'direct' | 'relationship' | 'semantic' | 'domain' | 'impact' | 'route' | 'type' | 'file' | 'list' | 'pattern';
|
|
2
3
|
export interface ClassificationResult {
|
|
3
4
|
strategy: QueryStrategy;
|
|
@@ -11,5 +12,5 @@ export interface ClassificationResult {
|
|
|
11
12
|
routeMethod: string | null;
|
|
12
13
|
listEntity: string | null;
|
|
13
14
|
}
|
|
14
|
-
export declare function classifyQuestion(question: string, model: string,
|
|
15
|
+
export declare function classifyQuestion(question: string, model: string, provider: LLMProvider): Promise<ClassificationResult>;
|
|
15
16
|
//# sourceMappingURL=classifier.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../../src/query/classifier.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../../src/query/classifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1I,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;IACxC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AA8BD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,oBAAoB,CAAC,CAuC/B"}
|
package/dist/query/classifier.js
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.classifyQuestion = classifyQuestion;
|
|
7
|
-
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
8
4
|
const CLASSIFICATION_PROMPT = `You are a question classifier for a code intelligence system. Given a developer's question about a TypeScript codebase, classify it into exactly one category and extract key parameters.
|
|
9
5
|
|
|
10
6
|
Categories:
|
|
@@ -32,21 +28,16 @@ Respond ONLY with JSON, no markdown:
|
|
|
32
28
|
"route_method": "GET|POST|PUT|DELETE|PATCH or null",
|
|
33
29
|
"list_entity": "functions|routes|types|files|constants or null"
|
|
34
30
|
}`;
|
|
35
|
-
async function classifyQuestion(question, model,
|
|
36
|
-
const
|
|
37
|
-
const response = await client.messages.create({
|
|
31
|
+
async function classifyQuestion(question, model, provider) {
|
|
32
|
+
const response = await provider.chat({
|
|
38
33
|
model,
|
|
39
|
-
|
|
34
|
+
maxTokens: 200,
|
|
40
35
|
messages: [
|
|
41
36
|
{ role: 'user', content: `${CLASSIFICATION_PROMPT}\n\nQuestion: "${question}"` },
|
|
42
37
|
],
|
|
43
38
|
});
|
|
44
|
-
const text = response.content
|
|
45
|
-
.filter(block => block.type === 'text')
|
|
46
|
-
.map(block => block.text)
|
|
47
|
-
.join('');
|
|
48
39
|
try {
|
|
49
|
-
const cleaned = text.replace(/^```json?\s*/m, '').replace(/```\s*$/m, '').trim();
|
|
40
|
+
const cleaned = response.text.replace(/^```json?\s*/m, '').replace(/```\s*$/m, '').trim();
|
|
50
41
|
const parsed = JSON.parse(cleaned);
|
|
51
42
|
return {
|
|
52
43
|
strategy: parsed.strategy || 'semantic',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classifier.js","sourceRoot":"","sources":["../../src/query/classifier.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"classifier.js","sourceRoot":"","sources":["../../src/query/classifier.ts"],"names":[],"mappings":";;AA6CA,4CA2CC;AAvED,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;EA0B5B,CAAC;AAEI,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,KAAa,EACb,QAAqB;IAErB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;QACnC,KAAK;QACL,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,qBAAqB,kBAAkB,QAAQ,GAAG,EAAE;SACjF;KACF,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,UAAU;YACvC,YAAY,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;YAC1C,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;YAC7B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;YACnC,QAAQ,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;YAClC,QAAQ,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;YAClC,SAAS,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;YACpC,WAAW,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI;YACxC,UAAU,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;SACvC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;QAC9B,OAAO;YACL,QAAQ,EAAE,UAAU;YACpB,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACzD,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,IAAI;SACjB,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { LLMProvider } from '../providers/interface';
|
|
2
3
|
export interface AnalyzeResult {
|
|
3
4
|
analyzed: number;
|
|
4
5
|
cached: number;
|
|
@@ -10,7 +11,7 @@ export interface AnalyzeResult {
|
|
|
10
11
|
export declare function analyzeBatch(db: Database.Database, queueItems: Array<{
|
|
11
12
|
id: number;
|
|
12
13
|
function_id: number;
|
|
13
|
-
}>, model: string,
|
|
14
|
+
}>, model: string, provider: LLMProvider): Promise<AnalyzeResult>;
|
|
14
15
|
export declare function rebuildSearchIndex(db: Database.Database): void;
|
|
15
16
|
export interface SimpleAnalyzeResult {
|
|
16
17
|
analyzed: number;
|
|
@@ -19,7 +20,7 @@ export interface SimpleAnalyzeResult {
|
|
|
19
20
|
totalOutputTokens: number;
|
|
20
21
|
totalCost: number;
|
|
21
22
|
}
|
|
22
|
-
export declare function analyzeTypes(db: Database.Database, model: string,
|
|
23
|
-
export declare function analyzeRoutes(db: Database.Database, model: string,
|
|
24
|
-
export declare function analyzeFileSummaries(db: Database.Database, model: string,
|
|
23
|
+
export declare function analyzeTypes(db: Database.Database, model: string, provider: LLMProvider): Promise<SimpleAnalyzeResult>;
|
|
24
|
+
export declare function analyzeRoutes(db: Database.Database, model: string, provider: LLMProvider): Promise<SimpleAnalyzeResult>;
|
|
25
|
+
export declare function analyzeFileSummaries(db: Database.Database, model: string, provider: LLMProvider): Promise<SimpleAnalyzeResult>;
|
|
25
26
|
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/semantic/analyzer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/semantic/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAmB1D,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,YAAY,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,EACtD,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,aAAa,CAAC,CAuKxB;AAYD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAE9D;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,YAAY,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,mBAAmB,CAAC,CA2C9B;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,mBAAmB,CAAC,CA0C9B;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,mBAAmB,CAAC,CAoD9B"}
|