structx 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.
Files changed (94) hide show
  1. package/dist/benchmark/baseline.d.ts +10 -0
  2. package/dist/benchmark/baseline.d.ts.map +1 -0
  3. package/dist/benchmark/baseline.js +84 -0
  4. package/dist/benchmark/baseline.js.map +1 -0
  5. package/dist/benchmark/questions.d.ts +2 -0
  6. package/dist/benchmark/questions.d.ts.map +1 -0
  7. package/dist/benchmark/questions.js +14 -0
  8. package/dist/benchmark/questions.js.map +1 -0
  9. package/dist/benchmark/reporter.d.ts +8 -0
  10. package/dist/benchmark/reporter.d.ts.map +1 -0
  11. package/dist/benchmark/reporter.js +120 -0
  12. package/dist/benchmark/reporter.js.map +1 -0
  13. package/dist/benchmark/runner.d.ts +24 -0
  14. package/dist/benchmark/runner.d.ts.map +1 -0
  15. package/dist/benchmark/runner.js +110 -0
  16. package/dist/benchmark/runner.js.map +1 -0
  17. package/dist/cli.d.ts +3 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +753 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/config.d.ts +15 -0
  22. package/dist/config.d.ts.map +1 -0
  23. package/dist/config.js +83 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/db/connection.d.ts +5 -0
  26. package/dist/db/connection.d.ts.map +1 -0
  27. package/dist/db/connection.js +89 -0
  28. package/dist/db/connection.js.map +1 -0
  29. package/dist/db/queries.d.ts +122 -0
  30. package/dist/db/queries.d.ts.map +1 -0
  31. package/dist/db/queries.js +191 -0
  32. package/dist/db/queries.js.map +1 -0
  33. package/dist/db/schema.sql +85 -0
  34. package/dist/ingest/differ.d.ts +13 -0
  35. package/dist/ingest/differ.d.ts.map +1 -0
  36. package/dist/ingest/differ.js +63 -0
  37. package/dist/ingest/differ.js.map +1 -0
  38. package/dist/ingest/parser.d.ts +15 -0
  39. package/dist/ingest/parser.d.ts.map +1 -0
  40. package/dist/ingest/parser.js +154 -0
  41. package/dist/ingest/parser.js.map +1 -0
  42. package/dist/ingest/relationships.d.ts +8 -0
  43. package/dist/ingest/relationships.d.ts.map +1 -0
  44. package/dist/ingest/relationships.js +93 -0
  45. package/dist/ingest/relationships.js.map +1 -0
  46. package/dist/ingest/scanner.d.ts +2 -0
  47. package/dist/ingest/scanner.d.ts.map +1 -0
  48. package/dist/ingest/scanner.js +67 -0
  49. package/dist/ingest/scanner.js.map +1 -0
  50. package/dist/instructions/claude.md +41 -0
  51. package/dist/instructions/copilot.md +39 -0
  52. package/dist/instructions/cursor.md +39 -0
  53. package/dist/instructions/generic.md +41 -0
  54. package/dist/query/answerer.d.ts +9 -0
  55. package/dist/query/answerer.d.ts.map +1 -0
  56. package/dist/query/answerer.js +46 -0
  57. package/dist/query/answerer.js.map +1 -0
  58. package/dist/query/classifier.d.ts +10 -0
  59. package/dist/query/classifier.d.ts.map +1 -0
  60. package/dist/query/classifier.js +60 -0
  61. package/dist/query/classifier.js.map +1 -0
  62. package/dist/query/context-builder.d.ts +3 -0
  63. package/dist/query/context-builder.d.ts.map +1 -0
  64. package/dist/query/context-builder.js +104 -0
  65. package/dist/query/context-builder.js.map +1 -0
  66. package/dist/query/retriever.d.ts +23 -0
  67. package/dist/query/retriever.d.ts.map +1 -0
  68. package/dist/query/retriever.js +142 -0
  69. package/dist/query/retriever.js.map +1 -0
  70. package/dist/semantic/analyzer.d.ts +15 -0
  71. package/dist/semantic/analyzer.d.ts.map +1 -0
  72. package/dist/semantic/analyzer.js +179 -0
  73. package/dist/semantic/analyzer.js.map +1 -0
  74. package/dist/semantic/cost.d.ts +11 -0
  75. package/dist/semantic/cost.d.ts.map +1 -0
  76. package/dist/semantic/cost.js +31 -0
  77. package/dist/semantic/cost.js.map +1 -0
  78. package/dist/semantic/prompt.d.ts +11 -0
  79. package/dist/semantic/prompt.d.ts.map +1 -0
  80. package/dist/semantic/prompt.js +71 -0
  81. package/dist/semantic/prompt.js.map +1 -0
  82. package/dist/semantic/validator.d.ts +15 -0
  83. package/dist/semantic/validator.d.ts.map +1 -0
  84. package/dist/semantic/validator.js +95 -0
  85. package/dist/semantic/validator.js.map +1 -0
  86. package/dist/utils/logger.d.ts +9 -0
  87. package/dist/utils/logger.d.ts.map +1 -0
  88. package/dist/utils/logger.js +48 -0
  89. package/dist/utils/logger.js.map +1 -0
  90. package/dist/utils/tokens.d.ts +3 -0
  91. package/dist/utils/tokens.d.ts.map +1 -0
  92. package/dist/utils/tokens.js +21 -0
  93. package/dist/utils/tokens.js.map +1 -0
  94. package/package.json +39 -0
