structx 1.0.0 → 2.1.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 (62) hide show
  1. package/README.md +72 -0
  2. package/dist/cli.js +260 -211
  3. package/dist/cli.js.map +1 -1
  4. package/dist/db/connection.js +28 -1
  5. package/dist/db/connection.js.map +1 -1
  6. package/dist/db/queries.d.ts +144 -0
  7. package/dist/db/queries.d.ts.map +1 -1
  8. package/dist/db/queries.js +282 -6
  9. package/dist/db/queries.js.map +1 -1
  10. package/dist/db/schema.sql +59 -0
  11. package/dist/ingest/constant-extractor.d.ts +11 -0
  12. package/dist/ingest/constant-extractor.d.ts.map +1 -0
  13. package/dist/ingest/constant-extractor.js +38 -0
  14. package/dist/ingest/constant-extractor.js.map +1 -0
  15. package/dist/ingest/file-metadata.d.ts +13 -0
  16. package/dist/ingest/file-metadata.d.ts.map +1 -0
  17. package/dist/ingest/file-metadata.js +55 -0
  18. package/dist/ingest/file-metadata.js.map +1 -0
  19. package/dist/ingest/ingester.d.ts +15 -0
  20. package/dist/ingest/ingester.d.ts.map +1 -0
  21. package/dist/ingest/ingester.js +217 -0
  22. package/dist/ingest/ingester.js.map +1 -0
  23. package/dist/ingest/parser.d.ts +12 -0
  24. package/dist/ingest/parser.d.ts.map +1 -1
  25. package/dist/ingest/parser.js +48 -0
  26. package/dist/ingest/parser.js.map +1 -1
  27. package/dist/ingest/route-extractor.d.ts +12 -0
  28. package/dist/ingest/route-extractor.d.ts.map +1 -0
  29. package/dist/ingest/route-extractor.js +64 -0
  30. package/dist/ingest/route-extractor.js.map +1 -0
  31. package/dist/ingest/type-extractor.d.ts +11 -0
  32. package/dist/ingest/type-extractor.d.ts.map +1 -0
  33. package/dist/ingest/type-extractor.js +47 -0
  34. package/dist/ingest/type-extractor.js.map +1 -0
  35. package/dist/instructions/claude.md +54 -25
  36. package/dist/instructions/codex.md +70 -0
  37. package/dist/instructions/copilot.md +57 -26
  38. package/dist/instructions/cursor.md +54 -25
  39. package/dist/instructions/generic.md +54 -25
  40. package/dist/query/answerer.d.ts.map +1 -1
  41. package/dist/query/answerer.js +6 -2
  42. package/dist/query/answerer.js.map +1 -1
  43. package/dist/query/classifier.d.ts +6 -1
  44. package/dist/query/classifier.d.ts.map +1 -1
  45. package/dist/query/classifier.js +22 -2
  46. package/dist/query/classifier.js.map +1 -1
  47. package/dist/query/context-builder.d.ts.map +1 -1
  48. package/dist/query/context-builder.js +152 -6
  49. package/dist/query/context-builder.js.map +1 -1
  50. package/dist/query/retriever.d.ts +44 -0
  51. package/dist/query/retriever.d.ts.map +1 -1
  52. package/dist/query/retriever.js +211 -14
  53. package/dist/query/retriever.js.map +1 -1
  54. package/dist/semantic/analyzer.d.ts +10 -0
  55. package/dist/semantic/analyzer.d.ts.map +1 -1
  56. package/dist/semantic/analyzer.js +147 -1
  57. package/dist/semantic/analyzer.js.map +1 -1
  58. package/dist/semantic/prompt.d.ts +21 -0
  59. package/dist/semantic/prompt.d.ts.map +1 -1
  60. package/dist/semantic/prompt.js +63 -0
  61. package/dist/semantic/prompt.js.map +1 -1
  62. package/package.json +1 -1
@@ -3,19 +3,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.buildContext = buildContext;
4
4
  const tokens_1 = require("../utils/tokens");
