vemora 0.1.0-alpha.15
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.
- package/README.md +851 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +682 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/ask.d.ts +14 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +137 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/audit.d.ts +17 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +398 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/brief.d.ts +16 -0
- package/dist/commands/brief.d.ts.map +1 -0
- package/dist/commands/brief.js +84 -0
- package/dist/commands/brief.js.map +1 -0
- package/dist/commands/chat.d.ts +7 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +155 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/context.d.ts +63 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +794 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/dead-code.d.ts +15 -0
- package/dist/commands/dead-code.d.ts.map +1 -0
- package/dist/commands/dead-code.js +206 -0
- package/dist/commands/dead-code.js.map +1 -0
- package/dist/commands/deps.d.ts +20 -0
- package/dist/commands/deps.d.ts.map +1 -0
- package/dist/commands/deps.js +138 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/focus.d.ts +8 -0
- package/dist/commands/focus.d.ts.map +1 -0
- package/dist/commands/focus.js +310 -0
- package/dist/commands/focus.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +366 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init-agent.d.ts +23 -0
- package/dist/commands/init-agent.d.ts.map +1 -0
- package/dist/commands/init-agent.js +384 -0
- package/dist/commands/init-agent.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +122 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/knowledge.d.ts +14 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +115 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/plan.d.ts +24 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +867 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/query.d.ts +39 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +392 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/remember.d.ts +11 -0
- package/dist/commands/remember.d.ts.map +1 -0
- package/dist/commands/remember.js +267 -0
- package/dist/commands/remember.js.map +1 -0
- package/dist/commands/report.d.ts +10 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +243 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +127 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/summarize.d.ts +14 -0
- package/dist/commands/summarize.d.ts.map +1 -0
- package/dist/commands/summarize.js +170 -0
- package/dist/commands/summarize.js.map +1 -0
- package/dist/commands/triage.d.ts +33 -0
- package/dist/commands/triage.d.ts.map +1 -0
- package/dist/commands/triage.js +419 -0
- package/dist/commands/triage.js.map +1 -0
- package/dist/commands/usages.d.ts +14 -0
- package/dist/commands/usages.d.ts.map +1 -0
- package/dist/commands/usages.js +236 -0
- package/dist/commands/usages.js.map +1 -0
- package/dist/core/config.d.ts +35 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +159 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/types.d.ts +287 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -0
- package/dist/embeddings/factory.d.ts +9 -0
- package/dist/embeddings/factory.d.ts.map +1 -0
- package/dist/embeddings/factory.js +26 -0
- package/dist/embeddings/factory.js.map +1 -0
- package/dist/embeddings/noop.d.ts +17 -0
- package/dist/embeddings/noop.d.ts.map +1 -0
- package/dist/embeddings/noop.js +22 -0
- package/dist/embeddings/noop.js.map +1 -0
- package/dist/embeddings/ollama.d.ts +11 -0
- package/dist/embeddings/ollama.d.ts.map +1 -0
- package/dist/embeddings/ollama.js +49 -0
- package/dist/embeddings/ollama.js.map +1 -0
- package/dist/embeddings/openai.d.ts +10 -0
- package/dist/embeddings/openai.d.ts.map +1 -0
- package/dist/embeddings/openai.js +67 -0
- package/dist/embeddings/openai.js.map +1 -0
- package/dist/embeddings/provider.d.ts +19 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +3 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/indexer/callgraph.d.ts +16 -0
- package/dist/indexer/callgraph.d.ts.map +1 -0
- package/dist/indexer/callgraph.js +154 -0
- package/dist/indexer/callgraph.js.map +1 -0
- package/dist/indexer/chunkBySlidingWindow.d.ts +6 -0
- package/dist/indexer/chunkBySlidingWindow.d.ts.map +1 -0
- package/dist/indexer/chunkBySlidingWindow.js +30 -0
- package/dist/indexer/chunkBySlidingWindow.js.map +1 -0
- package/dist/indexer/chunkBySymbols.d.ts +7 -0
- package/dist/indexer/chunkBySymbols.d.ts.map +1 -0
- package/dist/indexer/chunkBySymbols.js +57 -0
- package/dist/indexer/chunkBySymbols.js.map +1 -0
- package/dist/indexer/chunker.d.ts +15 -0
- package/dist/indexer/chunker.d.ts.map +1 -0
- package/dist/indexer/chunker.js +26 -0
- package/dist/indexer/chunker.js.map +1 -0
- package/dist/indexer/classHeader.d.ts +7 -0
- package/dist/indexer/classHeader.d.ts.map +1 -0
- package/dist/indexer/classHeader.js +37 -0
- package/dist/indexer/classHeader.js.map +1 -0
- package/dist/indexer/deps.d.ts +66 -0
- package/dist/indexer/deps.d.ts.map +1 -0
- package/dist/indexer/deps.js +412 -0
- package/dist/indexer/deps.js.map +1 -0
- package/dist/indexer/hasher.d.ts +17 -0
- package/dist/indexer/hasher.d.ts.map +1 -0
- package/dist/indexer/hasher.js +38 -0
- package/dist/indexer/hasher.js.map +1 -0
- package/dist/indexer/parser.d.ts +18 -0
- package/dist/indexer/parser.d.ts.map +1 -0
- package/dist/indexer/parser.js +355 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/indexer/scanner.d.ts +18 -0
- package/dist/indexer/scanner.d.ts.map +1 -0
- package/dist/indexer/scanner.js +37 -0
- package/dist/indexer/scanner.js.map +1 -0
- package/dist/indexer/strategy.d.ts +11 -0
- package/dist/indexer/strategy.d.ts.map +1 -0
- package/dist/indexer/strategy.js +15 -0
- package/dist/indexer/strategy.js.map +1 -0
- package/dist/indexer/tests.d.ts +15 -0
- package/dist/indexer/tests.d.ts.map +1 -0
- package/dist/indexer/tests.js +68 -0
- package/dist/indexer/tests.js.map +1 -0
- package/dist/indexer/todos.d.ts +9 -0
- package/dist/indexer/todos.d.ts.map +1 -0
- package/dist/indexer/todos.js +29 -0
- package/dist/indexer/todos.js.map +1 -0
- package/dist/llm/anthropic.d.ts +8 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +76 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/claude-code.d.ts +37 -0
- package/dist/llm/claude-code.d.ts.map +1 -0
- package/dist/llm/claude-code.js +97 -0
- package/dist/llm/claude-code.js.map +1 -0
- package/dist/llm/factory.d.ts +7 -0
- package/dist/llm/factory.d.ts.map +1 -0
- package/dist/llm/factory.js +47 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/ollama.d.ts +8 -0
- package/dist/llm/ollama.d.ts.map +1 -0
- package/dist/llm/ollama.js +83 -0
- package/dist/llm/ollama.js.map +1 -0
- package/dist/llm/openai.d.ts +8 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +68 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/provider.d.ts +35 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +3 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/search/bm25.d.ts +3 -0
- package/dist/search/bm25.d.ts.map +1 -0
- package/dist/search/bm25.js +104 -0
- package/dist/search/bm25.js.map +1 -0
- package/dist/search/formatter.d.ts +43 -0
- package/dist/search/formatter.d.ts.map +1 -0
- package/dist/search/formatter.js +208 -0
- package/dist/search/formatter.js.map +1 -0
- package/dist/search/hybrid.d.ts +10 -0
- package/dist/search/hybrid.d.ts.map +1 -0
- package/dist/search/hybrid.js +53 -0
- package/dist/search/hybrid.js.map +1 -0
- package/dist/search/merge.d.ts +33 -0
- package/dist/search/merge.d.ts.map +1 -0
- package/dist/search/merge.js +158 -0
- package/dist/search/merge.js.map +1 -0
- package/dist/search/mmr.d.ts +23 -0
- package/dist/search/mmr.d.ts.map +1 -0
- package/dist/search/mmr.js +95 -0
- package/dist/search/mmr.js.map +1 -0
- package/dist/search/rerank.d.ts +12 -0
- package/dist/search/rerank.d.ts.map +1 -0
- package/dist/search/rerank.js +113 -0
- package/dist/search/rerank.js.map +1 -0
- package/dist/search/signature.d.ts +42 -0
- package/dist/search/signature.d.ts.map +1 -0
- package/dist/search/signature.js +112 -0
- package/dist/search/signature.js.map +1 -0
- package/dist/search/vector.d.ts +41 -0
- package/dist/search/vector.d.ts.map +1 -0
- package/dist/search/vector.js +185 -0
- package/dist/search/vector.js.map +1 -0
- package/dist/storage/cache.d.ts +30 -0
- package/dist/storage/cache.d.ts.map +1 -0
- package/dist/storage/cache.js +160 -0
- package/dist/storage/cache.js.map +1 -0
- package/dist/storage/knowledge.d.ts +23 -0
- package/dist/storage/knowledge.d.ts.map +1 -0
- package/dist/storage/knowledge.js +81 -0
- package/dist/storage/knowledge.js.map +1 -0
- package/dist/storage/planSession.d.ts +39 -0
- package/dist/storage/planSession.d.ts.map +1 -0
- package/dist/storage/planSession.js +78 -0
- package/dist/storage/planSession.js.map +1 -0
- package/dist/storage/repository.d.ts +27 -0
- package/dist/storage/repository.d.ts.map +1 -0
- package/dist/storage/repository.js +95 -0
- package/dist/storage/repository.js.map +1 -0
- package/dist/storage/session.d.ts +38 -0
- package/dist/storage/session.d.ts.map +1 -0
- package/dist/storage/session.js +100 -0
- package/dist/storage/session.js.map +1 -0
- package/dist/storage/summaries.d.ts +19 -0
- package/dist/storage/summaries.d.ts.map +1 -0
- package/dist/storage/summaries.js +66 -0
- package/dist/storage/summaries.js.map +1 -0
- package/dist/storage/usage.d.ts +39 -0
- package/dist/storage/usage.d.ts.map +1 -0
- package/dist/storage/usage.js +55 -0
- package/dist/storage/usage.js.map +1 -0
- package/dist/utils/git.d.ts +20 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +49 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/tokenizer.d.ts +32 -0
- package/dist/utils/tokenizer.d.ts.map +1 -0
- package/dist/utils/tokenizer.js +66 -0
- package/dist/utils/tokenizer.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractFileCalls = extractFileCalls;
|
|
4
|
+
exports.buildGlobalCallGraph = buildGlobalCallGraph;
|
|
5
|
+
// Tree-sitter is optional, just like in parser.ts
|
|
6
|
+
// biome-ignore lint/suspicious/noExplicitAny: tree-sitter native bindings have no TS types
|
|
7
|
+
let Parser = null;
|
|
8
|
+
// biome-ignore lint/suspicious/noExplicitAny: tree-sitter native bindings have no TS types
|
|
9
|
+
let tsLanguage = null;
|
|
10
|
+
try {
|
|
11
|
+
Parser = require("tree-sitter");
|
|
12
|
+
const tsModule = require("tree-sitter-typescript");
|
|
13
|
+
tsLanguage = tsModule.typescript || tsModule;
|
|
14
|
+
// console.log('Tree-sitter loaded successfully');
|
|
15
|
+
}
|
|
16
|
+
catch (_err) {
|
|
17
|
+
// console.error('Failed to load Tree-sitter:', err);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Extracts function calls from a file using Tree-sitter.
|
|
21
|
+
* Returns a partial CallGraph for the given file.
|
|
22
|
+
*/
|
|
23
|
+
function extractFileCalls(filePath, content, context) {
|
|
24
|
+
const fileCallGraph = {};
|
|
25
|
+
if (!Parser || !tsLanguage || !filePath.match(/\.(ts|tsx|js|jsx)$/)) {
|
|
26
|
+
return fileCallGraph;
|
|
27
|
+
}
|
|
28
|
+
const parser = new Parser();
|
|
29
|
+
parser.setLanguage(tsLanguage);
|
|
30
|
+
const tree = parser.parse(content);
|
|
31
|
+
let currentScope = null; // file:symbol
|
|
32
|
+
// biome-ignore lint/suspicious/noExplicitAny: tree-sitter AST node has no TS type
|
|
33
|
+
function visit(node) {
|
|
34
|
+
// 1. Track definition scope
|
|
35
|
+
let newScopeDefined = false;
|
|
36
|
+
if (node.type === "function_declaration" ||
|
|
37
|
+
node.type === "method_definition") {
|
|
38
|
+
const nameNode = node.childForFieldName("name");
|
|
39
|
+
if (nameNode) {
|
|
40
|
+
const name = nameNode.text;
|
|
41
|
+
currentScope = `${filePath}:${name}`;
|
|
42
|
+
if (!fileCallGraph[currentScope]) {
|
|
43
|
+
fileCallGraph[currentScope] = { calls: [], calledBy: [] };
|
|
44
|
+
}
|
|
45
|
+
newScopeDefined = true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else if (node.type === "class_declaration") {
|
|
49
|
+
const nameNode = node.childForFieldName("name");
|
|
50
|
+
if (nameNode) {
|
|
51
|
+
// Classes can call things in their constructor or field initializers,
|
|
52
|
+
// but usually we care about methods. We'll set scope to class temporarily.
|
|
53
|
+
const name = nameNode.text;
|
|
54
|
+
currentScope = `${filePath}:${name}`;
|
|
55
|
+
if (!fileCallGraph[currentScope]) {
|
|
56
|
+
fileCallGraph[currentScope] = { calls: [], calledBy: [] };
|
|
57
|
+
}
|
|
58
|
+
newScopeDefined = true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// 2. Find calls
|
|
62
|
+
if (node.type === "call_expression") {
|
|
63
|
+
const functionNode = node.childForFieldName("function");
|
|
64
|
+
if (functionNode && currentScope) {
|
|
65
|
+
const callEntry = resolveCall(functionNode, filePath, context);
|
|
66
|
+
if (callEntry) {
|
|
67
|
+
fileCallGraph[currentScope].calls.push(callEntry);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Recurse
|
|
72
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
73
|
+
visit(node.child(i));
|
|
74
|
+
}
|
|
75
|
+
// Restore scope if we defined one here
|
|
76
|
+
if (newScopeDefined) {
|
|
77
|
+
// This is a simplification. Real scope tracking would need a stack.
|
|
78
|
+
// But for top-level functions/methods it's mostly okay.
|
|
79
|
+
currentScope = null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
visit(tree.rootNode);
|
|
83
|
+
return fileCallGraph;
|
|
84
|
+
}
|
|
85
|
+
function resolveCall(
|
|
86
|
+
// biome-ignore lint/suspicious/noExplicitAny: tree-sitter AST node has no TS type
|
|
87
|
+
node, currentFile, context) {
|
|
88
|
+
const text = node.text;
|
|
89
|
+
// Simple function call: foo()
|
|
90
|
+
if (node.type === "identifier") {
|
|
91
|
+
const name = text;
|
|
92
|
+
// Heuristic 1: Is it in the same file?
|
|
93
|
+
const _sameFileId = `${currentFile}:${name}`;
|
|
94
|
+
if (context.symbols[name] && context.symbols[name].file === currentFile) {
|
|
95
|
+
return { name, file: currentFile, line: context.symbols[name].startLine };
|
|
96
|
+
}
|
|
97
|
+
// Heuristic 2: Is it imported?
|
|
98
|
+
const fileDeps = context.deps[currentFile];
|
|
99
|
+
if (fileDeps) {
|
|
100
|
+
for (const imp of fileDeps.imports) {
|
|
101
|
+
if (imp.symbols.includes(name)) {
|
|
102
|
+
// Found the file!
|
|
103
|
+
const _targetSymbol = `${imp.file}:${name}`;
|
|
104
|
+
// We might not have the exact line here without more lookup,
|
|
105
|
+
// but we have the file.
|
|
106
|
+
return { name, file: imp.file };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return { name };
|
|
111
|
+
}
|
|
112
|
+
// Method call: obj.method()
|
|
113
|
+
if (node.type === "member_expression") {
|
|
114
|
+
const propertyNode = node.childForFieldName("property");
|
|
115
|
+
if (propertyNode) {
|
|
116
|
+
const methodName = propertyNode.text;
|
|
117
|
+
// Without type inference, we can only guess.
|
|
118
|
+
// We return the method name at least.
|
|
119
|
+
return { name: methodName };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Merges partial call graphs into a single global one and computes reverse edges.
|
|
126
|
+
*/
|
|
127
|
+
function buildGlobalCallGraph(partials) {
|
|
128
|
+
const global = {};
|
|
129
|
+
// 1. Merge calls
|
|
130
|
+
for (const partial of partials) {
|
|
131
|
+
for (const [callerId, data] of Object.entries(partial)) {
|
|
132
|
+
if (!global[callerId]) {
|
|
133
|
+
global[callerId] = { calls: [], calledBy: [] };
|
|
134
|
+
}
|
|
135
|
+
global[callerId].calls.push(...data.calls);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// 2. Compute calledBy (in-edges)
|
|
139
|
+
for (const [callerId, data] of Object.entries(global)) {
|
|
140
|
+
for (const call of data.calls) {
|
|
141
|
+
if (call.file) {
|
|
142
|
+
const calleeId = `${call.file}:${call.name}`;
|
|
143
|
+
if (!global[calleeId]) {
|
|
144
|
+
global[calleeId] = { calls: [], calledBy: [] };
|
|
145
|
+
}
|
|
146
|
+
if (!global[calleeId].calledBy.includes(callerId)) {
|
|
147
|
+
global[calleeId].calledBy.push(callerId);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return global;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=callgraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callgraph.js","sourceRoot":"","sources":["../../src/indexer/callgraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AiMemoryConfig, Chunk } from "../core/types";
|
|
2
|
+
/**
|
|
3
|
+
* Chunking sliding window.
|
|
4
|
+
*/
|
|
5
|
+
export declare function chunkBySlidingWindow(filePath: string, lines: string[], lineOffset: number, config: AiMemoryConfig, symbol?: string): Chunk[];
|
|
6
|
+
//# sourceMappingURL=chunkBySlidingWindow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunkBySlidingWindow.d.ts","sourceRoot":"","sources":["../../src/indexer/chunkBySlidingWindow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAG3D;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,EACtB,MAAM,CAAC,EAAE,MAAM,GACd,KAAK,EAAE,CAkBT"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.chunkBySlidingWindow = chunkBySlidingWindow;
|
|
4
|
+
const hasher_1 = require("./hasher");
|
|
5
|
+
/**
|
|
6
|
+
* Chunking sliding window.
|
|
7
|
+
*/
|
|
8
|
+
function chunkBySlidingWindow(filePath, lines, lineOffset, config, symbol) {
|
|
9
|
+
const chunks = [];
|
|
10
|
+
const overlap = Math.max(1, Math.floor(config.maxChunkLines * 0.1));
|
|
11
|
+
let i = 0;
|
|
12
|
+
while (i < lines.length) {
|
|
13
|
+
const slice = lines.slice(i, i + config.maxChunkLines);
|
|
14
|
+
const content = slice.join("\n");
|
|
15
|
+
if (content.trim().length > 0) {
|
|
16
|
+
const startLine = lineOffset + i;
|
|
17
|
+
const endLine = lineOffset + i + slice.length - 1;
|
|
18
|
+
chunks.push(makeChunk(filePath, content, startLine, endLine, symbol));
|
|
19
|
+
}
|
|
20
|
+
if (i + config.maxChunkLines >= lines.length)
|
|
21
|
+
break;
|
|
22
|
+
i += config.maxChunkLines - overlap;
|
|
23
|
+
}
|
|
24
|
+
return chunks;
|
|
25
|
+
}
|
|
26
|
+
function makeChunk(file, content, start, end, symbol) {
|
|
27
|
+
const id = (0, hasher_1.hashContent)(file + "\n" + content);
|
|
28
|
+
return { id, file, start, end, symbol, content };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=chunkBySlidingWindow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunkBySlidingWindow.js","sourceRoot":"","sources":["../../src/indexer/chunkBySlidingWindow.ts"],"names":[],"mappings":";;AAMA,oDAwBC;AA7BD,qCAAuC;AAEvC;;GAEG;AACH,SAAgB,oBAAoB,CAClC,QAAgB,EAChB,KAAe,EACf,UAAkB,EAClB,MAAsB,EACtB,MAAe;IAEf,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC;IACpE,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,GAAG,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC,MAAM;YAAE,MAAM;QACpD,CAAC,IAAI,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC;IACtC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAChB,IAAY,EACZ,OAAe,EACf,KAAa,EACb,GAAW,EACX,MAAe;IAEf,MAAM,EAAE,GAAG,IAAA,oBAAW,EAAC,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC;IAC9C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AiMemoryConfig, Chunk } from "../core/types";
|
|
2
|
+
import type { ParsedSymbol } from "./parser";
|
|
3
|
+
/**
|
|
4
|
+
* Chunking basato su simboli.
|
|
5
|
+
*/
|
|
6
|
+
export declare function chunkBySymbols(filePath: string, lines: string[], symbols: ParsedSymbol[], config: AiMemoryConfig): Chunk[];
|
|
7
|
+
//# sourceMappingURL=chunkBySymbols.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunkBySymbols.d.ts","sourceRoot":"","sources":["../../src/indexer/chunkBySymbols.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAK7C;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,cAAc,GACrB,KAAK,EAAE,CAwDT"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.chunkBySymbols = chunkBySymbols;
|
|
4
|
+
const classHeader_1 = require("./classHeader");
|
|
5
|
+
const hasher_1 = require("./hasher");
|
|
6
|
+
const chunkBySlidingWindow_1 = require("./chunkBySlidingWindow");
|
|
7
|
+
/**
|
|
8
|
+
* Chunking basato su simboli.
|
|
9
|
+
*/
|
|
10
|
+
function chunkBySymbols(filePath, lines, symbols, config) {
|
|
11
|
+
const chunks = [];
|
|
12
|
+
const classHeaders = (0, classHeader_1.buildClassHeaders)(lines, symbols);
|
|
13
|
+
const bounded = symbols
|
|
14
|
+
.filter((s) => s.endLine >= s.startLine)
|
|
15
|
+
.sort((a, b) => a.startLine - b.startLine);
|
|
16
|
+
// Include the file header (imports, top-level declarations) as its own chunk
|
|
17
|
+
const firstSymbolStart = bounded[0]?.startLine ?? lines.length + 1;
|
|
18
|
+
if (firstSymbolStart > 5) {
|
|
19
|
+
const headerLines = lines.slice(0, firstSymbolStart - 1);
|
|
20
|
+
const headerContent = headerLines.join("\n").trim();
|
|
21
|
+
if (headerContent.length > 30) {
|
|
22
|
+
chunks.push(makeChunk(filePath, headerContent, 1, firstSymbolStart - 1));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
for (const sym of bounded) {
|
|
26
|
+
const symLines = lines.slice(sym.startLine - 1, sym.endLine);
|
|
27
|
+
let symContent = symLines.join("\n");
|
|
28
|
+
if (sym.type === "method" && sym.parent) {
|
|
29
|
+
const header = classHeaders.get(sym.parent);
|
|
30
|
+
if (header) {
|
|
31
|
+
symContent = `${header}\n\n // ...\n\n${symLines.join("\n")}`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (symLines.length > config.maxChunkLines ||
|
|
35
|
+
symContent.length > config.maxChunkChars) {
|
|
36
|
+
const subChunks = (0, chunkBySlidingWindow_1.chunkBySlidingWindow)(filePath, symLines, sym.startLine, config, sym.name);
|
|
37
|
+
chunks.push(...subChunks);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
chunks.push(makeChunk(filePath, symContent, sym.startLine, sym.endLine, sym.name));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Any trailing content after the last symbol
|
|
44
|
+
const lastEnd = bounded[bounded.length - 1]?.endLine ?? 0;
|
|
45
|
+
if (lastEnd < lines.length) {
|
|
46
|
+
const tailContent = lines.slice(lastEnd).join("\n").trim();
|
|
47
|
+
if (tailContent.length > 50) {
|
|
48
|
+
chunks.push(makeChunk(filePath, tailContent, lastEnd + 1, lines.length));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return chunks;
|
|
52
|
+
}
|
|
53
|
+
function makeChunk(file, content, start, end, symbol) {
|
|
54
|
+
const id = (0, hasher_1.hashContent)(file + "\n" + content);
|
|
55
|
+
return { id, file, start, end, symbol, content };
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=chunkBySymbols.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunkBySymbols.js","sourceRoot":"","sources":["../../src/indexer/chunkBySymbols.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AiMemoryConfig, Chunk } from "../core/types";
|
|
2
|
+
import type { ParsedSymbol } from "./parser";
|
|
3
|
+
/**
|
|
4
|
+
* Splits a file into chunks suitable for embedding and retrieval.
|
|
5
|
+
*
|
|
6
|
+
* Strategy:
|
|
7
|
+
* 1. If tree-sitter gave us symbol boundaries with real line ranges,
|
|
8
|
+
* create one chunk per symbol (split further if too large).
|
|
9
|
+
* 2. Otherwise fall back to a sliding window chunker.
|
|
10
|
+
*
|
|
11
|
+
* Chunk IDs are derived from file path + content hash, so unchanged code
|
|
12
|
+
* keeps the same ID across re-indexing — enabling embedding cache reuse.
|
|
13
|
+
*/
|
|
14
|
+
export declare function chunkFile(filePath: string, content: string, symbols: ParsedSymbol[], config: AiMemoryConfig): Chunk[];
|
|
15
|
+
//# sourceMappingURL=chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/indexer/chunker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAK7C;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,cAAc,GACrB,KAAK,EAAE,CAOT"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.chunkFile = chunkFile;
|
|
4
|
+
const strategy_1 = require("./strategy");
|
|
5
|
+
const chunkBySymbols_1 = require("./chunkBySymbols");
|
|
6
|
+
const chunkBySlidingWindow_1 = require("./chunkBySlidingWindow");
|
|
7
|
+
/**
|
|
8
|
+
* Splits a file into chunks suitable for embedding and retrieval.
|
|
9
|
+
*
|
|
10
|
+
* Strategy:
|
|
11
|
+
* 1. If tree-sitter gave us symbol boundaries with real line ranges,
|
|
12
|
+
* create one chunk per symbol (split further if too large).
|
|
13
|
+
* 2. Otherwise fall back to a sliding window chunker.
|
|
14
|
+
*
|
|
15
|
+
* Chunk IDs are derived from file path + content hash, so unchanged code
|
|
16
|
+
* keeps the same ID across re-indexing — enabling embedding cache reuse.
|
|
17
|
+
*/
|
|
18
|
+
function chunkFile(filePath, content, symbols, config) {
|
|
19
|
+
const lines = content.split("\n");
|
|
20
|
+
const strategy = (0, strategy_1.selectChunkingStrategy)(symbols);
|
|
21
|
+
if (strategy === "symbol") {
|
|
22
|
+
return (0, chunkBySymbols_1.chunkBySymbols)(filePath, lines, symbols, config);
|
|
23
|
+
}
|
|
24
|
+
return (0, chunkBySlidingWindow_1.chunkBySlidingWindow)(filePath, lines, 1, config);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/indexer/chunker.ts"],"names":[],"mappings":";;AAiBA,8BAYC;AA3BD,yCAAoD;AACpD,qDAAkD;AAClD,iEAA8D;AAE9D;;;;;;;;;;GAUG;AACH,SAAgB,SAAS,CACvB,QAAgB,EAChB,OAAe,EACf,OAAuB,EACvB,MAAsB;IAEtB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAA,iCAAsB,EAAC,OAAO,CAAC,CAAC;IACjD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,IAAA,+BAAc,EAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,IAAA,2CAAoB,EAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ParsedSymbol } from "./parser";
|
|
2
|
+
export declare const CLASS_HEADER_MAX_LINES = 25;
|
|
3
|
+
/**
|
|
4
|
+
* Builds a map of className → header snippet for classes that have methods.
|
|
5
|
+
*/
|
|
6
|
+
export declare function buildClassHeaders(lines: string[], symbols: ParsedSymbol[]): Map<string, string>;
|
|
7
|
+
//# sourceMappingURL=classHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classHeader.d.ts","sourceRoot":"","sources":["../../src/indexer/classHeader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,YAAY,EAAE,GACtB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA4BrB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CLASS_HEADER_MAX_LINES = void 0;
|
|
4
|
+
exports.buildClassHeaders = buildClassHeaders;
|
|
5
|
+
exports.CLASS_HEADER_MAX_LINES = 25;
|
|
6
|
+
/**
|
|
7
|
+
* Builds a map of className → header snippet for classes that have methods.
|
|
8
|
+
*/
|
|
9
|
+
function buildClassHeaders(lines, symbols) {
|
|
10
|
+
const headers = new Map();
|
|
11
|
+
const firstMethodLine = new Map();
|
|
12
|
+
for (const sym of symbols) {
|
|
13
|
+
if (sym.type === "method" && sym.parent) {
|
|
14
|
+
const existing = firstMethodLine.get(sym.parent);
|
|
15
|
+
if (existing === undefined || sym.startLine < existing) {
|
|
16
|
+
firstMethodLine.set(sym.parent, sym.startLine);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
for (const cls of symbols) {
|
|
21
|
+
if (cls.type !== "class" || cls.endLine <= cls.startLine)
|
|
22
|
+
continue;
|
|
23
|
+
const firstMethod = firstMethodLine.get(cls.name);
|
|
24
|
+
if (!firstMethod)
|
|
25
|
+
continue;
|
|
26
|
+
const headerEndLine = Math.min(firstMethod - 1, cls.startLine + exports.CLASS_HEADER_MAX_LINES - 1);
|
|
27
|
+
const headerLines = lines.slice(cls.startLine - 1, headerEndLine);
|
|
28
|
+
while (headerLines.length > 0 && !headerLines[headerLines.length - 1].trim()) {
|
|
29
|
+
headerLines.pop();
|
|
30
|
+
}
|
|
31
|
+
if (headerLines.length >= 2) {
|
|
32
|
+
headers.set(cls.name, headerLines.join("\n"));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return headers;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=classHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classHeader.js","sourceRoot":"","sources":["../../src/indexer/classHeader.ts"],"names":[],"mappings":";;;AAOA,8CA+BC;AApCY,QAAA,sBAAsB,GAAG,EAAE,CAAC;AAEzC;;GAEG;AACH,SAAgB,iBAAiB,CAC/B,KAAe,EACf,OAAuB;IAEvB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,SAAS,GAAG,QAAQ,EAAE,CAAC;gBACvD,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,SAAS;YAAE,SAAS;QACnE,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW;YAAE,SAAS;QAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAC5B,WAAW,GAAG,CAAC,EACf,GAAG,CAAC,SAAS,GAAG,8BAAsB,GAAG,CAAC,CAC3C,CAAC;QACF,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;QAClE,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7E,WAAW,CAAC,GAAG,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { DependencyGraph, ImportEntry } from "../core/types";
|
|
2
|
+
export interface TsPathAlias {
|
|
3
|
+
/** The literal prefix before the wildcard, e.g. "@/" for pattern "@/*" */
|
|
4
|
+
prefix: string;
|
|
5
|
+
/** Replacement targets, e.g. ["src/*"] */
|
|
6
|
+
targets: string[];
|
|
7
|
+
/** baseUrl from compilerOptions (relative to project root), e.g. "." */
|
|
8
|
+
baseUrl: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Reads tsconfig.json (or tsconfig.base.json / tsconfig.node.json) from
|
|
12
|
+
* `rootDir` and extracts `compilerOptions.paths` as a list of alias entries.
|
|
13
|
+
* Returns [] if no paths are found or the file cannot be parsed.
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadTsPathAliases(rootDir: string): TsPathAlias[];
|
|
16
|
+
/**
|
|
17
|
+
* Extracts all intra-project imports from a single file's content.
|
|
18
|
+
* Returns resolved ImportEntry[] (only files that exist in the index).
|
|
19
|
+
*
|
|
20
|
+
* @param relativePath - path of this file relative to project root
|
|
21
|
+
* @param content - file content
|
|
22
|
+
* @param allFiles - set of all relative paths in the project index
|
|
23
|
+
*/
|
|
24
|
+
export declare function extractFileImports(relativePath: string, content: string, allFiles: Set<string>, aliases?: TsPathAlias[]): ImportEntry[];
|
|
25
|
+
/**
|
|
26
|
+
* Incrementally updates the dependency graph.
|
|
27
|
+
*
|
|
28
|
+
* - Changed/new files: re-extract imports from content
|
|
29
|
+
* - Unchanged files: carry forward existing deps entries
|
|
30
|
+
* - Deleted files: remove from graph
|
|
31
|
+
*/
|
|
32
|
+
export declare function updateDependencyGraph(prevGraph: DependencyGraph, changedFiles: Map<string, string>, // relativePath → content (new/changed files)
|
|
33
|
+
deletedFiles: Set<string>, allFiles: Set<string>, aliases?: TsPathAlias[]): DependencyGraph;
|
|
34
|
+
/**
|
|
35
|
+
* Computes the reverse graph: for each file, which files import it.
|
|
36
|
+
* Derived at query time — not stored in the index.
|
|
37
|
+
*/
|
|
38
|
+
export declare function computeImportedBy(graph: DependencyGraph): Map<string, string[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Returns all files that (transitively) import `startFile`, up to `depth` hops
|
|
41
|
+
* in the reverse dependency graph (following importedBy edges inward).
|
|
42
|
+
*/
|
|
43
|
+
export declare function getTransitiveImportedBy(startFile: string, importedByMap: Map<string, string[]>, depth?: number): Map<string, number>;
|
|
44
|
+
/**
|
|
45
|
+
* Returns all files reachable from `startFile` up to `depth` hops
|
|
46
|
+
* in the dependency graph (following imports outward).
|
|
47
|
+
*/
|
|
48
|
+
export declare function getTransitiveDeps(startFile: string, graph: DependencyGraph, depth?: number): Map<string, number>;
|
|
49
|
+
/**
|
|
50
|
+
* Detects circular dependencies using DFS with a recursion stack (gray-set).
|
|
51
|
+
* Returns up to 5 unique cycles, each as an ordered list of file paths
|
|
52
|
+
* (first element === last element to make the loop explicit).
|
|
53
|
+
*/
|
|
54
|
+
export declare function detectCycles(graph: DependencyGraph): string[][];
|
|
55
|
+
/**
|
|
56
|
+
* Stats about the dependency graph for display in `vemora status`.
|
|
57
|
+
*/
|
|
58
|
+
export declare function graphStats(graph: DependencyGraph): {
|
|
59
|
+
totalFiles: number;
|
|
60
|
+
totalEdges: number;
|
|
61
|
+
mostImported: Array<{
|
|
62
|
+
file: string;
|
|
63
|
+
count: number;
|
|
64
|
+
}>;
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=deps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/indexer/deps.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACZ,MAAM,eAAe,CAAC;AAIvB,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAiChE;AAuND;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EACrB,OAAO,GAAE,WAAW,EAAO,GAC1B,WAAW,EAAE,CA4Bf;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,eAAe,EAC1B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,6CAA6C;AAChF,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,EACzB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EACrB,OAAO,GAAE,WAAW,EAAO,GAC1B,eAAe,CAmBjB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,eAAe,GACrB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAYvB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACpC,KAAK,SAAI,GACR,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBrB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,eAAe,EACtB,KAAK,SAAI,GACR,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBrB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,EAAE,EAAE,CAuC/D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD,CAiBA"}
|