codestrate 0.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 (120) hide show
  1. package/README.md +154 -0
  2. package/dist/constants.d.ts +40 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +145 -0
  5. package/dist/constants.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +134 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/schemas/index.d.ts +260 -0
  11. package/dist/schemas/index.d.ts.map +1 -0
  12. package/dist/schemas/index.js +173 -0
  13. package/dist/schemas/index.js.map +1 -0
  14. package/dist/security/guard.d.ts +18 -0
  15. package/dist/security/guard.d.ts.map +1 -0
  16. package/dist/security/guard.js +39 -0
  17. package/dist/security/guard.js.map +1 -0
  18. package/dist/services/code-searcher.d.ts +22 -0
  19. package/dist/services/code-searcher.d.ts.map +1 -0
  20. package/dist/services/code-searcher.js +171 -0
  21. package/dist/services/code-searcher.js.map +1 -0
  22. package/dist/services/context-builder.d.ts +22 -0
  23. package/dist/services/context-builder.d.ts.map +1 -0
  24. package/dist/services/context-builder.js +232 -0
  25. package/dist/services/context-builder.js.map +1 -0
  26. package/dist/services/memory-store.d.ts +31 -0
  27. package/dist/services/memory-store.d.ts.map +1 -0
  28. package/dist/services/memory-store.js +27 -0
  29. package/dist/services/memory-store.js.map +1 -0
  30. package/dist/services/repository-parser.d.ts +8 -0
  31. package/dist/services/repository-parser.d.ts.map +1 -0
  32. package/dist/services/repository-parser.js +255 -0
  33. package/dist/services/repository-parser.js.map +1 -0
  34. package/dist/services/symbol-indexer.d.ts +16 -0
  35. package/dist/services/symbol-indexer.d.ts.map +1 -0
  36. package/dist/services/symbol-indexer.js +417 -0
  37. package/dist/services/symbol-indexer.js.map +1 -0
  38. package/dist/services/tree-sitter.d.ts +22 -0
  39. package/dist/services/tree-sitter.d.ts.map +1 -0
  40. package/dist/services/tree-sitter.js +269 -0
  41. package/dist/services/tree-sitter.js.map +1 -0
  42. package/dist/services/validation-runner.d.ts +30 -0
  43. package/dist/services/validation-runner.d.ts.map +1 -0
  44. package/dist/services/validation-runner.js +159 -0
  45. package/dist/services/validation-runner.js.map +1 -0
  46. package/dist/store/index.d.ts +23 -0
  47. package/dist/store/index.d.ts.map +1 -0
  48. package/dist/store/index.js +93 -0
  49. package/dist/store/index.js.map +1 -0
  50. package/dist/store/interface.d.ts +73 -0
  51. package/dist/store/interface.d.ts.map +1 -0
  52. package/dist/store/interface.js +9 -0
  53. package/dist/store/interface.js.map +1 -0
  54. package/dist/store/memory.d.ts +21 -0
  55. package/dist/store/memory.d.ts.map +1 -0
  56. package/dist/store/memory.js +157 -0
  57. package/dist/store/memory.js.map +1 -0
  58. package/dist/store/sqlite.d.ts +95 -0
  59. package/dist/store/sqlite.d.ts.map +1 -0
  60. package/dist/store/sqlite.js +1018 -0
  61. package/dist/store/sqlite.js.map +1 -0
  62. package/dist/tools/analyze-impact.d.ts +3 -0
  63. package/dist/tools/analyze-impact.d.ts.map +1 -0
  64. package/dist/tools/analyze-impact.js +110 -0
  65. package/dist/tools/analyze-impact.js.map +1 -0
  66. package/dist/tools/explore.d.ts +3 -0
  67. package/dist/tools/explore.d.ts.map +1 -0
  68. package/dist/tools/explore.js +96 -0
  69. package/dist/tools/explore.js.map +1 -0
  70. package/dist/tools/get-context.d.ts +3 -0
  71. package/dist/tools/get-context.d.ts.map +1 -0
  72. package/dist/tools/get-context.js +82 -0
  73. package/dist/tools/get-context.js.map +1 -0
  74. package/dist/tools/inspect-symbol.d.ts +3 -0
  75. package/dist/tools/inspect-symbol.d.ts.map +1 -0
  76. package/dist/tools/inspect-symbol.js +146 -0
  77. package/dist/tools/inspect-symbol.js.map +1 -0
  78. package/dist/tools/recall-experience.d.ts +3 -0
  79. package/dist/tools/recall-experience.d.ts.map +1 -0
  80. package/dist/tools/recall-experience.js +141 -0
  81. package/dist/tools/recall-experience.js.map +1 -0
  82. package/dist/tools/record-experience.d.ts +6 -0
  83. package/dist/tools/record-experience.d.ts.map +1 -0
  84. package/dist/tools/record-experience.js +68 -0
  85. package/dist/tools/record-experience.js.map +1 -0
  86. package/dist/tools/reindex.d.ts +8 -0
  87. package/dist/tools/reindex.d.ts.map +1 -0
  88. package/dist/tools/reindex.js +74 -0
  89. package/dist/tools/reindex.js.map +1 -0
  90. package/dist/tools/repo-overview.d.ts +7 -0
  91. package/dist/tools/repo-overview.d.ts.map +1 -0
  92. package/dist/tools/repo-overview.js +102 -0
  93. package/dist/tools/repo-overview.js.map +1 -0
  94. package/dist/tools/run-validation.d.ts +6 -0
  95. package/dist/tools/run-validation.d.ts.map +1 -0
  96. package/dist/tools/run-validation.js +115 -0
  97. package/dist/tools/run-validation.js.map +1 -0
  98. package/dist/tools/search-code.d.ts +3 -0
  99. package/dist/tools/search-code.d.ts.map +1 -0
  100. package/dist/tools/search-code.js +98 -0
  101. package/dist/tools/search-code.js.map +1 -0
  102. package/dist/tools/search-history.d.ts +6 -0
  103. package/dist/tools/search-history.d.ts.map +1 -0
  104. package/dist/tools/search-history.js +69 -0
  105. package/dist/tools/search-history.js.map +1 -0
  106. package/dist/tools/status.d.ts +7 -0
  107. package/dist/tools/status.d.ts.map +1 -0
  108. package/dist/tools/status.js +98 -0
  109. package/dist/tools/status.js.map +1 -0
  110. package/dist/tools/trace-flow.d.ts +3 -0
  111. package/dist/tools/trace-flow.d.ts.map +1 -0
  112. package/dist/tools/trace-flow.js +155 -0
  113. package/dist/tools/trace-flow.js.map +1 -0
  114. package/dist/types.d.ts +182 -0
  115. package/dist/types.d.ts.map +1 -0
  116. package/dist/types.js +17 -0
  117. package/dist/types.js.map +1 -0
  118. package/grammars/tree-sitter-python.wasm +0 -0
  119. package/grammars/tree-sitter-typescript.wasm +0 -0
  120. package/package.json +48 -0
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Code Searcher — hybrid search combining ripgrep text search with symbol matching.
3
+ *
4
+ * - Text search: execs `rg --json` with configurable scope/languages
5
+ * - Symbol matching: checks results against indexed symbols for score boost
6
+ * - BM25-like scoring: ranks by term frequency proximity and match type
7
+ *
8
+ * Embedding search is available as an opt-in mode via config (not in MVP).
9
+ */
10
+ import { execSync } from "child_process";
11
+ import { resolve } from "path";
12
+ import { LANGUAGE_EXTENSIONS } from "../constants.js";
13
+ import { findSymbols } from "../store/index.js";
14
+ /**
15
+ * Execute hybrid search: ripgrep text search BM25-scored, with symbol matching boost.
16
+ */
17
+ export async function searchCode(opts) {
18
+ const repoPath = resolve(opts.repoPath);
19
+ // Build rg args
20
+ const args = buildRipgrepArgs(opts);
21
+ let rawOutput;
22
+ try {
23
+ rawOutput = execSync(args.join(" "), {
24
+ cwd: repoPath,
25
+ encoding: "utf-8",
26
+ maxBuffer: 10 * 1024 * 1024,
27
+ stdio: ["ignore", "pipe", "pipe"],
28
+ timeout: 30_000,
29
+ });
30
+ }
31
+ catch (error) {
32
+ // rg exits with code 1 when no matches; code 2 = error
33
+ if (typeof error === 'object' && error !== null && 'status' in error && error.status === 1) {
34
+ return { results: [], total: 0 };
35
+ }
36
+ const message = error instanceof Error ? error.message : String(error);
37
+ const stderr = typeof error === 'object' && error !== null && 'stderr' in error
38
+ ? String(error.stderr) : '';
39
+ throw new Error(`ripgrep search failed: ${stderr || message}`);
40
+ }
41
+ // Parse JSON output
42
+ const lines = rawOutput.trim().split("\n").filter(Boolean);
43
+ const matches = [];
44
+ for (const line of lines) {
45
+ try {
46
+ const entry = JSON.parse(line);
47
+ if (entry.type === "match") {
48
+ matches.push(entry);
49
+ }
50
+ }
51
+ catch {
52
+ // skip unparseable lines
53
+ }
54
+ }
55
+ // Score and deduplicate results
56
+ const scored = scoreResults(matches, opts.query, repoPath);
57
+ // Apply pagination
58
+ const total = scored.length;
59
+ const paged = scored.slice(opts.offset, opts.offset + opts.maxResults);
60
+ return { results: paged, total };
61
+ }
62
+ function buildRipgrepArgs(opts) {
63
+ const args = ["rg", "--json", "-i", "--no-heading", "--color", "never"];
64
+ // Quote the query for shell safety
65
+ args.push("--fixed-strings");
66
+ args.push(opts.query);
67
+ // Language filtering
68
+ if (opts.languages && opts.languages.length > 0) {
69
+ const exts = [];
70
+ for (const lang of opts.languages) {
71
+ const langExts = LANGUAGE_EXTENSIONS[lang];
72
+ if (langExts) {
73
+ exts.push(...langExts.map(e => `-g*.${e.slice(1)}`));
74
+ }
75
+ }
76
+ // Filter by type: use glob includes
77
+ const typeGlobs = opts.languages.flatMap(lang => {
78
+ const exts = LANGUAGE_EXTENSIONS[lang];
79
+ return exts ? exts.map(e => `*.${e.slice(1)}`) : [];
80
+ });
81
+ for (const g of typeGlobs) {
82
+ args.push("-g", g);
83
+ }
84
+ }
85
+ // Scope
86
+ if (opts.scope) {
87
+ args.push("-g", `${opts.scope}/**`);
88
+ }
89
+ // Exclude dirs
90
+ args.push("-g", "!node_modules/**", "-g", "!dist/**", "-g", "!target/**", "-g", "!.git/**");
91
+ // Path
92
+ args.push(".");
93
+ return args;
94
+ }
95
+ function scoreResults(matches, query, repoPath) {
96
+ const scored = [];
97
+ const seen = new Set();
98
+ // Preload indexed symbols for boost
99
+ const indexSymbols = findSymbols(query);
100
+ for (const match of matches) {
101
+ const filePath = match.data.path.text;
102
+ const lineNum = match.data.line_number;
103
+ const lineText = match.data.lines.text.trim();
104
+ const context = lineText.substring(0, 200);
105
+ const key = `${filePath}:${lineNum}`;
106
+ if (seen.has(key))
107
+ continue;
108
+ seen.add(key);
109
+ // Score calculation (BM25-like)
110
+ const queryTerms = query.toLowerCase().split(/\s+/);
111
+ const lineLower = lineText.toLowerCase();
112
+ let score = 0;
113
+ // Term frequency component
114
+ for (const term of queryTerms) {
115
+ const count = (lineLower.match(new RegExp(term.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || []).length;
116
+ // BM25-like: tf / (tf + k1*(1-b + b*avgDocLen/docLen))
117
+ // Simplified: count / (count + 1.2)
118
+ score += count / (count + 1.2);
119
+ }
120
+ // Proximity bonus: terms close together = higher score
121
+ for (let i = 0; i < queryTerms.length - 1; i++) {
122
+ const firstIdx = lineLower.indexOf(queryTerms[i]);
123
+ const secondIdx = lineLower.indexOf(queryTerms[i + 1], firstIdx + queryTerms[i].length);
124
+ if (firstIdx >= 0 && secondIdx >= 0) {
125
+ const distance = secondIdx - (firstIdx + queryTerms[i].length);
126
+ score += Math.max(0, 1 - distance / 100);
127
+ }
128
+ }
129
+ // Normalize score to 0-1 range
130
+ score = Math.min(1, score / Math.max(1, queryTerms.length));
131
+ // Determine match type and boost
132
+ let matchType = "text";
133
+ if (indexSymbols.some(s => s.file === filePath && s.name.toLowerCase().includes(query.toLowerCase()))) {
134
+ matchType = "symbol";
135
+ score = Math.min(1, score + 0.3); // boost for symbol matches
136
+ }
137
+ // File name match boost
138
+ if (filePath.toLowerCase().includes(query.toLowerCase())) {
139
+ matchType = "filename";
140
+ score = Math.min(1, score + 0.4);
141
+ }
142
+ // Find matching symbol name
143
+ const matchedSymbol = indexSymbols.find(s => s.file === filePath && s.signature.toLowerCase().includes(query.toLowerCase()));
144
+ scored.push({
145
+ file: filePath,
146
+ line: lineNum,
147
+ column: match.data.submatches[0]?.start ?? 0,
148
+ context,
149
+ symbol: matchedSymbol?.name ?? null,
150
+ score,
151
+ matchType,
152
+ });
153
+ }
154
+ // Sort by score desc
155
+ scored.sort((a, b) => b.score - a.score);
156
+ return scored;
157
+ }
158
+ /**
159
+ * Simple BM25 text search without ripgrep (fallback for repos without rg).
160
+ */
161
+ export function simpleTextSearch(text, query) {
162
+ const queryTerms = query.toLowerCase().split(/\s+/).filter(Boolean);
163
+ const textLower = text.toLowerCase();
164
+ let score = 0;
165
+ for (const term of queryTerms) {
166
+ const count = (textLower.match(new RegExp(term.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || []).length;
167
+ score += count / (count + 1.2);
168
+ }
169
+ return score / Math.max(1, queryTerms.length);
170
+ }
171
+ //# sourceMappingURL=code-searcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-searcher.js","sourceRoot":"","sources":["../../src/services/code-searcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ContextBundle } from "../types.js";
2
+ interface BuildOptions {
3
+ task: string;
4
+ tokenBudget: number;
5
+ includeHistory: boolean;
6
+ includeMemory: boolean;
7
+ repoPath: string;
8
+ }
9
+ /**
10
+ * Build a context bundle for a given task.
11
+ *
12
+ * Pipeline:
13
+ * 1. Classify task → extract key terms
14
+ * 2. Search code for relevant files/symbols
15
+ * 3. Inspect top symbols → get definitions + relations
16
+ * 4. Search git history for related commits
17
+ * 5. Recall experiences for similar past fixes
18
+ * 6. Assemble within token budget
19
+ */
20
+ export declare function buildContext(opts: BuildOptions): Promise<ContextBundle>;
21
+ export {};
22
+ //# sourceMappingURL=context-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../src/services/context-builder.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAgC,MAAM,aAAa,CAAC;AAI/E,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAOD;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CA+K7E"}
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Context Builder — assembles optimal context bundles from search results.
3
+ *
4
+ * Takes a task description, retrieves relevant symbols/files/history/memory,
5
+ * and assembles them within a token budget.
6
+ */
7
+ import { searchCode } from "./code-searcher.js";
8
+ import { findSymbol, findCallers, findRelatedTests, getIndex } from "../store/index.js";
9
+ import { hybridRecall } from "./memory-store.js";
10
+ import { searchGitHistory } from "./validation-runner.js";
11
+ import { join } from "path";
12
+ import { readFileSync } from "fs";
13
+ // Rough token estimation (characters / 4)
14
+ function estimateTokens(text) {
15
+ return Math.ceil(text.length / 4);
16
+ }
17
+ /**
18
+ * Build a context bundle for a given task.
19
+ *
20
+ * Pipeline:
21
+ * 1. Classify task → extract key terms
22
+ * 2. Search code for relevant files/symbols
23
+ * 3. Inspect top symbols → get definitions + relations
24
+ * 4. Search git history for related commits
25
+ * 5. Recall experiences for similar past fixes
26
+ * 6. Assemble within token budget
27
+ */
28
+ export async function buildContext(opts) {
29
+ const items = [];
30
+ let totalTokens = 0;
31
+ const remaining = () => opts.tokenBudget - totalTokens;
32
+ const budgetTable = [
33
+ { key: "repoMap", label: "Repository Overview", max: 1000 },
34
+ { key: "symbol", label: "Symbol Definitions", max: 6000 },
35
+ { key: "history", label: "Git History", max: 3000 },
36
+ { key: "memory", label: "Past Experiences", max: 2000 },
37
+ { key: "rule", label: "Project Rules", max: 1000 },
38
+ ];
39
+ // Step 1: Task analysis — extract key terms
40
+ const terms = extractKeyTerms(opts.task);
41
+ const searchQuery = terms.join(" ");
42
+ // Step 2: Repository overview (always include, cheap)
43
+ const index = getIndex();
44
+ if (index.snapshot) {
45
+ const overviewLines = [
46
+ `# Repository: ${index.snapshot.path}`,
47
+ `Branch: ${index.snapshot.branch} Commit: ${index.snapshot.commitSha}`,
48
+ `Build system: ${index.snapshot.buildSystem || "unknown"}`,
49
+ `Frameworks: ${index.snapshot.frameworks.join(", ") || "none detected"}`,
50
+ `Entry points: ${index.snapshot.entryPoints.join(", ") || "none detected"}`,
51
+ `Total files: ${index.snapshot.files.length}`,
52
+ `Symbols indexed: ${index.symbols.length}`,
53
+ ].join("\n");
54
+ const item = {
55
+ type: "repo_map",
56
+ label: "Repository Overview",
57
+ content: overviewLines,
58
+ tokens: estimateTokens(overviewLines),
59
+ relevance: 1.0,
60
+ };
61
+ if (totalTokens + item.tokens <= budgetTable[0].max) {
62
+ items.push(item);
63
+ totalTokens += item.tokens;
64
+ }
65
+ }
66
+ // Step 3: Search code for relevant symbols
67
+ if (remaining() > 2000 && terms.length > 0) {
68
+ try {
69
+ const searchResults = await searchCode({
70
+ query: searchQuery,
71
+ maxResults: 10,
72
+ offset: 0,
73
+ repoPath: opts.repoPath,
74
+ });
75
+ for (const result of searchResults.results.slice(0, 5)) {
76
+ if (remaining() < 500)
77
+ break;
78
+ const symbol = findSymbol(result.symbol || "");
79
+ if (symbol) {
80
+ let content = `## ${symbol.name} (${symbol.kind})\n`;
81
+ content += `File: \`${symbol.file}\`:${symbol.line}\n`;
82
+ content += `Signature: \`${symbol.signature}\`\n\n`;
83
+ if (symbol.calls.length > 0) {
84
+ content += `**Calls:** ${symbol.calls.slice(0, 10).join(", ")}\n`;
85
+ }
86
+ const callers = findCallers(symbol.name);
87
+ if (callers.length > 0) {
88
+ content += `**Called by:** ${callers.slice(0, 10).map(c => c.source).join(", ")}\n`;
89
+ }
90
+ const tests = findRelatedTests(symbol.file);
91
+ if (tests.length > 0) {
92
+ content += `**Related tests:** ${tests.slice(0, 5).join(", ")}\n`;
93
+ }
94
+ // Add code definition if within budget
95
+ if (remaining() > 1000) {
96
+ const defContent = getSymbolDefinition(symbol.file, opts.repoPath, symbol.line);
97
+ if (defContent) {
98
+ content += `\n\`\`\`\n${defContent}\n\`\`\`\n`;
99
+ }
100
+ }
101
+ const itemTokens = estimateTokens(content);
102
+ items.push({
103
+ type: "symbol",
104
+ label: `${symbol.name} (${symbol.kind})`,
105
+ content,
106
+ tokens: itemTokens,
107
+ relevance: result.score,
108
+ });
109
+ totalTokens += itemTokens;
110
+ }
111
+ }
112
+ }
113
+ catch {
114
+ // search failure isn't fatal
115
+ }
116
+ }
117
+ // Step 4: Git history
118
+ if (opts.includeHistory && remaining() > 1000) {
119
+ try {
120
+ const historyResults = searchGitHistory(opts.repoPath, searchQuery, 5);
121
+ if (historyResults.length > 0) {
122
+ const lines = ["## Related Git History\n"];
123
+ for (const h of historyResults) {
124
+ lines.push(`- **${h.commit.substring(0, 8)}** (${h.date}): ${h.message}`);
125
+ if (h.files.length > 0) {
126
+ lines.push(` Files: ${h.files.slice(0, 5).join(", ")}`);
127
+ }
128
+ }
129
+ const content = lines.join("\n");
130
+ const itemTokens = estimateTokens(content);
131
+ items.push({
132
+ type: "history",
133
+ label: "Related Commits",
134
+ content,
135
+ tokens: itemTokens,
136
+ relevance: 0.7,
137
+ });
138
+ totalTokens += itemTokens;
139
+ }
140
+ }
141
+ catch {
142
+ // history search failure isn't fatal
143
+ }
144
+ }
145
+ // Step 5: Memory recall
146
+ if (opts.includeMemory && remaining() > 1000) {
147
+ try {
148
+ const memories = hybridRecall(searchQuery, index.repoFingerprint, 3);
149
+ if (memories.length > 0) {
150
+ const lines = ["## Past Experiences\n"];
151
+ for (const m of memories) {
152
+ if ("evidence" in m && m.evidence) {
153
+ lines.push(`### ${m.task}`);
154
+ lines.push(`**Diagnosis:** ${m.diagnosis.substring(0, 200)}`);
155
+ lines.push(`**Solution:** ${m.solution.substring(0, 200)}`);
156
+ lines.push(`**Quality:** ${(m.quality * 100).toFixed(0)}%`);
157
+ if (m.evidence.buildPassed)
158
+ lines.push("✅ Build passed");
159
+ if (m.evidence.testsPassed)
160
+ lines.push("✅ Tests passed");
161
+ lines.push(`**Commit:** ${m.commit.substring(0, 8)}`);
162
+ }
163
+ else if ("content" in m) {
164
+ lines.push(`- **${m.content.substring(0, 100)}** (${m.type})`);
165
+ }
166
+ lines.push("");
167
+ }
168
+ const content = lines.join("\n");
169
+ const itemTokens = estimateTokens(content);
170
+ items.push({
171
+ type: "memory",
172
+ label: "Past Experiences",
173
+ content,
174
+ tokens: itemTokens,
175
+ relevance: 0.8,
176
+ });
177
+ totalTokens += itemTokens;
178
+ }
179
+ }
180
+ catch {
181
+ // memory recall failure isn't fatal
182
+ }
183
+ }
184
+ // Summary
185
+ const summaryLines = [
186
+ `Assembled ${items.length} context items using ${totalTokens} / ${opts.tokenBudget} tokens.`,
187
+ items.map(i => `- ${i.type}: "${i.label}" (${i.tokens} tokens, relevance ${(i.relevance * 100).toFixed(0)}%)`).join("\n"),
188
+ ];
189
+ return {
190
+ task: opts.task,
191
+ summary: summaryLines.join("\n"),
192
+ items,
193
+ totalTokens,
194
+ hasMore: totalTokens >= opts.tokenBudget,
195
+ };
196
+ }
197
+ function extractKeyTerms(task) {
198
+ // Simple extraction: remove common words, split by space/camelCase/snake_case
199
+ const stopWords = new Set([
200
+ "the", "a", "an", "in", "on", "at", "to", "for", "of", "with", "and", "or",
201
+ "is", "are", "was", "were", "be", "been", "being", "have", "has", "had",
202
+ "do", "does", "did", "will", "would", "could", "should", "may", "might",
203
+ "fix", "add", "change", "update", "remove", "implement", "refactor",
204
+ "this", "that", "these", "those", "it", "its", "i", "we", "you", "they",
205
+ "need", "needs", "make", "makes", "getting", "get", "gets", "got",
206
+ ]);
207
+ const words = task
208
+ // Split camelCase and snake_case
209
+ .replace(/([a-z])([A-Z])/g, "$1 $2")
210
+ .replace(/[_-]/g, " ")
211
+ // Remove punctuation
212
+ .replace(/[^\w\s]/g, " ")
213
+ .toLowerCase()
214
+ .split(/\s+/)
215
+ .filter(w => w.length > 2 && !stopWords.has(w));
216
+ // Deduplicate
217
+ return [...new Set(words)].slice(0, 20);
218
+ }
219
+ function getSymbolDefinition(file, repoPath, line, contextLines = 10) {
220
+ try {
221
+ const fullPath = join(repoPath, file);
222
+ const content = readFileSync(fullPath, "utf-8");
223
+ const lines = content.split("\n");
224
+ const start = Math.max(0, line - 1 - contextLines);
225
+ const end = Math.min(lines.length, line + contextLines);
226
+ return lines.slice(start, end).map((l, i) => `${start + i + 1}: ${l}`).join("\n");
227
+ }
228
+ catch {
229
+ return null;
230
+ }
231
+ }
232
+ //# sourceMappingURL=context-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../src/services/context-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Memory Store Service — business logic for memory/experience management.
3
+ * Delegates persistence to store/memory.ts, adds validation and quality scoring.
4
+ */
5
+ import { searchExperiences, searchMemories, recallAll, loadMemoryStore, saveMemoryStore } from "../store/memory.js";
6
+ import type { Experience, ExperienceEvidence, Memory, MemoryType } from "../types.js";
7
+ export { loadMemoryStore, saveMemoryStore, searchExperiences, searchMemories, recallAll };
8
+ /**
9
+ * Store a verified experience. Only accepts with complete evidence.
10
+ */
11
+ export declare function storeExperience(input: {
12
+ task: string;
13
+ diagnosis: string;
14
+ solution: string;
15
+ changedFiles: string[];
16
+ commit: string;
17
+ failedAttempts: string[];
18
+ }, evidence: ExperienceEvidence, repoFingerprint: string): {
19
+ id: string;
20
+ quality: number;
21
+ };
22
+ /**
23
+ * Store unvalidated knowledge (semantic, procedural, negative).
24
+ */
25
+ export declare function storeKnowledge(type: MemoryType, content: string, symbols: string[], files: string[], commit: string | null, repo: string): Memory;
26
+ /**
27
+ * Hybrid recall combining experiences and memories.
28
+ */
29
+ export declare function hybridRecall(query: string, repo?: string, topK?: number, types?: MemoryType[]): (Experience | Memory)[];
30
+ export { getExperience } from "../store/memory.js";
31
+ //# sourceMappingURL=memory-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../src/services/memory-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAEL,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,eAAe,EACf,eAAe,EAEhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEtF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;AAE1F;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE;IACL,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,EACD,QAAQ,EAAE,kBAAkB,EAC5B,eAAe,EAAE,MAAM,GACtB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAGjC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,EAAE,MAAM,GACX,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,GAAE,MAAU,EAChB,KAAK,CAAC,EAAE,UAAU,EAAE,GACnB,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,CAEzB;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Memory Store Service — business logic for memory/experience management.
3
+ * Delegates persistence to store/memory.ts, adds validation and quality scoring.
4
+ */
5
+ import { addExperience as storeAddExperience, searchExperiences, searchMemories, recallAll, loadMemoryStore, saveMemoryStore, addMemory as storeAddMemory, } from "../store/memory.js";
6
+ export { loadMemoryStore, saveMemoryStore, searchExperiences, searchMemories, recallAll };
7
+ /**
8
+ * Store a verified experience. Only accepts with complete evidence.
9
+ */
10
+ export function storeExperience(input, evidence, repoFingerprint) {
11
+ const exp = storeAddExperience(input, evidence, repoFingerprint);
12
+ return { id: exp.id, quality: exp.quality };
13
+ }
14
+ /**
15
+ * Store unvalidated knowledge (semantic, procedural, negative).
16
+ */
17
+ export function storeKnowledge(type, content, symbols, files, commit, repo) {
18
+ return storeAddMemory({ type, content, symbols, files, commit, repo, source: "manual" });
19
+ }
20
+ /**
21
+ * Hybrid recall combining experiences and memories.
22
+ */
23
+ export function hybridRecall(query, repo, topK = 5, types) {
24
+ return recallAll(query, repo, topK, types);
25
+ }
26
+ export { getExperience } from "../store/memory.js";
27
+ //# sourceMappingURL=memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../src/services/memory-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,aAAa,IAAI,kBAAkB,EACnC,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,eAAe,EACf,eAAe,EACf,SAAS,IAAI,cAAc,GAC5B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;AAE1F;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,KAOC,EACD,QAA4B,EAC5B,eAAuB;IAEvB,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IACjE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAgB,EAChB,OAAe,EACf,OAAiB,EACjB,KAAe,EACf,MAAqB,EACrB,IAAY;IAEZ,OAAO,cAAc,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC3F,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,IAAa,EACb,OAAe,CAAC,EAChB,KAAoB;IAEpB,OAAO,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { RepoSnapshot } from "../types.js";
2
+ interface ParseOptions {
3
+ path: string;
4
+ depth: number;
5
+ }
6
+ export declare function parseRepository(opts: ParseOptions): Promise<RepoSnapshot>;
7
+ export {};
8
+ //# sourceMappingURL=repository-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-parser.d.ts","sourceRoot":"","sources":["../../src/services/repository-parser.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAA0B,MAAM,aAAa,CAAC;AAExE,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CA0B/E"}