5
5
  function buildContext(retrieved, question) {
6
- if (retrieved.functions.length === 0) {
7
- return `No functions found matching the query.\n\nQuestion: ${question}`;
6
+ const totalEntities = retrieved.functions.length + retrieved.types.length +
7
+ retrieved.routes.length + retrieved.files.length + retrieved.constants.length;
8
+ if (totalEntities === 0) {
9
+ return `No results found matching the query. The knowledge graph may not contain relevant data for this question. Try:\n- "structx overview --repo ." to see what entities are indexed\n- Rephrase your question with different keywords\n- Run "structx ingest ." if files were recently added\n\nQuestion: ${question}`;
8
10
  }
9
11
  const sections = [];
10
12
  switch (retrieved.strategy) {
11
13
  case 'direct':
12
- sections.push(formatDirectContext(retrieved.functions[0]));
14
+ if (retrieved.functions.length > 0)
15
+ sections.push(formatDirectContext(retrieved.functions[0]));
13
16
  break;
14
17
  case 'relationship':
15
18
  sections.push(formatRelationshipContext(retrieved.functions));
16
19
  break;
17
20
  case 'semantic':
18
- sections.push(formatSemanticContext(retrieved.functions));
21
+ if (retrieved.functions.length > 0)
22
+ sections.push(formatSemanticContext(retrieved.functions));
23
+ if (retrieved.types.length > 0)
24
+ sections.push(formatTypesContext(retrieved.types));
25
+ if (retrieved.routes.length > 0)
26
+ sections.push(formatRoutesContext(retrieved.routes));
19
27
  break;
20
28
  case 'domain':
21
29
  sections.push(formatDomainContext(retrieved.functions));
@@ -23,12 +31,53 @@ function buildContext(retrieved, question) {
23
31
  case 'impact':
24
32
  sections.push(formatImpactContext(retrieved.functions));
25
33
  break;
34
+ case 'route':
35
+ sections.push(formatRoutesContext(retrieved.routes));
36
+ break;
37
+ case 'type':
38
+ sections.push(formatTypesContext(retrieved.types));
39
+ break;
40
+ case 'file':
41
+ if (retrieved.files.length > 0)
42
+ sections.push(formatFilesContext(retrieved.files));
43
+ if (retrieved.functions.length > 0)
44
+ sections.push('Functions:\n' + formatFunctionList(retrieved.functions));
45
+ if (retrieved.types.length > 0)
46
+ sections.push('Types:\n' + formatTypesContext(retrieved.types));
47
+ if (retrieved.routes.length > 0)
48
+ sections.push('Routes:\n' + formatRoutesContext(retrieved.routes));
49
+ if (retrieved.constants.length > 0)
50
+ sections.push('Constants:\n' + formatConstantsContext(retrieved.constants));
51
+ break;
52
+ case 'list':
53
+ if (retrieved.functions.length > 0)
54
+ sections.push('Functions:\n' + formatFunctionList(retrieved.functions));
55
+ if (retrieved.routes.length > 0)
56
+ sections.push('Routes:\n' + formatRoutesContext(retrieved.routes));
57
+ if (retrieved.types.length > 0)
58
+ sections.push('Types:\n' + formatTypesContext(retrieved.types));
59
+ if (retrieved.files.length > 0)
60
+ sections.push('Files:\n' + formatFilesContext(retrieved.files));
61
+ if (retrieved.constants.length > 0)
62
+ sections.push('Constants:\n' + formatConstantsContext(retrieved.constants));
63
+ break;
64
+ case 'pattern':
65
+ if (retrieved.functions.length > 0)
66
+ sections.push('Functions:\n' + formatFunctionList(retrieved.functions));
67
+ if (retrieved.types.length > 0)
68
+ sections.push('Types:\n' + formatTypesContext(retrieved.types));
69
+ if (retrieved.routes.length > 0)
70
+ sections.push('Routes:\n' + formatRoutesContext(retrieved.routes));
71
+ if (retrieved.files.length > 0)
72
+ sections.push('Files:\n' + formatFilesContext(retrieved.files));
73
+ break;
26
74
  default:
27
- sections.push(formatSemanticContext(retrieved.functions));
75
+ if (retrieved.functions.length > 0)
76
+ sections.push(formatSemanticContext(retrieved.functions));
28
77
  }
29
78
  const context = sections.join('\n\n');
30
79
  const tokens = (0, tokens_1.estimateTokens)(context);
31
- return `[Context retrieved via ${retrieved.strategy} strategy | ${retrieved.functions.length} functions | ~${tokens} tokens]\n\n${context}`;
80
+ return `[Context retrieved via ${retrieved.strategy} strategy | ${totalEntities} entities | ~${tokens} tokens]\n\n${context}`;
32
81
  }
33
82
  function formatDirectContext(fn) {
34
83
  const lines = [
@@ -57,9 +106,16 @@ function formatRelationshipContext(functions) {
57
106
  const lines = [
58
107
  `${i + 1}. ${fn.name}`,
59
108
  ` Location: ${fn.location}`,
109
+ ` Signature: ${fn.signature}`,
60
110
  ];
61
111
  if (fn.purpose)
62
112
  lines.push(` Purpose: ${fn.purpose}`);
113
+ if (fn.behavior)
114
+ lines.push(` Behavior: ${fn.behavior}`);
115
+ if (fn.calls.length > 0)
116
+ lines.push(` Calls: ${fn.calls.join(', ')}`);
117
+ if (fn.calledBy.length > 0)
118
+ lines.push(` Called By: ${fn.calledBy.join(', ')}`);
63
119
  return lines.join('\n');
64
120
  }).join('\n\n');
65
121
  }
@@ -68,11 +124,16 @@ function formatSemanticContext(functions) {
68
124
  const lines = [
69
125
  `${i + 1}. ${fn.name}`,
70
126
  ` Location: ${fn.location}`,
127
+ ` Signature: ${fn.signature}`,
71
128
  ];
72
129
  if (fn.purpose)
73
130
  lines.push(` Purpose: ${fn.purpose}`);
131
+ if (fn.behavior)
132
+ lines.push(` Behavior: ${fn.behavior}`);
74
133
  if (fn.domain)
75
134
  lines.push(` Domain: ${fn.domain}`);
135
+ if (fn.calls.length > 0)
136
+ lines.push(` Calls: ${fn.calls.join(', ')}`);
76
137
  return lines.join('\n');
77
138
  }).join('\n\n');
78
139
  }
