@ddse/acm-aicoder 0.5.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 (165) hide show
  1. package/.aicoder/index.json +304 -0
  2. package/AICODER_IMPLEMENTATION_PLAN_PHASE2.md +284 -0
  3. package/LICENSE +21 -0
  4. package/README.md +490 -0
  5. package/bin/interactive.tsx +232 -0
  6. package/dist/bin/interactive.d.ts +3 -0
  7. package/dist/bin/interactive.d.ts.map +1 -0
  8. package/dist/bin/interactive.js +155 -0
  9. package/dist/bin/interactive.js.map +1 -0
  10. package/dist/src/config/providers.d.ts +15 -0
  11. package/dist/src/config/providers.d.ts.map +1 -0
  12. package/dist/src/config/providers.js +142 -0
  13. package/dist/src/config/providers.js.map +1 -0
  14. package/dist/src/config/session.d.ts +25 -0
  15. package/dist/src/config/session.d.ts.map +1 -0
  16. package/dist/src/config/session.js +97 -0
  17. package/dist/src/config/session.js.map +1 -0
  18. package/dist/src/context/bm25.d.ts +68 -0
  19. package/dist/src/context/bm25.d.ts.map +1 -0
  20. package/dist/src/context/bm25.js +131 -0
  21. package/dist/src/context/bm25.js.map +1 -0
  22. package/dist/src/context/code-search.d.ts +30 -0
  23. package/dist/src/context/code-search.d.ts.map +1 -0
  24. package/dist/src/context/code-search.js +150 -0
  25. package/dist/src/context/code-search.js.map +1 -0
  26. package/dist/src/context/context-pack.d.ts +25 -0
  27. package/dist/src/context/context-pack.d.ts.map +1 -0
  28. package/dist/src/context/context-pack.js +92 -0
  29. package/dist/src/context/context-pack.js.map +1 -0
  30. package/dist/src/context/dependency-mapper.d.ts +10 -0
  31. package/dist/src/context/dependency-mapper.d.ts.map +1 -0
  32. package/dist/src/context/dependency-mapper.js +62 -0
  33. package/dist/src/context/dependency-mapper.js.map +1 -0
  34. package/dist/src/context/index.d.ts +8 -0
  35. package/dist/src/context/index.d.ts.map +1 -0
  36. package/dist/src/context/index.js +9 -0
  37. package/dist/src/context/index.js.map +1 -0
  38. package/dist/src/context/symbol-extractor.d.ts +26 -0
  39. package/dist/src/context/symbol-extractor.d.ts.map +1 -0
  40. package/dist/src/context/symbol-extractor.js +129 -0
  41. package/dist/src/context/symbol-extractor.js.map +1 -0
  42. package/dist/src/context/test-mapper.d.ts +16 -0
  43. package/dist/src/context/test-mapper.d.ts.map +1 -0
  44. package/dist/src/context/test-mapper.js +66 -0
  45. package/dist/src/context/test-mapper.js.map +1 -0
  46. package/dist/src/context/types.d.ts +61 -0
  47. package/dist/src/context/types.d.ts.map +1 -0
  48. package/dist/src/context/types.js +3 -0
  49. package/dist/src/context/types.js.map +1 -0
  50. package/dist/src/context/workspace-indexer.d.ts +39 -0
  51. package/dist/src/context/workspace-indexer.d.ts.map +1 -0
  52. package/dist/src/context/workspace-indexer.js +222 -0
  53. package/dist/src/context/workspace-indexer.js.map +1 -0
  54. package/dist/src/index.d.ts +5 -0
  55. package/dist/src/index.d.ts.map +1 -0
  56. package/dist/src/index.js +6 -0
  57. package/dist/src/index.js.map +1 -0
  58. package/dist/src/registries.d.ts +34 -0
  59. package/dist/src/registries.d.ts.map +1 -0
  60. package/dist/src/registries.js +87 -0
  61. package/dist/src/registries.js.map +1 -0
  62. package/dist/src/runtime/budget-manager.d.ts +42 -0
  63. package/dist/src/runtime/budget-manager.d.ts.map +1 -0
  64. package/dist/src/runtime/budget-manager.js +82 -0
  65. package/dist/src/runtime/budget-manager.js.map +1 -0
  66. package/dist/src/runtime/interactive-runtime.d.ts +39 -0
  67. package/dist/src/runtime/interactive-runtime.d.ts.map +1 -0
  68. package/dist/src/runtime/interactive-runtime.js +321 -0
  69. package/dist/src/runtime/interactive-runtime.js.map +1 -0
  70. package/dist/src/tasks-v2/analysis-tasks.d.ts +117 -0
  71. package/dist/src/tasks-v2/analysis-tasks.d.ts.map +1 -0
  72. package/dist/src/tasks-v2/analysis-tasks.js +209 -0
  73. package/dist/src/tasks-v2/analysis-tasks.js.map +1 -0
  74. package/dist/src/tasks-v2/developer-tasks.d.ts +226 -0
  75. package/dist/src/tasks-v2/developer-tasks.d.ts.map +1 -0
  76. package/dist/src/tasks-v2/developer-tasks.js +322 -0
  77. package/dist/src/tasks-v2/developer-tasks.js.map +1 -0
  78. package/dist/src/tasks-v2/index.d.ts +3 -0
  79. package/dist/src/tasks-v2/index.d.ts.map +1 -0
  80. package/dist/src/tasks-v2/index.js +4 -0
  81. package/dist/src/tasks-v2/index.js.map +1 -0
  82. package/dist/src/tools-v2/edit-tools.d.ts +67 -0
  83. package/dist/src/tools-v2/edit-tools.d.ts.map +1 -0
  84. package/dist/src/tools-v2/edit-tools.js +117 -0
  85. package/dist/src/tools-v2/edit-tools.js.map +1 -0
  86. package/dist/src/tools-v2/index.d.ts +6 -0
  87. package/dist/src/tools-v2/index.d.ts.map +1 -0
  88. package/dist/src/tools-v2/index.js +7 -0
  89. package/dist/src/tools-v2/index.js.map +1 -0
  90. package/dist/src/tools-v2/read-tools.d.ts +129 -0
  91. package/dist/src/tools-v2/read-tools.d.ts.map +1 -0
  92. package/dist/src/tools-v2/read-tools.js +216 -0
  93. package/dist/src/tools-v2/read-tools.js.map +1 -0
  94. package/dist/src/tools-v2/search-tools.d.ts +73 -0
  95. package/dist/src/tools-v2/search-tools.d.ts.map +1 -0
  96. package/dist/src/tools-v2/search-tools.js +132 -0
  97. package/dist/src/tools-v2/search-tools.js.map +1 -0
  98. package/dist/src/tools-v2/test-tools.d.ts +59 -0
  99. package/dist/src/tools-v2/test-tools.d.ts.map +1 -0
  100. package/dist/src/tools-v2/test-tools.js +111 -0
  101. package/dist/src/tools-v2/test-tools.js.map +1 -0
  102. package/dist/src/tools-v2/workspace-context.d.ts +65 -0
  103. package/dist/src/tools-v2/workspace-context.d.ts.map +1 -0
  104. package/dist/src/tools-v2/workspace-context.js +336 -0
  105. package/dist/src/tools-v2/workspace-context.js.map +1 -0
  106. package/dist/src/ui/App.d.ts +9 -0
  107. package/dist/src/ui/App.d.ts.map +1 -0
  108. package/dist/src/ui/App.js +257 -0
  109. package/dist/src/ui/App.js.map +1 -0
  110. package/dist/src/ui/components/ChatPane.d.ts +12 -0
  111. package/dist/src/ui/components/ChatPane.d.ts.map +1 -0
  112. package/dist/src/ui/components/ChatPane.js +41 -0
  113. package/dist/src/ui/components/ChatPane.js.map +1 -0
  114. package/dist/src/ui/components/EventsPane.d.ts +12 -0
  115. package/dist/src/ui/components/EventsPane.d.ts.map +1 -0
  116. package/dist/src/ui/components/EventsPane.js +48 -0
  117. package/dist/src/ui/components/EventsPane.js.map +1 -0
  118. package/dist/src/ui/components/GoalsTasksPane.d.ts +18 -0
  119. package/dist/src/ui/components/GoalsTasksPane.d.ts.map +1 -0
  120. package/dist/src/ui/components/GoalsTasksPane.js +83 -0
  121. package/dist/src/ui/components/GoalsTasksPane.js.map +1 -0
  122. package/dist/src/ui/store.d.ts +74 -0
  123. package/dist/src/ui/store.d.ts.map +1 -0
  124. package/dist/src/ui/store.js +260 -0
  125. package/dist/src/ui/store.js.map +1 -0
  126. package/dist/tests/integration.test.d.ts +2 -0
  127. package/dist/tests/integration.test.d.ts.map +1 -0
  128. package/dist/tests/integration.test.js +415 -0
  129. package/dist/tests/integration.test.js.map +1 -0
  130. package/dist/tsconfig.tsbuildinfo +1 -0
  131. package/docs/AICODER.png +0 -0
  132. package/docs/INTERACTIVE_CLI_GUIDE.md +201 -0
  133. package/docs/TUI_MOCKUP.md +180 -0
  134. package/package.json +52 -0
  135. package/src/config/providers.ts +174 -0
  136. package/src/config/session.ts +143 -0
  137. package/src/context/bm25.ts +173 -0
  138. package/src/context/code-search.ts +188 -0
  139. package/src/context/context-pack.ts +133 -0
  140. package/src/context/dependency-mapper.ts +72 -0
  141. package/src/context/index.ts +8 -0
  142. package/src/context/symbol-extractor.ts +149 -0
  143. package/src/context/test-mapper.ts +77 -0
  144. package/src/context/types.ts +69 -0
  145. package/src/context/workspace-indexer.ts +249 -0
  146. package/src/index.ts +5 -0
  147. package/src/registries.ts +118 -0
  148. package/src/runtime/budget-manager.ts +118 -0
  149. package/src/runtime/interactive-runtime.ts +423 -0
  150. package/src/tasks-v2/analysis-tasks.ts +311 -0
  151. package/src/tasks-v2/developer-tasks.ts +437 -0
  152. package/src/tasks-v2/index.ts +3 -0
  153. package/src/tools-v2/edit-tools.ts +153 -0
  154. package/src/tools-v2/index.ts +6 -0
  155. package/src/tools-v2/read-tools.ts +286 -0
  156. package/src/tools-v2/search-tools.ts +175 -0
  157. package/src/tools-v2/test-tools.ts +147 -0
  158. package/src/tools-v2/workspace-context.ts +428 -0
  159. package/src/ui/App.tsx +392 -0
  160. package/src/ui/components/ChatPane.tsx +84 -0
  161. package/src/ui/components/EventsPane.tsx +81 -0
  162. package/src/ui/components/GoalsTasksPane.tsx +149 -0
  163. package/src/ui/store.ts +362 -0
  164. package/tests/integration.test.ts +537 -0
  165. package/tsconfig.json +22 -0