@@ -0,0 +1,39 @@
1
+ # StructX — Code Intelligence Graph
2
+
3
+ This project uses **StructX**, a graph-powered code intelligence tool for TypeScript.
4
+ StructX maintains a function-level knowledge graph of the codebase that you should use
5
+ instead of reading raw source files when answering code questions.
6
+
7
+ ## Rules
8
+
9
+ 1. **On session start:** Run `npx structx status` to check if the graph is initialized.
10
+ If not initialized, run `npx structx setup .` to bootstrap (init + ingest + analyze).
11
+
12
+ 2. **Before answering code questions:** Run `npx structx ask "your question" --repo .`
13
+ instead of reading raw files. The graph provides function signatures, purposes,
14
+ relationships, and semantic metadata that raw file reads miss.
15
+
16
+ 3. **After making code changes:** Run `npx structx ingest .` to update the function graph
17
+ with your changes.
18
+
19
+ 4. **After ingestion queues new functions:** Run `npx structx analyze . --yes` to enrich
20
+ newly discovered or changed functions with semantic metadata.
21
+
22
+ 5. **For impact analysis:** Before modifying a function, run
23
+ `npx structx ask "what breaks if I change <functionName>" --repo .`
24
+ to understand downstream effects.
25
+
26
+ ## Available Commands
27
+
28
+ - `npx structx status` — Check if graph is initialized and view stats
29
+ - `npx structx setup .` — One-step bootstrap (init + ingest + analyze)
30
+ - `npx structx ingest .` — Re-parse codebase after changes
31
+ - `npx structx analyze . --yes` — Run semantic analysis on new/changed functions
32
+ - `npx structx ask "question" --repo .` — Query the function graph
33
+
34
+ ## When to Use StructX vs Raw File Reads
35
+
36
+ - **Use StructX** for: understanding function purposes, finding callers/callees,
37
+ impact analysis, discovering related functions, understanding code architecture.
38
+ - **Use raw file reads** for: viewing exact implementation details, making edits,
39
+ reading config files, non-TypeScript files.
@@ -0,0 +1,41 @@
1
+ # StructX — AI Agent Instructions
2
+
3
+ This project uses **StructX**, a graph-powered code intelligence tool for TypeScript.
4
+ StructX maintains a function-level knowledge graph of the codebase that you should use
5
+ instead of reading raw source files when answering code questions.
6
+
7
+ ## Rules
8
+
9
+ 1. **On session start:** Run `npx structx status` to check if the graph is initialized.
10
+ If not initialized, run `npx structx setup .` to bootstrap (init + ingest + analyze).
11
+
12
+ 2. **Before answering code questions:** Run `npx structx ask "your question" --repo .`
13
+ instead of reading raw files. The graph provides function signatures, purposes,
14
+ relationships, and semantic metadata that raw file reads miss.
15
+
16
+ 3. **After making code changes:** Run `npx structx ingest .` to update the function graph
17
+ with your changes.
18
+
19
+ 4. **After ingestion queues new functions:** Run `npx structx analyze . --yes` to enrich
20
+ newly discovered or changed functions with semantic metadata.
21
+
22
+ 5. **For impact analysis:** Before modifying a function, run
23
+ `npx structx ask "what breaks if I change <functionName>" --repo .`
24
+ to understand downstream effects.
25
+
26
+ ## Available Commands
27
+
28
+ | Command | Description |
29
+ |---------|-------------|
30
+ | `npx structx status` | Check if graph is initialized and view stats |
31
+ | `npx structx setup .` | One-step bootstrap (init + ingest + analyze) |
32
+ | `npx structx ingest .` | Re-parse codebase after changes |
33
+ | `npx structx analyze . --yes` | Run semantic analysis on new/changed functions |
34
+ | `npx structx ask "question" --repo .` | Query the function graph |
35
+
36
+ ## When to Use StructX vs Raw File Reads
37
+
38
+ - **Use StructX** for: understanding function purposes, finding callers/callees,
39
+ impact analysis, discovering related functions, understanding code architecture.
40
+ - **Use raw file reads** for: viewing exact implementation details, making edits,
41
+ reading config files, non-TypeScript files.
@@ -0,0 +1,9 @@
1
+ export interface AnswerResult {
2
+ answer: string;
3
+ inputTokens: number;
4
+ outputTokens: number;
5
+ cost: number;
6
+ responseTimeMs: number;
7
+ }
8
+ export declare function generateAnswer(question: string, context: string, model: string, apiKey: string): Promise<AnswerResult>;
9
+ //# sourceMappingURL=answerer.d.ts.map
@@ -0,0 +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;AAWD,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,CAAC,CAiCvB"}
@@ -0,0 +1,46 @@
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.generateAnswer = generateAnswer;
7
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
8
+ const tokens_1 = require("../utils/tokens");
9
+ 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
+
11
+ Rules:
12
+ - Answer based ONLY on the provided context
13
+ - Be concise and specific
14
+ - Reference function names and file locations when relevant
15
+ - If the context doesn't contain enough information, say so clearly
16
+ - Do not make up information not present in the context`;
17
+ async function generateAnswer(question, context, model, apiKey) {
18
+ const client = new sdk_1.default({ apiKey });
19
+ const startTime = Date.now();
20
+ const response = await client.messages.create({
21
+ model,
22
+ max_tokens: 1024,
23
+ system: SYSTEM_PROMPT,
24
+ messages: [
25
+ {
26
+ role: 'user',
27
+ content: `${context}\n\nQuestion: ${question}`,
28
+ },
29
+ ],
30
+ });
31
+ const responseTimeMs = Date.now() - startTime;
32
+ const answer = response.content
33
+ .filter(block => block.type === 'text')
34
+ .map(block => block.text)
35
+ .join('');
36
+ const inputTokens = response.usage?.input_tokens ?? 0;
37
+ const outputTokens = response.usage?.output_tokens ?? 0;
38
+ return {
39
+ answer,
40
+ inputTokens,
41
+ outputTokens,
42
+ cost: (0, tokens_1.estimateCost)(model, inputTokens, outputTokens),
43
+ responseTimeMs,
44
+ };
45
+ }
46
+ //# sourceMappingURL=answerer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answerer.js","sourceRoot":"","sources":["../../src/query/answerer.ts"],"names":[],"mappings":";;;;;AAoBA,wCAsCC;AA1DD,4DAA0C;AAC1C,4CAA+C;AAU/C,MAAM,aAAa,GAAG;;;;;;;wDAOkC,CAAC;AAElD,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"}
@@ -0,0 +1,10 @@
1
+ export type QueryStrategy = 'direct' | 'relationship' | 'semantic' | 'domain' | 'impact';
2
+ export interface ClassificationResult {
3
+ strategy: QueryStrategy;
4
+ functionName: string | null;
5
+ keywords: string[];
6
+ domain: string | null;
7
+ direction: 'callers' | 'callees' | null;
8
+ }
9
+ export declare function classifyQuestion(question: string, model: string, apiKey: string): Promise<ClassificationResult>;
10
+ //# sourceMappingURL=classifier.d.ts.map
@@ -0,0 +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,CAAC;AAEzF,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;CACzC;AAoBD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC,CAoC/B"}
@@ -0,0 +1,60 @@
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.classifyQuestion = classifyQuestion;
7
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
8
+ 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
+
10
+ Categories:
11
+ 1. "direct" - Question asks about a specific function by name (e.g., "What does login do?")
12
+ 2. "relationship" - Question asks about what calls or is called by a function (e.g., "What calls login?")
13
+ 3. "semantic" - Question asks about a concept, topic, or behavior (e.g., "How is authentication handled?")
14
+ 4. "domain" - Question asks about a category of functions (e.g., "Show all database operations")
15
+ 5. "impact" - Question asks about what would be affected by changes (e.g., "What breaks if I change validateEmail?")
16
+
17
+ Respond ONLY with JSON, no markdown:
18
+ {
19
+ "strategy": "direct|relationship|semantic|domain|impact",
20
+ "function_name": "extracted function name or null",
21
+ "keywords": ["relevant", "search", "terms"],
22
+ "domain": "authentication|database|validation|routing|middleware|utility|logging|session|crypto|ui|api|config|testing|other or null",
23
+ "direction": "callers|callees|null"
24
+ }`;
25
+ async function classifyQuestion(question, model, apiKey) {
26
+ const client = new sdk_1.default({ apiKey });
27
+ const response = await client.messages.create({
28
+ model,
29
+ max_tokens: 200,
30
+ messages: [
31
+ { role: 'user', content: `${CLASSIFICATION_PROMPT}\n\nQuestion: "${question}"` },
32
+ ],
33
+ });
34
+ const text = response.content
35
+ .filter(block => block.type === 'text')
36
+ .map(block => block.text)
37
+ .join('');
38
+ try {
39
+ const cleaned = text.replace(/^```json?\s*/m, '').replace(/```\s*$/m, '').trim();
40
+ const parsed = JSON.parse(cleaned);
41
+ return {
42
+ strategy: parsed.strategy || 'semantic',
43
+ functionName: parsed.function_name || null,
44
+ keywords: parsed.keywords || [],
45
+ domain: parsed.domain || null,
46
+ direction: parsed.direction || null,
47
+ };
48
+ }
49
+ catch {
50
+ // Fallback to semantic search
51
+ return {
52
+ strategy: 'semantic',
53
+ functionName: null,
54
+ keywords: question.split(/\s+/).filter(w => w.length > 3),
55
+ domain: null,
56
+ direction: null,
57
+ };
58
+ }
59
+ }
60
+ //# sourceMappingURL=classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifier.js","sourceRoot":"","sources":["../../src/query/classifier.ts"],"names":[],"mappings":";;;;;AA8BA,4CAwCC;AAtED,4DAA0C;AAY1C,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;EAgB5B,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;SACpC,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;SAChB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RetrievedContext } from './retriever';
2
+ export declare function buildContext(retrieved: RetrievedContext, question: string): string;
3
+ //# sourceMappingURL=context-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../src/query/context-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAqB,MAAM,aAAa,CAAC;AAGvE,wBAAgB,YAAY,CAAC,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA+BlF"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildContext = buildContext;
4
+ const tokens_1 = require("../utils/tokens");
5
+ function buildContext(retrieved, question) {
6
+ if (retrieved.functions.length === 0) {
7
+ return `No functions found matching the query.\n\nQuestion: ${question}`;
8
+ }
9
+ const sections = [];
10
+ switch (retrieved.strategy) {
11
+ case 'direct':
12
+ sections.push(formatDirectContext(retrieved.functions[0]));
13
+ break;
14
+ case 'relationship':
15
+ sections.push(formatRelationshipContext(retrieved.functions));
16
+ break;
17
+ case 'semantic':
18
+ sections.push(formatSemanticContext(retrieved.functions));
19
+ break;
20
+ case 'domain':
21
+ sections.push(formatDomainContext(retrieved.functions));
22
+ break;
23
+ case 'impact':
24
+ sections.push(formatImpactContext(retrieved.functions));
25
+ break;
26
+ default:
27
+ sections.push(formatSemanticContext(retrieved.functions));
28
+ }
29
+ const context = sections.join('\n\n');
30
+ const tokens = (0, tokens_1.estimateTokens)(context);
31
+ return `[Context retrieved via ${retrieved.strategy} strategy | ${retrieved.functions.length} functions | ~${tokens} tokens]\n\n${context}`;
32
+ }
33
+ function formatDirectContext(fn) {
34
+ const lines = [
35
+ `Function: ${fn.name}`,
36
+ `Location: ${fn.location}`,
37
+ `Signature: ${fn.signature}`,
38
+ ];
39
+ if (fn.purpose)
40
+ lines.push(`Purpose: ${fn.purpose}`);
41
+ if (fn.behavior)
42
+ lines.push(`Behavior: ${fn.behavior}`);
43
+ if (fn.sideEffects.length > 0)
44
+ lines.push(`Side Effects: ${fn.sideEffects.join(', ')}`);
45
+ if (fn.domain)
46
+ lines.push(`Domain: ${fn.domain}`);
47
+ if (fn.complexity)
48
+ lines.push(`Complexity: ${fn.complexity}`);
49
+ if (fn.calls.length > 0)
50
+ lines.push(`Calls: ${fn.calls.join(', ')}`);
51
+ if (fn.calledBy.length > 0)
52
+ lines.push(`Called By: ${fn.calledBy.join(', ')}`);
53
+ return lines.join('\n');
54
+ }
55
+ function formatRelationshipContext(functions) {
56
+ return functions.map((fn, i) => {
57
+ const lines = [
58
+ `${i + 1}. ${fn.name}`,
59
+ ` Location: ${fn.location}`,
60
+ ];
61
+ if (fn.purpose)
62
+ lines.push(` Purpose: ${fn.purpose}`);
63
+ return lines.join('\n');
64
+ }).join('\n\n');
65
+ }
66
+ function formatSemanticContext(functions) {
67
+ return functions.map((fn, i) => {
68
+ const lines = [
69
+ `${i + 1}. ${fn.name}`,
70
+ ` Location: ${fn.location}`,
71
+ ];
72
+ if (fn.purpose)
73
+ lines.push(` Purpose: ${fn.purpose}`);
74
+ if (fn.domain)
75
+ lines.push(` Domain: ${fn.domain}`);
76
+ return lines.join('\n');
77
+ }).join('\n\n');
78
+ }
79
+ function formatDomainContext(functions) {
80
+ return functions.map((fn, i) => {
81
+ const lines = [
82
+ `${i + 1}. ${fn.name}`,
83
+ ` Location: ${fn.location}`,
84
+ ];
85
+ if (fn.purpose)
86
+ lines.push(` Purpose: ${fn.purpose}`);
87
+ if (fn.sideEffects.length > 0)
88
+ lines.push(` Side Effects: ${fn.sideEffects.join(', ')}`);
89
+ return lines.join('\n');
90
+ }).join('\n\n');
91
+ }
92
+ function formatImpactContext(functions) {
93
+ return `Functions affected (${functions.length} total):\n\n` +
94
+ functions.map((fn, i) => {
95
+ const lines = [
96
+ `${i + 1}. ${fn.name}`,
97
+ ` Location: ${fn.location}`,
98
+ ];
99
+ if (fn.purpose)
100
+ lines.push(` Purpose: ${fn.purpose}`);
101
+ return lines.join('\n');
102
+ }).join('\n\n');
103
+ }
104
+ //# sourceMappingURL=context-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../src/query/context-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface RetrievedContext {
3
+ functions: RetrievedFunction[];
4
+ strategy: string;
5
+ }
6
+ export interface RetrievedFunction {
7
+ name: string;
8
+ location: string;
9
+ signature: string;
10
+ purpose: string | null;
11
+ behavior: string | null;
12
+ sideEffects: string[];
13
+ domain: string | null;
14
+ complexity: string | null;
15
+ calls: string[];
16
+ calledBy: string[];
17
+ }
18
+ export declare function directLookup(db: Database.Database, name: string): RetrievedContext;
19
+ export declare function relationshipQuery(db: Database.Database, name: string, direction: 'callers' | 'callees'): RetrievedContext;
20
+ export declare function semanticSearch(db: Database.Database, keywords: string[]): RetrievedContext;
21
+ export declare function domainQuery(db: Database.Database, domain: string): RetrievedContext;
22
+ export declare function impactAnalysis(db: Database.Database, name: string): RetrievedContext;
23
+ //# sourceMappingURL=retriever.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retriever.d.ts","sourceRoot":"","sources":["../../src/query/retriever.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAO3C,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CASlF;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,SAAS,GAAG,SAAS,GAC/B,gBAAgB,CA4ClB;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAO1F;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,CASnF;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAoCpF"}
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.directLookup = directLookup;
4
+ exports.relationshipQuery = relationshipQuery;
5
+ exports.semanticSearch = semanticSearch;
6
+ exports.domainQuery = domainQuery;
7
+ exports.impactAnalysis = impactAnalysis;
8
+ const queries_1 = require("../db/queries");
9
+ function directLookup(db, name) {
10
+ const fn = (0, queries_1.getFunctionByName)(db, name);
11
+ if (!fn) {
12
+ return { functions: [], strategy: 'direct' };
13
+ }
14
+ return {
15
+ functions: [enrichFunction(db, fn)],
16
+ strategy: 'direct',
17
+ };
18
+ }
19
+ function relationshipQuery(db, name, direction) {
20
+ const fn = (0, queries_1.getFunctionByName)(db, name);
21
+ if (!fn) {
22
+ return { functions: [], strategy: 'relationship' };
23
+ }
24
+ const results = [];
25
+ if (direction === 'callees') {
26
+ const callees = (0, queries_1.getCallees)(db, fn.id);
27
+ for (const rel of callees) {
28
+ if (rel.callee_function_id) {
29
+ const calleeFn = (0, queries_1.getFunctionById)(db, rel.callee_function_id);
30
+ if (calleeFn)
31
+ results.push(enrichFunction(db, calleeFn));
32
+ }
33
+ else {
34
+ results.push({
35
+ name: rel.callee_name,
36
+ location: 'unresolved',
37
+ signature: rel.callee_name,
38
+ purpose: null,
39
+ behavior: null,
40
+ sideEffects: [],
41
+ domain: null,
42
+ complexity: null,
43
+ calls: [],
44
+ calledBy: [],
45
+ });
46
+ }
47
+ }
48
+ }
49
+ else {
50
+ const callers = (0, queries_1.getCallers)(db, fn.id);
51
+ // Also check by name for cases where callee_function_id wasn't resolved
52
+ const callersByName = (0, queries_1.getCallersByName)(db, name);
53
+ const seenIds = new Set();
54
+ for (const rel of [...callers, ...callersByName]) {
55
+ if (seenIds.has(rel.caller_function_id))
56
+ continue;
57
+ seenIds.add(rel.caller_function_id);
58
+ const callerFn = (0, queries_1.getFunctionById)(db, rel.caller_function_id);
59
+ if (callerFn)
60
+ results.push(enrichFunction(db, callerFn));
61
+ }
62
+ }
63
+ return { functions: results, strategy: 'relationship' };
64
+ }
65
+ function semanticSearch(db, keywords) {
66
+ const query = keywords.join(' OR ');
67
+ const results = (0, queries_1.searchFunctions)(db, query, 10);
68
+ return {
69
+ functions: results.map(fn => enrichFunction(db, fn)),
70
+ strategy: 'semantic',
71
+ };
72
+ }
73
+ function domainQuery(db, domain) {
74
+ const results = db.prepare('SELECT * FROM functions WHERE domain = ?').all(domain);
75
+ return {
76
+ functions: results.map(fn => enrichFunction(db, fn)),
77
+ strategy: 'domain',
78
+ };
79
+ }
80
+ function impactAnalysis(db, name) {
81
+ const fn = (0, queries_1.getFunctionByName)(db, name);
82
+ if (!fn) {
83
+ return { functions: [], strategy: 'impact' };
84
+ }
85
+ // Direct callers
86
+ const directCallers = (0, queries_1.getCallers)(db, fn.id);
87
+ const directCallersByName = (0, queries_1.getCallersByName)(db, name);
88
+ const allDirectCallerIds = new Set([
89
+ ...directCallers.map(r => r.caller_function_id),
90
+ ...directCallersByName.map(r => r.caller_function_id),
91
+ ]);
92
+ // Transitive callers
93
+ const transitiveCallers = (0, queries_1.getTransitiveCallers)(db, fn.id);
94
+ const results = [];
95
+ const seenIds = new Set();
96
+ // Add direct callers first (marked)
97
+ for (const callerId of allDirectCallerIds) {
98
+ if (seenIds.has(callerId))
99
+ continue;
100
+ seenIds.add(callerId);
101
+ const callerFn = (0, queries_1.getFunctionById)(db, callerId);
102
+ if (callerFn)
103
+ results.push(enrichFunction(db, callerFn));
104
+ }
105
+ // Add transitive callers
106
+ for (const callerFn of transitiveCallers) {
107
+ if (seenIds.has(callerFn.id))
108
+ continue;
109
+ seenIds.add(callerFn.id);
110
+ results.push(enrichFunction(db, callerFn));
111
+ }
112
+ return { functions: results, strategy: 'impact' };
113
+ }
114
+ function enrichFunction(db, fn) {
115
+ const file = db.prepare('SELECT path FROM files WHERE id = ?').get(fn.file_id);
116
+ const location = file ? `${file.path}:${fn.start_line}` : `unknown:${fn.start_line}`;
117
+ const callees = (0, queries_1.getCallees)(db, fn.id);
118
+ const callers = (0, queries_1.getCallers)(db, fn.id);
119
+ let sideEffects = [];
120
+ try {
121
+ if (fn.side_effects_json) {
122
+ sideEffects = JSON.parse(fn.side_effects_json);
123
+ }
124
+ }
125
+ catch { }
126
+ return {
127
+ name: fn.name,
128
+ location,
129
+ signature: fn.signature,
130
+ purpose: fn.purpose,
131
+ behavior: fn.behavior_summary,
132
+ sideEffects,
133
+ domain: fn.domain,
134
+ complexity: fn.complexity,
135
+ calls: callees.map(c => c.callee_name),
136
+ calledBy: callers.map(c => {
137
+ const callerFn = (0, queries_1.getFunctionById)(db, c.caller_function_id);
138
+ return callerFn?.name || 'unknown';
139
+ }),
140
+ };
141
+ }
142
+ //# sourceMappingURL=retriever.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retriever.js","sourceRoot":"","sources":["../../src/query/retriever.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface AnalyzeResult {
3
+ analyzed: number;
4
+ cached: number;
5
+ failed: number;
6
+ totalInputTokens: number;
7
+ totalOutputTokens: number;
8
+ totalCost: number;
9
+ }
10
+ export declare function analyzeBatch(db: Database.Database, queueItems: Array<{
11
+ id: number;
12
+ function_id: number;
13
+ }>, model: string, apiKey: string): Promise<AnalyzeResult>;
14
+ export declare function rebuildSearchIndex(db: Database.Database): void;
15
+ //# sourceMappingURL=analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/semantic/analyzer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAY3C,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"}