@@ -81,11 +142,14 @@ function formatDomainContext(functions) {
81
142
  const lines = [
82
143
  `${i + 1}. ${fn.name}`,
83
144
  ` Location: ${fn.location}`,
145
+ ` Signature: ${fn.signature}`,
84
146
  ];
85
147
  if (fn.purpose)
86
148
  lines.push(` Purpose: ${fn.purpose}`);
87
149
  if (fn.sideEffects.length > 0)
88
150
  lines.push(` Side Effects: ${fn.sideEffects.join(', ')}`);
151
+ if (fn.calls.length > 0)
152
+ lines.push(` Calls: ${fn.calls.join(', ')}`);
89
153
  return lines.join('\n');
90
154
  }).join('\n\n');
91
155
  }
@@ -95,10 +159,92 @@ function formatImpactContext(functions) {
95
159
  const lines = [
96
160
  `${i + 1}. ${fn.name}`,
97
161
  ` Location: ${fn.location}`,
162
+ ` Signature: ${fn.signature}`,
98
163
  ];
99
164
  if (fn.purpose)
100
165
  lines.push(` Purpose: ${fn.purpose}`);
166
+ if (fn.calls.length > 0)
167
+ lines.push(` Calls: ${fn.calls.join(', ')}`);
101
168
  return lines.join('\n');
102
169
  }).join('\n\n');
103
170
  }