@@ -0,0 +1,131 @@
1
+ // Simple BM25 search implementation for ACM examples
2
+ /**
3
+ * Simple tokenizer
4
+ */
5
+ function tokenize(text) {
6
+ if (!text)
7
+ return [];
8
+ return text
9
+ .toLowerCase()
10
+ .replace(/[^\w\s]/g, ' ')
11
+ .split(/\s+/)
12
+ .filter((token) => token.length > 0);
13
+ }
14
+ /**
15
+ * BM25 Search Engine
16
+ *
17
+ * Implements the BM25 ranking function for full-text search.
18
+ * BM25 is a probabilistic ranking function used by search engines
19
+ * to estimate the relevance of documents to a query.
20
+ */
21
+ export class BM25Search {
22
+ documents = [];
23
+ documentTokens = new Map();
24
+ documentFrequency = new Map();
25
+ averageDocumentLength = 0;
26
+ k1;
27
+ b;
28
+ constructor(params = {}) {
29
+ this.k1 = params.k1 ?? 1.5;
30
+ this.b = params.b ?? 0.75;
31
+ }
32
+ /**
33
+ * Index documents for search
34
+ */
35
+ index(documents) {
36
+ this.documents = documents;
37
+ this.documentTokens.clear();
38
+ this.documentFrequency.clear();
39
+ // Tokenize documents
40
+ let totalLength = 0;
41
+ for (const doc of documents) {
42
+ const text = this.extractText(doc);
43
+ const tokens = tokenize(text);
44
+ this.documentTokens.set(doc.id, tokens);
45
+ totalLength += tokens.length;
46
+ // Update document frequency
47
+ const uniqueTokens = new Set(tokens);
48
+ for (const token of uniqueTokens) {
49
+ this.documentFrequency.set(token, (this.documentFrequency.get(token) || 0) + 1);
50
+ }
51
+ }
52
+ this.averageDocumentLength = totalLength / documents.length;
53
+ }
54
+ /**
55
+ * Extract searchable text from document
56
+ */
57
+ extractText(doc) {
58
+ const parts = [];
59
+ if (doc.title)
60
+ parts.push(doc.title);
61
+ if (doc.content)
62
+ parts.push(doc.content);
63
+ return parts.join(' ');
64
+ }
65
+ /**
66
+ * Calculate IDF (Inverse Document Frequency)
67
+ */
68
+ idf(term) {
69
+ const df = this.documentFrequency.get(term) || 0;
70
+ if (df === 0)
71
+ return 0;
72
+ const n = this.documents.length;
73
+ return Math.log((n - df + 0.5) / (df + 0.5) + 1);
74
+ }
75
+ /**
76
+ * Calculate BM25 score for a document
77
+ */
78
+ score(docId, queryTokens) {
79
+ const tokens = this.documentTokens.get(docId);
80
+ if (!tokens)
81
+ return 0;
82
+ const docLength = tokens.length;
83
+ let score = 0;
84
+ for (const queryToken of queryTokens) {
85
+ const termFreq = tokens.filter((t) => t === queryToken).length;
86
+ if (termFreq === 0)
87
+ continue;
88
+ const idf = this.idf(queryToken);
89
+ const numerator = termFreq * (this.k1 + 1);
90
+ const denominator = termFreq + this.k1 * (1 - this.b + this.b * (docLength / this.averageDocumentLength));
91
+ score += idf * (numerator / denominator);
92
+ }
93
+ return score;
94
+ }
95
+ /**
96
+ * Search for documents matching the query
97
+ */
98
+ search(query, limit = 10) {
99
+ if (this.documents.length === 0) {
100
+ return [];
101
+ }
102
+ const queryTokens = tokenize(query);
103
+ if (queryTokens.length === 0) {
104
+ return [];
105
+ }
106
+ // Score all documents
107
+ const results = [];
108
+ for (const doc of this.documents) {
109
+ const score = this.score(doc.id, queryTokens);
110
+ if (score > 0) {
111
+ results.push({ document: doc, score });
112
+ }
113
+ }
114
+ // Sort by score (descending) and limit
115
+ results.sort((a, b) => b.score - a.score);
116
+ return results.slice(0, limit);
117
+ }
118
+ /**
119
+ * Get all indexed documents
120
+ */
121
+ getDocuments() {
122
+ return this.documents;
123
+ }
124
+ /**
125
+ * Get document count
126
+ */
127
+ getDocumentCount() {
128
+ return this.documents.length;
129
+ }
130
+ }
131
+ //# sourceMappingURL=bm25.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bm25.js","sourceRoot":"","sources":["../../../src/context/bm25.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { WorkspaceIndex, SearchResult } from './types.js';
2
+ export interface SearchOptions {
3
+ k?: number;
4
+ preferTypes?: string[];
5
+ includeContext?: boolean;
6
+ contextLines?: number;
7
+ }
8
+ export declare class CodeSearch {
9
+ private bm25;
10
+ private rootPath;
11
+ private documents;
12
+ constructor(rootPath: string);
13
+ /**
14
+ * Index files for search
15
+ */
16
+ indexFiles(index: WorkspaceIndex): Promise<void>;
17
+ /**
18
+ * Search for code
19
+ */
20
+ search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
21
+ /**
22
+ * Find the best snippet matching the query
23
+ */
24
+ private findBestSnippet;
25
+ /**
26
+ * Search for symbol by name (exact or partial match)
27
+ */
28
+ searchSymbol(symbolName: string): Promise<SearchResult[]>;
29
+ }
30
+ //# sourceMappingURL=code-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-search.d.ts","sourceRoot":"","sources":["../../../src/context/code-search.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAgB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAoC;gBAEzC,QAAQ,EAAE,MAAM;IAK5B;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCtD;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyCjF;;OAEG;IACH,OAAO,CAAC,eAAe;IA8DvB;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAShE"}
@@ -0,0 +1,150 @@
1
+ // Code Search - BM25 based search for code files
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+ import { BM25Search } from './bm25.js';
5
+ export class CodeSearch {
6
+ bm25;
7
+ rootPath;
8
+ documents = new Map();
9
+ constructor(rootPath) {
10
+ this.rootPath = rootPath;
11
+ this.bm25 = new BM25Search({ k1: 1.5, b: 0.75 });
12
+ }
13
+ /**
14
+ * Index files for search
15
+ */
16
+ async indexFiles(index) {
17
+ const documents = [];
18
+ this.documents.clear();
19
+ // Filter to text files only
20
+ const textFiles = index.files.filter(f => !f.isBinary &&
21
+ f.size < 500_000 && // Only index files < 500KB
22
+ (f.language === 'typescript' ||
23
+ f.language === 'javascript' ||
24
+ f.language === 'markdown' ||
25
+ f.language === 'json'));
26
+ // Read and index each file
27
+ for (const file of textFiles) {
28
+ try {
29
+ const fullPath = path.join(this.rootPath, file.path);
30
+ const content = await fs.readFile(fullPath, 'utf-8');
31
+ const doc = {
32
+ id: file.path,
33
+ title: path.basename(file.path),
34
+ content,
35
+ language: file.language,
36
+ size: file.size,
37
+ path: file.path,
38
+ };
39
+ documents.push(doc);
40
+ this.documents.set(file.path, doc);
41
+ }
42
+ catch {
43
+ // Skip files we can't read
44
+ }
45
+ }
46
+ // Build BM25 index
47
+ this.bm25.index(documents);
48
+ }
49
+ /**
50
+ * Search for code
51
+ */
52
+ async search(query, options = {}) {
53
+ const k = options.k ?? 10;
54
+ const preferTypes = new Set(options.preferTypes || []);
55
+ // Search using BM25
56
+ const bm25Results = this.bm25.search(query, k * 2); // Get more initially
57
+ // Apply preferences and convert to SearchResult
58
+ const results = [];
59
+ for (const result of bm25Results) {
60
+ const doc = result.document;
61
+ let score = result.score;
62
+ // Boost score for preferred file types
63
+ if (preferTypes.size > 0) {
64
+ const ext = path.extname(doc.path);
65
+ const lang = doc.language;
66
+ if (preferTypes.has(ext) || preferTypes.has(lang)) {
67
+ score *= 1.5;
68
+ }
69
+ }
70
+ // Find best matching line
71
+ const snippet = this.findBestSnippet(doc.content, query, options);
72
+ results.push({
73
+ path: doc.path,
74
+ score,
75
+ snippet: snippet.text,
76
+ line: snippet.line,
77
+ column: snippet.column,
78
+ });
79
+ }
80
+ // Re-sort by adjusted scores and limit
81
+ return results
82
+ .sort((a, b) => b.score - a.score)
83
+ .slice(0, k);
84
+ }
85
+ /**
86
+ * Find the best snippet matching the query
87
+ */
88
+ findBestSnippet(content, query, options) {
89
+ const lines = content.split('\n');
90
+ const queryLower = query.toLowerCase();
91
+ const queryTokens = queryLower.split(/\s+/);
92
+ let bestLine = 0;
93
+ let bestScore = 0;
94
+ // Find line with most query tokens
95
+ for (let i = 0; i < lines.length; i++) {
96
+ const line = lines[i];
97
+ const lineLower = line.toLowerCase();
98
+ let score = 0;
99
+ for (const token of queryTokens) {
100
+ if (lineLower.includes(token)) {
101
+ score += 1;
102
+ }
103
+ }
104
+ if (score > bestScore) {
105
+ bestScore = score;
106
+ bestLine = i;
107
+ }
108
+ }
109
+ // Extract snippet with context
110
+ const contextLines = options.includeContext ? (options.contextLines ?? 2) : 0;
111
+ const startLine = Math.max(0, bestLine - contextLines);
112
+ const endLine = Math.min(lines.length - 1, bestLine + contextLines);
113
+ const snippetLines = lines.slice(startLine, endLine + 1);
114
+ const snippet = snippetLines
115
+ .map((line, idx) => {
116
+ const lineNum = startLine + idx + 1;
117
+ const marker = lineNum === bestLine + 1 ? '>' : ' ';
118
+ return `${marker} ${lineNum.toString().padStart(4, ' ')} ${line}`;
119
+ })
120
+ .join('\n');
121
+ // Find column position (first occurrence of any query token)
122
+ let column = 0;
123
+ const bestLineLower = lines[bestLine].toLowerCase();
124
+ for (const token of queryTokens) {
125
+ const pos = bestLineLower.indexOf(token);
126
+ if (pos >= 0) {
127
+ column = pos;
128
+ break;
129
+ }
130
+ }
131
+ return {
132
+ text: snippet,
133
+ line: bestLine + 1,
134
+ column,
135
+ };
136
+ }
137
+ /**
138
+ * Search for symbol by name (exact or partial match)
139
+ */
140
+ async searchSymbol(symbolName) {
141
+ // Search for exact symbol name with high weight
142
+ return this.search(`${symbolName} function class interface`, {
143
+ k: 5,
144
+ preferTypes: ['.ts', '.tsx', '.js', '.jsx'],
145
+ includeContext: true,
146
+ contextLines: 3,
147
+ });
148
+ }
149
+ }
150
+ //# sourceMappingURL=code-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-search.js","sourceRoot":"","sources":["../../../src/context/code-search.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAUtD,MAAM,OAAO,UAAU;IACb,IAAI,CAAa;IACjB,QAAQ,CAAS;IACjB,SAAS,GAA0B,IAAI,GAAG,EAAE,CAAC;IAErD,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,KAAqB;QACpC,MAAM,SAAS,GAAe,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAEvB,4BAA4B;QAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACvC,CAAC,CAAC,CAAC,QAAQ;YACX,CAAC,CAAC,IAAI,GAAG,OAAO,IAAI,2BAA2B;YAC/C,CAAC,CAAC,CAAC,QAAQ,KAAK,YAAY;gBAC3B,CAAC,CAAC,QAAQ,KAAK,YAAY;gBAC3B,CAAC,CAAC,QAAQ,KAAK,UAAU;gBACzB,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CACxB,CAAC;QAEF,2BAA2B;QAC3B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAErD,MAAM,GAAG,GAAa;oBACpB,EAAE,EAAE,IAAI,CAAC,IAAI;oBACb,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC/B,OAAO;oBACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC;gBAEF,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,UAAyB,EAAE;QACrD,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAEvD,oBAAoB;QACpB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAqB;QAEzE,gDAAgD;QAChD,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC5B,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAEzB,uCAAuC;YACvC,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACnC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAkB,CAAC;gBACpC,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClD,KAAK,IAAI,GAAG,CAAC;gBACf,CAAC;YACH,CAAC;YAED,0BAA0B;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAElE,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,KAAK;gBACL,OAAO,EAAE,OAAO,CAAC,IAAI;gBACrB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;QACL,CAAC;QAED,uCAAuC;QACvC,OAAO,OAAO;aACX,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,eAAe,CACrB,OAAe,EACf,KAAa,EACb,OAAsB;QAEtB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE5C,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,mCAAmC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAErC,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;gBAChC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC9B,KAAK,IAAI,CAAC,CAAC;gBACb,CAAC;YACH,CAAC;YAED,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;gBACtB,SAAS,GAAG,KAAK,CAAC;gBAClB,QAAQ,GAAG,CAAC,CAAC;YACf,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC,CAAC;QAEpE,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,YAAY;aACzB,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YACjB,MAAM,OAAO,GAAG,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,OAAO,KAAK,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACpD,OAAO,GAAG,MAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACpE,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,6DAA6D;QAC7D,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACpD,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,CAAC;gBACb,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,QAAQ,GAAG,CAAC;YAClB,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,UAAkB;QACnC,gDAAgD;QAChD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,UAAU,2BAA2B,EAAE;YAC3D,CAAC,EAAE,CAAC;YACJ,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;YAC3C,cAAc,EAAE,IAAI;YACpB,YAAY,EAAE,CAAC;SAChB,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import type { ContextPack, WorkspaceIndex, SymbolInfo, DependencyInfo, TestMapping } from './types.js';
2
+ import { CodeSearch } from './code-search.js';
3
+ export interface ContextPackOptions {
4
+ maxFiles?: number;
5
+ maxSymbols?: number;
6
+ includeTests?: boolean;
7
+ includeDependencies?: boolean;
8
+ }
9
+ export declare class ContextPackGenerator {
10
+ private search;
11
+ constructor(search: CodeSearch);
12
+ /**
13
+ * Generate context pack for a goal
14
+ */
15
+ generate(goal: string, index: WorkspaceIndex, symbols: SymbolInfo[], dependencies: DependencyInfo[], testMappings: TestMapping[], options?: ContextPackOptions): Promise<ContextPack>;
16
+ /**
17
+ * Find symbols relevant to the goal
18
+ */
19
+ private findRelevantSymbols;
20
+ /**
21
+ * Generate a summary of the context
22
+ */
23
+ private generateSummary;
24
+ }
25
+ //# sourceMappingURL=context-pack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-pack.d.ts","sourceRoot":"","sources":["../../../src/context/context-pack.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,UAAU,EACV,cAAc,EACd,WAAW,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,UAAU;IAI9B;;OAEG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,UAAU,EAAE,EACrB,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,WAAW,EAAE,EAC3B,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,WAAW,CAAC;IA8CvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuC3B;;OAEG;IACH,OAAO,CAAC,eAAe;CAOxB"}
@@ -0,0 +1,92 @@
1
+ export class ContextPackGenerator {
2
+ search;
3
+ constructor(search) {
4
+ this.search = search;
5
+ }
6
+ /**
7
+ * Generate context pack for a goal
8
+ */
9
+ async generate(goal, index, symbols, dependencies, testMappings, options = {}) {
10
+ const maxFiles = options.maxFiles ?? 8;
11
+ const maxSymbols = options.maxSymbols ?? 20;
12
+ const normalizedGoal = (goal || '').toString();
13
+ const searchQuery = normalizedGoal.trim().length > 0
14
+ ? normalizedGoal
15
+ : 'workspace overview';
16
+ // Search for relevant files
17
+ const searchResults = await this.search.search(searchQuery, {
18
+ k: maxFiles,
19
+ includeContext: true,
20
+ contextLines: 2,
21
+ });
22
+ // Extract relevant symbols (top matching symbols)
23
+ const relevantSymbols = this.findRelevantSymbols(normalizedGoal, symbols, maxSymbols);
24
+ // Filter dependencies if requested
25
+ const relevantDeps = options.includeDependencies
26
+ ? dependencies.slice(0, 20) // Top 20 deps
27
+ : [];
28
+ // Extract test files if requested
29
+ const testFiles = options.includeTests
30
+ ? testMappings.map(m => m.testFile)
31
+ : [];
32
+ // Build context pack
33
+ const pack = {
34
+ goal: normalizedGoal,
35
+ files: searchResults.map(r => ({
36
+ path: r.path,
37
+ snippet: r.snippet,
38
+ relevance: r.score,
39
+ })),
40
+ symbols: relevantSymbols,
41
+ dependencies: relevantDeps,
42
+ testFiles,
43
+ summary: this.generateSummary(index, searchResults.length, relevantSymbols.length),
44
+ generatedAt: new Date().toISOString(),
45
+ };
46
+ return pack;
47
+ }
48
+ /**
49
+ * Find symbols relevant to the goal
50
+ */
51
+ findRelevantSymbols(goal, symbols, limit) {
52
+ const goalLower = (goal || '').toLowerCase();
53
+ const tokens = goalLower.split(/\s+/).filter(Boolean);
54
+ if (tokens.length === 0) {
55
+ return [];
56
+ }
57
+ // Score symbols by relevance
58
+ const scored = symbols.map(symbol => {
59
+ let score = 0;
60
+ const nameLower = symbol.name.toLowerCase();
61
+ // Exact match
62
+ if (tokens.some(t => nameLower === t)) {
63
+ score += 10;
64
+ }
65
+ // Partial match
66
+ if (tokens.some(t => nameLower.includes(t) || t.includes(nameLower))) {
67
+ score += 5;
68
+ }
69
+ // Boost exported symbols
70
+ if (symbol.kind === 'function' || symbol.kind === 'class') {
71
+ score += 2;
72
+ }
73
+ return { symbol, score };
74
+ });
75
+ // Sort by score and return top symbols
76
+ return scored
77
+ .filter(s => s.score > 0)
78
+ .sort((a, b) => b.score - a.score)
79
+ .slice(0, limit)
80
+ .map(s => s.symbol);
81
+ }
82
+ /**
83
+ * Generate a summary of the context
84
+ */
85
+ generateSummary(index, fileCount, symbolCount) {
86
+ const totalFiles = index.totalFiles;
87
+ const totalSize = (index.totalSize / 1024 / 1024).toFixed(2);
88
+ return `Workspace: ${totalFiles} files, ${totalSize}MB. ` +
89
+ `Context: ${fileCount} relevant files, ${symbolCount} symbols.`;
90
+ }
91
+ }
92
+ //# sourceMappingURL=context-pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-pack.js","sourceRoot":"","sources":["../../../src/context/context-pack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { DependencyInfo, WorkspaceIndex } from './types.js';
2
+ export declare class DependencyMapper {
3
+ private rootPath;
4
+ constructor(rootPath: string);
5
+ /**
6
+ * Extract dependencies from package.json files
7
+ */
8
+ extractDependencies(index: WorkspaceIndex): Promise<DependencyInfo[]>;
9
+ }
10
+ //# sourceMappingURL=dependency-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-mapper.d.ts","sourceRoot":"","sources":["../../../src/context/dependency-mapper.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAI5B;;OAEG;IACG,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAwD5E"}
@@ -0,0 +1,62 @@
1
+ // Dependency Mapper - Parse and analyze dependencies
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+ export class DependencyMapper {
5
+ rootPath;
6
+ constructor(rootPath) {
7
+ this.rootPath = rootPath;
8
+ }
9
+ /**
10
+ * Extract dependencies from package.json files
11
+ */
12
+ async extractDependencies(index) {
13
+ const dependencies = [];
14
+ // Find all package.json files
15
+ const packageFiles = index.files.filter(f => path.basename(f.path) === 'package.json');
16
+ for (const file of packageFiles) {
17
+ try {
18
+ const fullPath = path.join(this.rootPath, file.path);
19
+ const content = await fs.readFile(fullPath, 'utf-8');
20
+ const pkg = JSON.parse(content);
21
+ // Extract dependencies
22
+ if (pkg.dependencies) {
23
+ for (const [name, version] of Object.entries(pkg.dependencies)) {
24
+ dependencies.push({
25
+ name,
26
+ version: version,
27
+ type: 'dependency',
28
+ packageJsonPath: file.path,
29
+ });
30
+ }
31
+ }
32
+ // Extract devDependencies
33
+ if (pkg.devDependencies) {
34
+ for (const [name, version] of Object.entries(pkg.devDependencies)) {
35
+ dependencies.push({
36
+ name,
37
+ version: version,
38
+ type: 'devDependency',
39
+ packageJsonPath: file.path,
40
+ });
41
+ }
42
+ }
43
+ // Extract peerDependencies
44
+ if (pkg.peerDependencies) {
45
+ for (const [name, version] of Object.entries(pkg.peerDependencies)) {
46
+ dependencies.push({
47
+ name,
48
+ version: version,
49
+ type: 'peerDependency',
50
+ packageJsonPath: file.path,
51
+ });
52
+ }
53
+ }
54
+ }
55
+ catch {
56
+ // Skip invalid package.json files
57
+ }
58
+ }
59
+ return dependencies;
60
+ }
61
+ }
62
+ //# sourceMappingURL=dependency-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-mapper.js","sourceRoot":"","sources":["../../../src/context/dependency-mapper.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,MAAM,OAAO,gBAAgB;IACnB,QAAQ,CAAS;IAEzB,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,KAAqB;QAC7C,MAAM,YAAY,GAAqB,EAAE,CAAC;QAE1C,8BAA8B;QAC9B,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC1C,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,cAAc,CACzC,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACrD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAEhC,uBAAuB;gBACvB,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;oBACrB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;wBAC/D,YAAY,CAAC,IAAI,CAAC;4BAChB,IAAI;4BACJ,OAAO,EAAE,OAAiB;4BAC1B,IAAI,EAAE,YAAY;4BAClB,eAAe,EAAE,IAAI,CAAC,IAAI;yBAC3B,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,0BAA0B;gBAC1B,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;oBACxB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;wBAClE,YAAY,CAAC,IAAI,CAAC;4BAChB,IAAI;4BACJ,OAAO,EAAE,OAAiB;4BAC1B,IAAI,EAAE,eAAe;4BACrB,eAAe,EAAE,IAAI,CAAC,IAAI;yBAC3B,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,2BAA2B;gBAC3B,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;oBACzB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBACnE,YAAY,CAAC,IAAI,CAAC;4BAChB,IAAI;4BACJ,OAAO,EAAE,OAAiB;4BAC1B,IAAI,EAAE,gBAAgB;4BACtB,eAAe,EAAE,IAAI,CAAC,IAAI;yBAC3B,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,kCAAkC;YACpC,CAAC;QACH,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ export * from './workspace-indexer.js';
2
+ export * from './symbol-extractor.js';
3
+ export * from './dependency-mapper.js';
4
+ export * from './test-mapper.js';
5
+ export * from './code-search.js';
6
+ export * from './context-pack.js';
7
+ export * from './types.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/context/index.ts"],"names":[],"mappings":"AACA,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ // Context Engine - Intelligent repository understanding
2
+ export * from './workspace-indexer.js';
3
+ export * from './symbol-extractor.js';
4
+ export * from './dependency-mapper.js';
5
+ export * from './test-mapper.js';
6
+ export * from './code-search.js';
7
+ export * from './context-pack.js';
8
+ export * from './types.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/context/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { SymbolInfo, WorkspaceIndex } from './types.js';
2
+ /**
3
+ * Simple symbol extractor using regex patterns
4
+ * For production use, consider ts-morph or @typescript/vfs
5
+ */
6
+ export declare class SymbolExtractor {
7
+ private rootPath;
8
+ constructor(rootPath: string);
9
+ /**
10
+ * Extract symbols from indexed files
11
+ */
12
+ extractSymbols(index: WorkspaceIndex): Promise<SymbolInfo[]>;
13
+ /**
14
+ * Parse symbols from file content using regex
15
+ */
16
+ private parseSymbols;
17
+ /**
18
+ * Find symbol definition by name
19
+ */
20
+ static findSymbol(symbols: SymbolInfo[], name: string): SymbolInfo[];
21
+ /**
22
+ * Get symbols by kind
23
+ */
24
+ static filterByKind(symbols: SymbolInfo[], kinds: SymbolInfo['kind'][]): SymbolInfo[];
25
+ }
26
+ //# sourceMappingURL=symbol-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-extractor.d.ts","sourceRoot":"","sources":["../../../src/context/symbol-extractor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7D;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAI5B;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAwBlE;;OAEG;IACH,OAAO,CAAC,YAAY;IAsFpB;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE;IAMpE;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,UAAU,EAAE;CAItF"}