structx 2.2.0 → 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.
Files changed (55) hide show
  1. package/dist/benchmark/baseline.d.ts +2 -1
  2. package/dist/benchmark/baseline.d.ts.map +1 -1
  3. package/dist/benchmark/baseline.js +7 -18
  4. package/dist/benchmark/baseline.js.map +1 -1
  5. package/dist/benchmark/runner.d.ts +2 -1
  6. package/dist/benchmark/runner.d.ts.map +1 -1
  7. package/dist/benchmark/runner.js +4 -4
  8. package/dist/benchmark/runner.js.map +1 -1
  9. package/dist/cli.js +100 -45
  10. package/dist/cli.js.map +1 -1
  11. package/dist/config.d.ts +4 -0
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +12 -1
  14. package/dist/config.js.map +1 -1
  15. package/dist/providers/anthropic.d.ts +12 -0
  16. package/dist/providers/anthropic.d.ts.map +1 -0
  17. package/dist/providers/anthropic.js +32 -0
  18. package/dist/providers/anthropic.js.map +1 -0
  19. package/dist/providers/factory.d.ts +18 -0
  20. package/dist/providers/factory.d.ts.map +1 -0
  21. package/dist/providers/factory.js +49 -0
  22. package/dist/providers/factory.js.map +1 -0
  23. package/dist/providers/gemini.d.ts +12 -0
  24. package/dist/providers/gemini.d.ts.map +1 -0
  25. package/dist/providers/gemini.js +35 -0
  26. package/dist/providers/gemini.js.map +1 -0
  27. package/dist/providers/interface.d.ts +18 -0
  28. package/dist/providers/interface.d.ts.map +1 -0
  29. package/dist/providers/interface.js +3 -0
  30. package/dist/providers/interface.js.map +1 -0
  31. package/dist/providers/openrouter.d.ts +12 -0
  32. package/dist/providers/openrouter.d.ts.map +1 -0
  33. package/dist/providers/openrouter.js +38 -0
  34. package/dist/providers/openrouter.js.map +1 -0
  35. package/dist/query/answerer.d.ts +2 -1
  36. package/dist/query/answerer.d.ts.map +1 -1
  37. package/dist/query/answerer.js +7 -18
  38. package/dist/query/answerer.js.map +1 -1
  39. package/dist/query/classifier.d.ts +2 -1
  40. package/dist/query/classifier.d.ts.map +1 -1
  41. package/dist/query/classifier.js +4 -13
  42. package/dist/query/classifier.js.map +1 -1
  43. package/dist/semantic/analyzer.d.ts +5 -4
  44. package/dist/semantic/analyzer.d.ts.map +1 -1
  45. package/dist/semantic/analyzer.js +34 -61
  46. package/dist/semantic/analyzer.js.map +1 -1
  47. package/dist/utils/tokens.d.ts.map +1 -1
  48. package/dist/utils/tokens.js +6 -0
  49. package/dist/utils/tokens.js.map +1 -1
  50. package/package.json +3 -1
  51. package/dist/instructions/claude.md +0 -70
  52. package/dist/instructions/codex.md +0 -70
  53. package/dist/instructions/copilot.md +0 -70
  54. package/dist/instructions/cursor.md +0 -68
  55. package/dist/instructions/generic.md +0 -70
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,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,CAgB5D;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAenF"}
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 the API key to disk if it came from env
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,sCAGC;AAED,sCAEC;AAED,gCAgBC;AAED,gCAeC;AAhED,uCAAyB;AACzB,2CAA6B;AAa7B,MAAM,cAAc,GAAuE;IACzF,aAAa,EAAE,2BAA2B;IAC1C,eAAe,EAAE,2BAA2B;IAC5C,WAAW,EAAE,4BAA4B;IACzC,SAAS,EAAE,CAAC;IACZ,aAAa,EAAE,GAAG;CACnB,CAAC;AAEF,SAAgB,aAAa,CAAC,QAAiB;IAC7C,MAAM,IAAI,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,SAAgB,aAAa,CAAC,UAAkB;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC;AAED,SAAgB,UAAU,CAAC,UAAkB;IAC3C,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAE7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,6BAA6B,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAE1E,OAAO;QACL,GAAG,cAAc;QACjB,GAAG,GAAG;QACN,eAAe,EAAE,MAAM;QACvB,UAAU;KACX,CAAC;AACJ,CAAC;AAED,SAAgB,UAAU,CAAC,UAAkB,EAAE,MAA8B;IAC3E,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAE7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,wDAAwD;IACxD,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,eAAe,KAAK,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC9F,OAAO,MAAM,CAAC,eAAe,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC,UAAU,CAAC;IAEzB,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC"}
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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=interface.js.map
@@ -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"}
@@ -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, apiKey: string): Promise<AnswerResult>;
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":"AAGA,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,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,CAAC,CAiCvB"}
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"}
@@ -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, apiKey) {
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 client.messages.create({
19
+ const response = await provider.chat({
25
20
  model,
26
- max_tokens: 1024,
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":";;;;;AAwBA,wCAsCC;AA9DD,4DAA0C;AAC1C,4CAA+C;AAU/C,MAAM,aAAa,GAAG;;;;;;;;;;;oEAW8C,CAAC;AAE9D,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,OAAe,EACf,KAAa,EACb,MAAc;IAEd,MAAM,MAAM,GAAG,IAAI,aAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,KAAK;QACL,UAAU,EAAE,IAAI;QAChB,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,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO;SAC5B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;SACtC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAE,KAAa,CAAC,IAAI,CAAC;SACjC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;IAExD,OAAO;QACL,MAAM;QACN,WAAW;QACX,YAAY;QACZ,IAAI,EAAE,IAAA,qBAAY,EAAC,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC;QACpD,cAAc;KACf,CAAC;AACJ,CAAC"}
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, apiKey: string): Promise<ClassificationResult>;
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":"AAEA,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,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC,CA8C/B"}
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"}
@@ -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, apiKey) {
36
- const client = new sdk_1.default({ apiKey });
37
- const response = await client.messages.create({
31
+ async function classifyQuestion(question, model, provider) {
32
+ const response = await provider.chat({
38
33
  model,
39
- max_tokens: 200,
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":";;;;;AA6CA,4CAkDC;AA/FD,4DAA0C;AAiB1C,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;EA0B5B,CAAC;AAEI,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,KAAa,EACb,MAAc;IAEd,MAAM,MAAM,GAAG,IAAI,aAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,KAAK;QACL,UAAU,EAAE,GAAG;QACf,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,qBAAqB,kBAAkB,QAAQ,GAAG,EAAE;SACjF;KACF,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO;SAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;SACtC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAE,KAAa,CAAC,IAAI,CAAC;SACjC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACjF,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
+ {"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, apiKey: string): Promise<AnalyzeResult>;
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, apiKey: string): Promise<SimpleAnalyzeResult>;
23
- export declare function analyzeRoutes(db: Database.Database, model: string, apiKey: string): Promise<SimpleAnalyzeResult>;
24
- export declare function analyzeFileSummaries(db: Database.Database, model: string, apiKey: string): Promise<SimpleAnalyzeResult>;
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":"AACA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAmB3C,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,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,CAAC,CAiLxB;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,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,mBAAmB,CAAC,CAiD9B;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,mBAAmB,CAAC,CAgD9B;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,mBAAmB,CAAC,CA0D9B"}
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"}