171
+ function formatFunctionList(functions) {
172
+ return functions.map((fn, i) => {
173
+ const lines = [
174
+ `${i + 1}. ${fn.name}`,
175
+ ` Location: ${fn.location}`,
176
+ ` Signature: ${fn.signature}`,
177
+ ];
178
+ if (fn.purpose)
179
+ lines.push(` Purpose: ${fn.purpose}`);
180
+ return lines.join('\n');
181
+ }).join('\n\n');
182
+ }
183
+ function formatRoutesContext(routes) {
184
+ if (routes.length === 0)
185
+ return 'No routes found.';
186
+ return routes.map((r, i) => {
187
+ const lines = [
188
+ `${i + 1}. ${r.method} ${r.path}`,
189
+ ` Location: ${r.location}`,
190
+ ];
191
+ if (r.handlerName)
192
+ lines.push(` Handler: ${r.handlerName}`);
193
+ if (r.middleware.length > 0)
194
+ lines.push(` Middleware: ${r.middleware.join(', ')}`);
195
+ if (r.purpose)
196
+ lines.push(` Purpose: ${r.purpose}`);
197
+ // Include truncated handler body for context
198
+ const bodyPreview = r.handlerBody.length > 300 ? r.handlerBody.substring(0, 300) + '...' : r.handlerBody;
199
+ lines.push(` Handler body: ${bodyPreview}`);
200
+ return lines.join('\n');
201
+ }).join('\n\n');
202
+ }
203
+ function formatTypesContext(types) {
204
+ if (types.length === 0)
205
+ return 'No types found.';
206
+ return types.map((t, i) => {
207
+ const lines = [
208
+ `${i + 1}. ${t.kind} ${t.name}${t.isExported ? ' (exported)' : ''}`,
209
+ ` Location: ${t.location}`,
210
+ ];
211
+ if (t.purpose)
212
+ lines.push(` Purpose: ${t.purpose}`);
213
+ lines.push(` Definition:\n${t.fullText}`);
214
+ return lines.join('\n');
215
+ }).join('\n\n');
216
+ }
217
+ function formatFilesContext(files) {
218
+ if (files.length === 0)
219
+ return 'No files found.';
220
+ return files.map((f, i) => {
221
+ const lines = [
222
+ `${i + 1}. ${f.path}`,
223
+ ` LOC: ${f.loc} | Functions: ${f.functionCount} | Types: ${f.typeCount} | Routes: ${f.routeCount}`,
224
+ ` Imports: ${f.importCount} | Exports: ${f.exportCount}`,
225
+ ];
226
+ if (f.purpose)
227
+ lines.push(` Purpose: ${f.purpose}`);
228
+ if (f.exports.length > 0)
229
+ lines.push(` Exports: ${f.exports.join(', ')}`);
230
+ return lines.join('\n');
231
+ }).join('\n\n');
232
+ }
233
+ function formatConstantsContext(constants) {
234
+ if (constants.length === 0)
235
+ return 'No constants found.';
236
+ return constants.map((c, i) => {
237
+ const lines = [
238
+ `${i + 1}. ${c.name}${c.isExported ? ' (exported)' : ''}`,
239
+ ` Location: ${c.location}`,
240
+ ];
241
+ if (c.typeAnnotation)
242
+ lines.push(` Type: ${c.typeAnnotation}`);
243
+ if (c.valueText) {
244
+ const preview = c.valueText.length > 200 ? c.valueText.substring(0, 200) + '...' : c.valueText;
245
+ lines.push(` Value: ${preview}`);
246
+ }
247
+ return lines.join('\n');
248
+ }).join('\n\n');
249
+ }
104
250
  //# sourceMappingURL=context-builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../src/query/context-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../src/query/context-builder.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,10 @@
1
1
  import type Database from 'better-sqlite3';
2
2
  export interface RetrievedContext {
3
3
  functions: RetrievedFunction[];
4
+ types: RetrievedType[];
5
+ routes: RetrievedRoute[];
6
+ files: RetrievedFile[];
7
+ constants: RetrievedConstant[];
4
8
  strategy: string;
5
9
  }
6
10
  export interface RetrievedFunction {
@@ -15,9 +19,49 @@ export interface RetrievedFunction {
15
19
  calls: string[];
16
20
  calledBy: string[];
17
21
  }
22
+ export interface RetrievedType {
23
+ name: string;
24
+ kind: string;
25
+ location: string;
26
+ fullText: string;
27
+ isExported: boolean;
28
+ purpose: string | null;
29
+ }
30
+ export interface RetrievedRoute {
31
+ method: string;
32
+ path: string;
33
+ location: string;
34
+ handlerName: string | null;
35
+ handlerBody: string;
36
+ middleware: string[];
37
+ purpose: string | null;
38
+ }
39
+ export interface RetrievedFile {
40
+ path: string;
41
+ importCount: number;
42
+ exportCount: number;
43
+ functionCount: number;
44
+ typeCount: number;
45
+ routeCount: number;
46
+ loc: number;
47
+ purpose: string | null;
48
+ exports: string[];
49
+ }
50
+ export interface RetrievedConstant {
51
+ name: string;
52
+ location: string;
53
+ valueText: string | null;
54
+ typeAnnotation: string | null;
55
+ isExported: boolean;
56
+ }
18
57
  export declare function directLookup(db: Database.Database, name: string): RetrievedContext;
19
58
  export declare function relationshipQuery(db: Database.Database, name: string, direction: 'callers' | 'callees'): RetrievedContext;
20
59
  export declare function semanticSearch(db: Database.Database, keywords: string[]): RetrievedContext;
21
60
  export declare function domainQuery(db: Database.Database, domain: string): RetrievedContext;
22
61
  export declare function impactAnalysis(db: Database.Database, name: string): RetrievedContext;
62
+ export declare function routeQuery(db: Database.Database, routePath?: string | null, method?: string | null): RetrievedContext;
63
+ export declare function typeQuery(db: Database.Database, typeName: string): RetrievedContext;
64
+ export declare function fileQuery(db: Database.Database, filePath?: string | null): RetrievedContext;
65
+ export declare function listQuery(db: Database.Database, entity: string | null): RetrievedContext;
66
+ export declare function patternQuery(db: Database.Database, keywords: string[]): RetrievedContext;
23
67
  //# sourceMappingURL=retriever.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"retriever.d.ts","sourceRoot":"","sources":["../../src/query/retriever.ts"],"names":[],"mappings":"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"}
@@ -5,21 +5,29 @@ exports.relationshipQuery = relationshipQuery;
5
5
  exports.semanticSearch = semanticSearch;
6
6
  exports.domainQuery = domainQuery;
7
7
  exports.impactAnalysis = impactAnalysis;
8
+ exports.routeQuery = routeQuery;
9
+ exports.typeQuery = typeQuery;
10
+ exports.fileQuery = fileQuery;
11
+ exports.listQuery = listQuery;
12
+ exports.patternQuery = patternQuery;
8
13
  const queries_1 = require("../db/queries");
14
+ function emptyContext(strategy) {
15
+ return { functions: [], types: [], routes: [], files: [], constants: [], strategy };
16
+ }
9
17
  function directLookup(db, name) {
10
18
  const fn = (0, queries_1.getFunctionByName)(db, name);
11
19
  if (!fn) {
12
- return { functions: [], strategy: 'direct' };
20
+ return emptyContext('direct');
13
21
  }
14
22
  return {
23
+ ...emptyContext('direct'),
15
24
  functions: [enrichFunction(db, fn)],
16
- strategy: 'direct',
17
25
  };
18
26
  }
19
27
  function relationshipQuery(db, name, direction) {
20
28
  const fn = (0, queries_1.getFunctionByName)(db, name);
21
29
  if (!fn) {
22
- return { functions: [], strategy: 'relationship' };
30
+ return emptyContext('relationship');
23
31
  }
24
32
  const results = [];
25
33
  if (direction === 'callees') {
@@ -48,7 +56,6 @@ function relationshipQuery(db, name, direction) {
48
56
  }
49
57
  else {
50
58
  const callers = (0, queries_1.getCallers)(db, fn.id);
51
- // Also check by name for cases where callee_function_id wasn't resolved
52
59
  const callersByName = (0, queries_1.getCallersByName)(db, name);
53
60
  const seenIds = new Set();
54
61
  for (const rel of [...callers, ...callersByName]) {
@@ -60,27 +67,31 @@ function relationshipQuery(db, name, direction) {
60
67
  results.push(enrichFunction(db, callerFn));
61
68
  }
62
69
  }
63
- return { functions: results, strategy: 'relationship' };
70
+ return { ...emptyContext('relationship'), functions: results };
64
71
  }
65
72
  function semanticSearch(db, keywords) {
66
73
  const query = keywords.join(' OR ');
67
- const results = (0, queries_1.searchFunctions)(db, query, 10);
74
+ const functions = (0, queries_1.searchFunctions)(db, query, 10);
75
+ const types = (0, queries_1.searchTypes)(db, query, 5);
76
+ const routes = (0, queries_1.searchRoutes)(db, query, 5);
68
77
  return {
69
- functions: results.map(fn => enrichFunction(db, fn)),
70
- strategy: 'semantic',
78
+ ...emptyContext('semantic'),
79
+ functions: functions.map(fn => enrichFunction(db, fn)),
80
+ types: types.map(t => enrichType(db, t)),
81
+ routes: routes.map(r => enrichRoute(db, r)),
71
82
  };
72
83
  }
73
84
  function domainQuery(db, domain) {
74
85
  const results = db.prepare('SELECT * FROM functions WHERE domain = ?').all(domain);
75
86
  return {
87
+ ...emptyContext('domain'),
76
88
  functions: results.map(fn => enrichFunction(db, fn)),
77
- strategy: 'domain',
78
89
  };
79
90
  }
80
91
  function impactAnalysis(db, name) {
81
92
  const fn = (0, queries_1.getFunctionByName)(db, name);
82
93
  if (!fn) {
83
- return { functions: [], strategy: 'impact' };
94
+ return emptyContext('impact');
84
95
  }
85
96
  // Direct callers
86
97
  const directCallers = (0, queries_1.getCallers)(db, fn.id);
@@ -89,8 +100,8 @@ function impactAnalysis(db, name) {
89
100
  ...directCallers.map(r => r.caller_function_id),
90
101
  ...directCallersByName.map(r => r.caller_function_id),
91
102
  ]);
92
- // Transitive callers
93
- const transitiveCallers = (0, queries_1.getTransitiveCallers)(db, fn.id);
103
+ // Transitive callers (using both ID and name for robustness)
104
+ const transitiveCallers = (0, queries_1.getTransitiveCallersRobust)(db, fn.id, name);
94
105
  const results = [];
95
106
  const seenIds = new Set();
96
107
  // Add direct callers first (marked)
@@ -109,13 +120,138 @@ function impactAnalysis(db, name) {
109
120
  seenIds.add(callerFn.id);
110
121
  results.push(enrichFunction(db, callerFn));
111
122
  }
112
- return { functions: results, strategy: 'impact' };
123
+ return { ...emptyContext('impact'), functions: results };
124
+ }
125
+ // ── New retriever strategies ──
126
+ function routeQuery(db, routePath, method) {
127
+ let routes;
128
+ if (routePath) {
129
+ routes = db.prepare('SELECT * FROM routes WHERE path LIKE ?').all(`%${routePath}%`);
130
+ if (method) {
131
+ routes = routes.filter(r => r.method === method.toUpperCase());
132
+ }
133
+ }
134
+ else {
135
+ routes = (0, queries_1.getAllRoutes)(db);
136
+ }
137
+ return {
138
+ ...emptyContext('route'),
139
+ routes: routes.map(r => enrichRoute(db, r)),
140
+ };
141
+ }
142
+ function typeQuery(db, typeName) {
143
+ const t = (0, queries_1.getTypeByName)(db, typeName);
144
+ if (!t) {
145
+ // Try FTS search
146
+ const results = (0, queries_1.searchTypes)(db, typeName, 5);
147
+ return {
148
+ ...emptyContext('type'),
149
+ types: results.map(r => enrichType(db, r)),
150
+ };
151
+ }
152
+ return {
153
+ ...emptyContext('type'),
154
+ types: [enrichType(db, t)],
155
+ };
156
+ }
157
+ function fileQuery(db, filePath) {
158
+ if (filePath) {
159
+ // Try exact match first, then partial
160
+ let fileRow = (0, queries_1.getFileByPath)(db, filePath);
161
+ if (!fileRow) {
162
+ const allFiles = (0, queries_1.getAllFiles)(db);
163
+ fileRow = allFiles.find(f => f.path.includes(filePath)) || undefined;
164
+ }
165
+ if (!fileRow) {
166
+ return emptyContext('file');
167
+ }
168
+ const overview = (0, queries_1.getFileOverview)(db, fileRow.id);
169
+ if (!overview)
170
+ return emptyContext('file');
171
+ return {
172
+ ...emptyContext('file'),
173
+ functions: overview.functions.map(fn => enrichFunction(db, fn)),
174
+ types: overview.types.map(t => enrichType(db, t)),
175
+ routes: overview.routes.map(r => enrichRoute(db, r)),
176
+ constants: overview.constants.map(c => enrichConstant(db, c)),
177
+ files: overview.summary ? [enrichFileSummary(overview.file.path, overview.summary)] : [],
178
+ };
179
+ }
180
+ // Return all file summaries
181
+ const allSummaries = (0, queries_1.getAllFileSummaries)(db);
182
+ const allFileRows = (0, queries_1.getAllFiles)(db);
183
+ const fileMap = new Map(allFileRows.map(f => [f.id, f.path]));
184
+ return {
185
+ ...emptyContext('file'),
186
+ files: allSummaries.map(s => enrichFileSummary(fileMap.get(s.file_id) || 'unknown', s)),
187
+ };
188
+ }
189
+ function listQuery(db, entity) {
190
+ const ctx = emptyContext('list');
191
+ switch (entity) {
192
+ case 'routes':
193
+ ctx.routes = (0, queries_1.getAllRoutes)(db).map(r => enrichRoute(db, r));
194
+ break;
195
+ case 'types':
196
+ ctx.types = (0, queries_1.getAllTypes)(db).map(t => enrichType(db, t));
197
+ break;
198
+ case 'files': {
199
+ const summaries = (0, queries_1.getAllFileSummaries)(db);
200
+ const fileRows = (0, queries_1.getAllFiles)(db);
201
+ const fileMap = new Map(fileRows.map(f => [f.id, f.path]));
202
+ ctx.files = summaries.map(s => enrichFileSummary(fileMap.get(s.file_id) || 'unknown', s));
203
+ break;
204
+ }
205
+ case 'functions':
206
+ ctx.functions = (0, queries_1.getAllFunctions)(db).slice(0, 50).map(fn => enrichFunction(db, fn));
207
+ break;
208
+ case 'constants': {
209
+ const allFileRows = (0, queries_1.getAllFiles)(db);
210
+ for (const file of allFileRows) {
211
+ const consts = (0, queries_1.getConstantsByFileId)(db, file.id);
212
+ ctx.constants.push(...consts.map(c => enrichConstant(db, c)));
213
+ }
214
+ break;
215
+ }
216
+ default:
217
+ // Return a mix of everything
218
+ ctx.functions = (0, queries_1.getAllFunctions)(db).slice(0, 20).map(fn => enrichFunction(db, fn));
219
+ ctx.routes = (0, queries_1.getAllRoutes)(db).map(r => enrichRoute(db, r));
220
+ ctx.types = (0, queries_1.getAllTypes)(db).slice(0, 20).map(t => enrichType(db, t));
221
+ break;
222
+ }
223
+ return ctx;
224
+ }
225
+ function patternQuery(db, keywords) {
226
+ const query = keywords.join(' OR ');
227
+ const functions = (0, queries_1.searchFunctions)(db, query, 15);
228
+ const types = (0, queries_1.searchTypes)(db, query, 10);
229
+ const routes = (0, queries_1.searchRoutes)(db, query, 10);
230
+ const fileSummaries = (0, queries_1.searchFiles)(db, query, 5);
231
+ const allFileRows = (0, queries_1.getAllFiles)(db);
232
+ const fileMap = new Map(allFileRows.map(f => [f.id, f.path]));
233
+ return {
234
+ ...emptyContext('pattern'),
235
+ functions: functions.map(fn => enrichFunction(db, fn)),
236
+ types: types.map(t => enrichType(db, t)),
237
+ routes: routes.map(r => enrichRoute(db, r)),
238
+ files: fileSummaries.map(s => enrichFileSummary(fileMap.get(s.file_id) || 'unknown', s)),
239
+ };
113
240
  }
114
241
  function enrichFunction(db, fn) {
115
242
  const file = db.prepare('SELECT path FROM files WHERE id = ?').get(fn.file_id);
116
243
  const location = file ? `${file.path}:${fn.start_line}` : `unknown:${fn.start_line}`;
117
244
  const callees = (0, queries_1.getCallees)(db, fn.id);
118
245
  const callers = (0, queries_1.getCallers)(db, fn.id);
246
+ const callersByName = (0, queries_1.getCallersByName)(db, fn.name);
247
+ // Deduplicate callers by caller_function_id
248
+ const seenCallerIds = new Set();
249
+ const allCallers = [...callers, ...callersByName].filter(rel => {
250
+ if (seenCallerIds.has(rel.caller_function_id))
251
+ return false;
252
+ seenCallerIds.add(rel.caller_function_id);
253
+ return true;
254
+ });
119
255
  let sideEffects = [];
120
256
  try {
121
257
  if (fn.side_effects_json) {
@@ -133,10 +269,71 @@ function enrichFunction(db, fn) {
133
269
  domain: fn.domain,
134
270
  complexity: fn.complexity,
135
271
  calls: callees.map(c => c.callee_name),
136
- calledBy: callers.map(c => {
272
+ calledBy: allCallers.map(c => {
137
273
  const callerFn = (0, queries_1.getFunctionById)(db, c.caller_function_id);
138
274
  return callerFn?.name || 'unknown';
139
275
  }),
140
276
  };
141
277
  }
278
+ function enrichType(db, t) {
279
+ const file = db.prepare('SELECT path FROM files WHERE id = ?').get(t.file_id);
280
+ const location = file ? `${file.path}:${t.start_line}` : `unknown:${t.start_line}`;
281
+ return {
282
+ name: t.name,
283
+ kind: t.kind,
284
+ location,
285
+ fullText: t.full_text,
286
+ isExported: !!t.is_exported,
287
+ purpose: t.purpose,
288
+ };
289
+ }
290
+ function enrichRoute(db, r) {
291
+ const file = db.prepare('SELECT path FROM files WHERE id = ?').get(r.file_id);
292
+ const location = file ? `${file.path}:${r.start_line}` : `unknown:${r.start_line}`;
293
+ let middleware = [];
294
+ try {
295
+ if (r.middleware)
296
+ middleware = JSON.parse(r.middleware);
297
+ }
298
+ catch { }
299
+ return {
300
+ method: r.method,
301
+ path: r.path,
302
+ location,
303
+ handlerName: r.handler_name,
304
+ handlerBody: r.handler_body,
305
+ middleware,
306
+ purpose: r.purpose,
307
+ };
308
+ }
309
+ function enrichConstant(db, c) {
310
+ const file = db.prepare('SELECT path FROM files WHERE id = ?').get(c.file_id);
311
+ const location = file ? `${file.path}:${c.start_line}` : `unknown:${c.start_line}`;
312
+ return {
313
+ name: c.name,
314
+ location,
315
+ valueText: c.value_text,
316
+ typeAnnotation: c.type_annotation,
317
+ isExported: !!c.is_exported,
318
+ };
319
+ }
320
+ function enrichFileSummary(filePath, s) {
321
+ let exports = [];
322
+ try {
323
+ if (s.exports_json)
324
+ exports = JSON.parse(s.exports_json);
325
+ }
326
+ catch { }
327
+ return {
328
+ path: filePath,
329
+ importCount: s.import_count,
330
+ exportCount: s.export_count,
331
+ functionCount: s.function_count,
332
+ typeCount: s.type_count,
333
+ routeCount: s.route_count,
334
+ loc: s.loc,
335
+ purpose: s.purpose,
336
+ exports,
337
+ };
338
+ }
142
339
  //# sourceMappingURL=retriever.js.map