vemora 0.1.0-alpha.8
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.
Potentially problematic release.
This version of vemora might be problematic. Click here for more details.
- package/README.md +716 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +589 -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 +136 -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 +408 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/brief.d.ts +14 -0
- package/dist/commands/brief.d.ts.map +1 -0
- package/dist/commands/brief.js +73 -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 +161 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/context.d.ts +61 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +778 -0
- package/dist/commands/context.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 +6 -0
- package/dist/commands/focus.d.ts.map +1 -0
- package/dist/commands/focus.js +302 -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 +447 -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 +8 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +98 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/plan.d.ts +16 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +535 -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 +389 -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 +174 -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 +180 -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 +205 -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 +140 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/types.d.ts +251 -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 +16 -0
- package/dist/embeddings/ollama.d.ts.map +1 -0
- package/dist/embeddings/ollama.js +41 -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 +409 -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/factory.d.ts +7 -0
- package/dist/llm/factory.d.ts.map +1 -0
- package/dist/llm/factory.js +39 -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 +29 -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 +102 -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 +15 -0
- package/dist/search/rerank.d.ts.map +1 -0
- package/dist/search/rerank.js +76 -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 +17 -0
- package/dist/storage/knowledge.d.ts.map +1 -0
- package/dist/storage/knowledge.js +58 -0
- package/dist/storage/knowledge.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 +35 -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 +15 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +38 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/tokenizer.d.ts +24 -0
- package/dist/utils/tokenizer.d.ts.map +1 -0
- package/dist/utils/tokenizer.js +52 -0
- package/dist/utils/tokenizer.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
export interface DisplayConfig {
|
|
2
|
+
/**
|
|
3
|
+
* Default output format for query/context/ask commands.
|
|
4
|
+
* Set to "terse" for small/local models with limited context windows.
|
|
5
|
+
* Can always be overridden per-command with --format.
|
|
6
|
+
*/
|
|
7
|
+
format?: "terse" | "markdown";
|
|
8
|
+
}
|
|
9
|
+
export interface AiMemoryConfig {
|
|
10
|
+
/** Deterministic project ID derived from root directory path */
|
|
11
|
+
projectId: string;
|
|
12
|
+
projectName: string;
|
|
13
|
+
/** Schema version of this config file */
|
|
14
|
+
version: string;
|
|
15
|
+
/** Absolute path to project root (injected at load time, not persisted) */
|
|
16
|
+
rootDir: string;
|
|
17
|
+
/** fast-glob patterns of files to include */
|
|
18
|
+
include: string[];
|
|
19
|
+
/** fast-glob patterns to exclude (node_modules, build outputs, etc.) */
|
|
20
|
+
exclude: string[];
|
|
21
|
+
/** Max lines per chunk before splitting */
|
|
22
|
+
maxChunkLines: number;
|
|
23
|
+
/** Max characters per chunk before splitting */
|
|
24
|
+
maxChunkChars: number;
|
|
25
|
+
embedding: EmbeddingConfig;
|
|
26
|
+
/** Configuration for LLM-based summarization (vemora summarize) */
|
|
27
|
+
summarization?: SummarizationConfig;
|
|
28
|
+
/**
|
|
29
|
+
* LLM used as planner in the planner-executor pattern (vemora plan).
|
|
30
|
+
* Typically a more capable/expensive model. Falls back to summarization if omitted.
|
|
31
|
+
*/
|
|
32
|
+
planner?: SummarizationConfig;
|
|
33
|
+
/** Output display preferences */
|
|
34
|
+
display?: DisplayConfig;
|
|
35
|
+
/** Human-readable description of where the local cache lives */
|
|
36
|
+
cacheDir: string;
|
|
37
|
+
}
|
|
38
|
+
export interface SummarizationConfig {
|
|
39
|
+
provider: "openai" | "anthropic" | "ollama" | "gemini";
|
|
40
|
+
/** Chat completion model (default: gpt-4o-mini) */
|
|
41
|
+
model: string;
|
|
42
|
+
/** API key. Defaults to OPENAI_API_KEY / ANTHROPIC_API_KEY / GEMINI_API_KEY env vars. */
|
|
43
|
+
apiKey?: string;
|
|
44
|
+
/** Base URL for OpenAI-compatible or Ollama APIs */
|
|
45
|
+
baseUrl?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface EmbeddingConfig {
|
|
48
|
+
provider: "openai" | "ollama" | "none";
|
|
49
|
+
model: string;
|
|
50
|
+
/** Vector dimensions — must match the model output */
|
|
51
|
+
dimensions: number;
|
|
52
|
+
/** API key for OpenAI. Defaults to OPENAI_API_KEY env var. */
|
|
53
|
+
apiKey?: string;
|
|
54
|
+
/** Base URL for Ollama. Defaults to http://localhost:11434 */
|
|
55
|
+
baseUrl?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* files.json — top-level map from relative file path to its index entry.
|
|
59
|
+
* Hash-based change detection enables incremental re-indexing.
|
|
60
|
+
*/
|
|
61
|
+
export interface FileIndex {
|
|
62
|
+
[relativePath: string]: FileEntry;
|
|
63
|
+
}
|
|
64
|
+
export interface FileEntry {
|
|
65
|
+
/** SHA-256 hash of file content for change detection */
|
|
66
|
+
hash: string;
|
|
67
|
+
size: number;
|
|
68
|
+
lastModified: string;
|
|
69
|
+
/** IDs of all chunks extracted from this file */
|
|
70
|
+
chunks: string[];
|
|
71
|
+
/** Names of all symbols extracted from this file */
|
|
72
|
+
symbols: string[];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* chunks.json — array of code chunks extracted from the repository.
|
|
76
|
+
* Each chunk is a semantically meaningful slice (function, class, etc.)
|
|
77
|
+
* sized to fit in an LLM context window.
|
|
78
|
+
*/
|
|
79
|
+
export interface Chunk {
|
|
80
|
+
/** Content-hash based ID. Stable across re-indexing if code doesn't change. */
|
|
81
|
+
id: string;
|
|
82
|
+
/** Relative file path */
|
|
83
|
+
file: string;
|
|
84
|
+
/** 1-based start line (inclusive) */
|
|
85
|
+
start: number;
|
|
86
|
+
/** 1-based end line (inclusive) */
|
|
87
|
+
end: number;
|
|
88
|
+
/** Symbol this chunk belongs to, if any */
|
|
89
|
+
symbol?: string;
|
|
90
|
+
/** The raw source text */
|
|
91
|
+
content: string;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* symbols.json — map from symbol name to its location and metadata.
|
|
95
|
+
* Used for symbol-level navigation after a vector search.
|
|
96
|
+
*/
|
|
97
|
+
export interface SymbolIndex {
|
|
98
|
+
[name: string]: SymbolEntry;
|
|
99
|
+
}
|
|
100
|
+
export interface SymbolEntry {
|
|
101
|
+
type: "function" | "class" | "method" | "interface" | "type" | "constant" | "variable";
|
|
102
|
+
/** Relative file path */
|
|
103
|
+
file: string;
|
|
104
|
+
startLine: number;
|
|
105
|
+
endLine: number;
|
|
106
|
+
exported: boolean;
|
|
107
|
+
/** True when the symbol is the default export of its file */
|
|
108
|
+
isDefault?: boolean;
|
|
109
|
+
/** For methods: the parent class name */
|
|
110
|
+
parent?: string;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* deps.json — maps each file to the project-internal files it imports.
|
|
114
|
+
*
|
|
115
|
+
* Only tracks intra-project imports (relative paths that resolve to files
|
|
116
|
+
* in the index). npm packages are ignored.
|
|
117
|
+
*
|
|
118
|
+
* Stored in git so the whole team shares the same graph without rebuilding.
|
|
119
|
+
*/
|
|
120
|
+
export interface DependencyGraph {
|
|
121
|
+
[relativePath: string]: FileDependencies;
|
|
122
|
+
}
|
|
123
|
+
export interface FileDependencies {
|
|
124
|
+
/** Project files this file imports from */
|
|
125
|
+
imports: ImportEntry[];
|
|
126
|
+
}
|
|
127
|
+
export interface ImportEntry {
|
|
128
|
+
/** Relative path of the imported file (within the project) */
|
|
129
|
+
file: string;
|
|
130
|
+
/** Named symbols imported. Empty = default / namespace / side-effect import. */
|
|
131
|
+
symbols: string[];
|
|
132
|
+
}
|
|
133
|
+
export interface CallGraphEntry {
|
|
134
|
+
/** The function/method name that is being called */
|
|
135
|
+
name: string;
|
|
136
|
+
/** The file containing the definition, if known */
|
|
137
|
+
file?: string;
|
|
138
|
+
/** Location in the file */
|
|
139
|
+
line?: number;
|
|
140
|
+
}
|
|
141
|
+
export interface CallGraph {
|
|
142
|
+
/** Map from function/method ID (file:symbol) to call info */
|
|
143
|
+
[callerId: string]: {
|
|
144
|
+
calls: CallGraphEntry[];
|
|
145
|
+
calledBy: string[];
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export interface Metadata {
|
|
149
|
+
projectId: string;
|
|
150
|
+
projectName: string;
|
|
151
|
+
lastIndexed: string | null;
|
|
152
|
+
indexedFiles: number;
|
|
153
|
+
totalChunks: number;
|
|
154
|
+
totalSymbols: number;
|
|
155
|
+
totalDepEdges: number;
|
|
156
|
+
totalCallEdges?: number;
|
|
157
|
+
/** Files with AI-generated summaries (from vemora summarize) */
|
|
158
|
+
totalSummaries?: number;
|
|
159
|
+
embeddingProvider?: string;
|
|
160
|
+
embeddingModel?: string;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* .vemora/summaries/file-summaries.json
|
|
164
|
+
* LLM-generated 2-3 sentence descriptions per file.
|
|
165
|
+
* Generated by `vemora summarize`. Committed to git so the whole team shares them.
|
|
166
|
+
* Incremental: only regenerates entries whose content hash changed.
|
|
167
|
+
*/
|
|
168
|
+
export interface FileSummaryIndex {
|
|
169
|
+
[relativePath: string]: FileSummary;
|
|
170
|
+
}
|
|
171
|
+
export interface FileSummary {
|
|
172
|
+
/** 2-3 sentence description of the file's purpose and key exports */
|
|
173
|
+
summary: string;
|
|
174
|
+
/** SHA-256 hash of the file content at generation time (for incremental updates) */
|
|
175
|
+
contentHash: string;
|
|
176
|
+
/** ISO timestamp */
|
|
177
|
+
generatedAt: string;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* .vemora/summaries/project-summary.json
|
|
181
|
+
* LLM-generated ~400-500 word project overview synthesized from all file summaries.
|
|
182
|
+
* Intended to be a stable "always-available" context document for LLMs.
|
|
183
|
+
*/
|
|
184
|
+
export interface ProjectSummary {
|
|
185
|
+
/** High-level overview of the project's purpose, architecture, and components */
|
|
186
|
+
overview: string;
|
|
187
|
+
generatedAt: string;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Stored in ~/.vemora-cache/<projectId>/embeddings.json.
|
|
191
|
+
* Never committed to git — each developer maintains their own local cache.
|
|
192
|
+
*
|
|
193
|
+
* Design: chunk IDs are content-hash based, so embeddings are reusable
|
|
194
|
+
* across branches as long as the code content doesn't change.
|
|
195
|
+
*/
|
|
196
|
+
export interface EmbeddingCache {
|
|
197
|
+
projectId: string;
|
|
198
|
+
embeddingModel: string;
|
|
199
|
+
dimensions: number;
|
|
200
|
+
lastUpdated: string;
|
|
201
|
+
/** Map from chunk ID to its embedding vector (legacy JSON format) */
|
|
202
|
+
embeddings?: Record<string, number[]>;
|
|
203
|
+
/** Optimized: contiguous buffer of all vectors (runtime only) */
|
|
204
|
+
vectors?: Float32Array;
|
|
205
|
+
/** Optimized: ordered list of chunk IDs matching the vectors buffer */
|
|
206
|
+
chunkIds?: string[];
|
|
207
|
+
hnswIndex?: unknown;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* .vemora/knowledge/entries.json
|
|
211
|
+
* Human- or LLM-authored notes about the project that the structural index
|
|
212
|
+
* cannot capture: architectural decisions, approved patterns, gotchas, glossary.
|
|
213
|
+
* Committed to git so the whole team (and future LLM sessions) benefit.
|
|
214
|
+
*/
|
|
215
|
+
export interface KnowledgeEntry {
|
|
216
|
+
/** UUID v4 */
|
|
217
|
+
id: string;
|
|
218
|
+
category: "decision" | "pattern" | "gotcha" | "glossary";
|
|
219
|
+
/** Short title shown in context headers */
|
|
220
|
+
title: string;
|
|
221
|
+
/** Free-form text, searchable via keyword overlap */
|
|
222
|
+
body: string;
|
|
223
|
+
/** Project-relative file paths this entry is about */
|
|
224
|
+
relatedFiles?: string[];
|
|
225
|
+
/** SHA-256 hashes of relatedFiles at creation time, keyed by path */
|
|
226
|
+
relatedFileHashes?: Record<string, string>;
|
|
227
|
+
/** Symbol names this entry is about */
|
|
228
|
+
relatedSymbols?: string[];
|
|
229
|
+
/** ISO timestamp */
|
|
230
|
+
createdAt: string;
|
|
231
|
+
/** "human" or "llm:<model-id>" */
|
|
232
|
+
createdBy: string;
|
|
233
|
+
confidence: "high" | "medium" | "low";
|
|
234
|
+
/** ID of the entry this supersedes (for updates) */
|
|
235
|
+
supersedes?: string;
|
|
236
|
+
}
|
|
237
|
+
export interface TodoAnnotation {
|
|
238
|
+
file: string;
|
|
239
|
+
/** 1-based line number */
|
|
240
|
+
line: number;
|
|
241
|
+
type: "TODO" | "FIXME" | "HACK" | "XXX";
|
|
242
|
+
text: string;
|
|
243
|
+
}
|
|
244
|
+
export interface SearchResult {
|
|
245
|
+
chunk: Chunk;
|
|
246
|
+
/** Cosine similarity score in [0, 1] (or keyword score for non-vector search) */
|
|
247
|
+
score: number;
|
|
248
|
+
/** Resolved symbol info if the chunk has a symbol */
|
|
249
|
+
symbol?: SymbolEntry;
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":";AAAA,iFAAiF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EmbeddingConfig } from "../core/types";
|
|
2
|
+
import type { EmbeddingProvider } from "./provider";
|
|
3
|
+
/**
|
|
4
|
+
* Factory that instantiates the correct EmbeddingProvider from config.
|
|
5
|
+
* Adding a new provider only requires implementing EmbeddingProvider and
|
|
6
|
+
* adding a case here — no other code needs to change.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createEmbeddingProvider(config: EmbeddingConfig): EmbeddingProvider;
|
|
9
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/embeddings/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,GACtB,iBAAiB,CA0BnB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createEmbeddingProvider = createEmbeddingProvider;
|
|
4
|
+
const noop_1 = require("./noop");
|
|
5
|
+
const ollama_1 = require("./ollama");
|
|
6
|
+
const openai_1 = require("./openai");
|
|
7
|
+
/**
|
|
8
|
+
* Factory that instantiates the correct EmbeddingProvider from config.
|
|
9
|
+
* Adding a new provider only requires implementing EmbeddingProvider and
|
|
10
|
+
* adding a case here — no other code needs to change.
|
|
11
|
+
*/
|
|
12
|
+
function createEmbeddingProvider(config) {
|
|
13
|
+
switch (config.provider) {
|
|
14
|
+
case "openai":
|
|
15
|
+
return new openai_1.OpenAIEmbeddingProvider(config.apiKey, config.model, config.dimensions);
|
|
16
|
+
case "ollama":
|
|
17
|
+
return new ollama_1.OllamaEmbeddingProvider(config.model, config.baseUrl, config.dimensions);
|
|
18
|
+
case "none":
|
|
19
|
+
return new noop_1.NoopEmbeddingProvider();
|
|
20
|
+
default: {
|
|
21
|
+
const p = config.provider;
|
|
22
|
+
throw new Error(`Unknown embedding provider: "${p}". Valid options: openai, ollama, none`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/embeddings/factory.ts"],"names":[],"mappings":";;AAWA,0DA4BC;AAtCD,iCAA+C;AAC/C,qCAAmD;AACnD,qCAAmD;AAGnD;;;;GAIG;AACH,SAAgB,uBAAuB,CACrC,MAAuB;IAEvB,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,QAAQ;YACX,OAAO,IAAI,gCAAuB,CAChC,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,UAAU,CAClB,CAAC;QAEJ,KAAK,QAAQ;YACX,OAAO,IAAI,gCAAuB,CAChC,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,UAAU,CAClB,CAAC;QAEJ,KAAK,MAAM;YACT,OAAO,IAAI,4BAAqB,EAAE,CAAC;QAErC,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,CAAC,GAAI,MAA0B,CAAC,QAAQ,CAAC;YAC/C,MAAM,IAAI,KAAK,CACb,gCAAgC,CAAC,wCAAwC,CAC1E,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { EmbeddingProvider } from "./provider";
|
|
2
|
+
/**
|
|
3
|
+
* No-op embedding provider — used when provider is set to "none".
|
|
4
|
+
*
|
|
5
|
+
* Returns empty vectors. The query command will automatically fall back
|
|
6
|
+
* to keyword search when embeddings are empty.
|
|
7
|
+
*
|
|
8
|
+
* Useful for: testing the indexer pipeline, inspecting index structure,
|
|
9
|
+
* or repositories where semantic search isn't needed.
|
|
10
|
+
*/
|
|
11
|
+
export declare class NoopEmbeddingProvider implements EmbeddingProvider {
|
|
12
|
+
readonly name = "none";
|
|
13
|
+
readonly model = "none";
|
|
14
|
+
readonly dimensions = 0;
|
|
15
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=noop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../../src/embeddings/noop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,iBAAiB;IAC7D,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,KAAK,UAAU;IACxB,QAAQ,CAAC,UAAU,KAAK;IAElB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAGlD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NoopEmbeddingProvider = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* No-op embedding provider — used when provider is set to "none".
|
|
6
|
+
*
|
|
7
|
+
* Returns empty vectors. The query command will automatically fall back
|
|
8
|
+
* to keyword search when embeddings are empty.
|
|
9
|
+
*
|
|
10
|
+
* Useful for: testing the indexer pipeline, inspecting index structure,
|
|
11
|
+
* or repositories where semantic search isn't needed.
|
|
12
|
+
*/
|
|
13
|
+
class NoopEmbeddingProvider {
|
|
14
|
+
name = "none";
|
|
15
|
+
model = "none";
|
|
16
|
+
dimensions = 0;
|
|
17
|
+
async embed(texts) {
|
|
18
|
+
return texts.map(() => []);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.NoopEmbeddingProvider = NoopEmbeddingProvider;
|
|
22
|
+
//# sourceMappingURL=noop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop.js","sourceRoot":"","sources":["../../src/embeddings/noop.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;GAQG;AACH,MAAa,qBAAqB;IACvB,IAAI,GAAG,MAAM,CAAC;IACd,KAAK,GAAG,MAAM,CAAC;IACf,UAAU,GAAG,CAAC,CAAC;IAExB,KAAK,CAAC,KAAK,CAAC,KAAe;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;CACF;AARD,sDAQC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { EmbeddingProvider } from "./provider";
|
|
2
|
+
/**
|
|
3
|
+
* Ollama embedding provider — runs entirely locally, no API key needed.
|
|
4
|
+
*
|
|
5
|
+
* Requires Ollama running at baseUrl with the target model pulled:
|
|
6
|
+
* ollama pull nomic-embed-text
|
|
7
|
+
*/
|
|
8
|
+
export declare class OllamaEmbeddingProvider implements EmbeddingProvider {
|
|
9
|
+
readonly name = "ollama";
|
|
10
|
+
readonly model: string;
|
|
11
|
+
readonly dimensions: number;
|
|
12
|
+
private baseUrl;
|
|
13
|
+
constructor(model?: string, baseUrl?: string, dimensions?: number);
|
|
14
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/embeddings/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMpD;;;;;GAKG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,OAAO,CAAC,OAAO,CAAS;gBAGtB,KAAK,SAAqB,EAC1B,OAAO,SAA2B,EAClC,UAAU,SAAM;IAOZ,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAyBlD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OllamaEmbeddingProvider = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Ollama embedding provider — runs entirely locally, no API key needed.
|
|
6
|
+
*
|
|
7
|
+
* Requires Ollama running at baseUrl with the target model pulled:
|
|
8
|
+
* ollama pull nomic-embed-text
|
|
9
|
+
*/
|
|
10
|
+
class OllamaEmbeddingProvider {
|
|
11
|
+
name = "ollama";
|
|
12
|
+
model;
|
|
13
|
+
dimensions;
|
|
14
|
+
baseUrl;
|
|
15
|
+
constructor(model = "nomic-embed-text", baseUrl = "http://localhost:11434", dimensions = 768) {
|
|
16
|
+
this.model = model;
|
|
17
|
+
this.dimensions = dimensions;
|
|
18
|
+
this.baseUrl = baseUrl.replace(/\/$/, "");
|
|
19
|
+
}
|
|
20
|
+
async embed(texts) {
|
|
21
|
+
if (texts.length === 0)
|
|
22
|
+
return [];
|
|
23
|
+
const results = [];
|
|
24
|
+
// Ollama's /api/embeddings endpoint processes one text at a time
|
|
25
|
+
for (const text of texts) {
|
|
26
|
+
const response = await fetch(`${this.baseUrl}/api/embeddings`, {
|
|
27
|
+
method: "POST",
|
|
28
|
+
headers: { "Content-Type": "application/json" },
|
|
29
|
+
body: JSON.stringify({ model: this.model, prompt: text }),
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
throw new Error(`Ollama embedding request failed: ${response.status} ${response.statusText}`);
|
|
33
|
+
}
|
|
34
|
+
const data = (await response.json());
|
|
35
|
+
results.push(data.embedding);
|
|
36
|
+
}
|
|
37
|
+
return results;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.OllamaEmbeddingProvider = OllamaEmbeddingProvider;
|
|
41
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/embeddings/ollama.ts"],"names":[],"mappings":";;;AAMA;;;;;GAKG;AACH,MAAa,uBAAuB;IACzB,IAAI,GAAG,QAAQ,CAAC;IAChB,KAAK,CAAS;IACd,UAAU,CAAS;IAEpB,OAAO,CAAS;IAExB,YACE,KAAK,GAAG,kBAAkB,EAC1B,OAAO,GAAG,wBAAwB,EAClC,UAAU,GAAG,GAAG;QAEhB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAe;QACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,OAAO,GAAe,EAAE,CAAC;QAE/B,iEAAiE;QACjE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,iBAAiB,EAAE;gBAC7D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;aAC1D,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CACb,oCAAoC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC7E,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AA1CD,0DA0CC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { EmbeddingProvider } from "./provider";
|
|
2
|
+
export declare class OpenAIEmbeddingProvider implements EmbeddingProvider {
|
|
3
|
+
readonly name = "openai";
|
|
4
|
+
readonly model: string;
|
|
5
|
+
readonly dimensions: number;
|
|
6
|
+
private client;
|
|
7
|
+
constructor(apiKey?: string, model?: string, dimensions?: number);
|
|
8
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAKpD,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAG5B,OAAO,CAAC,MAAM,CAAM;gBAGlB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,SAA2B,EAChC,UAAU,SAAO;IAkBb,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAuClD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAIEmbeddingProvider = void 0;
|
|
4
|
+
/** Maximum inputs per API call (OpenAI allows up to 2048) */
|
|
5
|
+
const BATCH_SIZE = 2048;
|
|
6
|
+
class OpenAIEmbeddingProvider {
|
|
7
|
+
name = "openai";
|
|
8
|
+
model;
|
|
9
|
+
dimensions;
|
|
10
|
+
// biome-ignore lint/suspicious/noExplicitAny: openai is an optional peer dependency
|
|
11
|
+
client;
|
|
12
|
+
constructor(apiKey, model = "text-embedding-3-small", dimensions = 1536) {
|
|
13
|
+
this.model = model;
|
|
14
|
+
this.dimensions = dimensions;
|
|
15
|
+
let OpenAI;
|
|
16
|
+
try {
|
|
17
|
+
// biome-ignore lint/suspicious/noExplicitAny: optional peer dependency
|
|
18
|
+
OpenAI = require("openai").default ?? require("openai");
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
throw new Error('Package "openai" is not installed. Run: npm install openai');
|
|
22
|
+
}
|
|
23
|
+
this.client = new OpenAI({
|
|
24
|
+
apiKey: apiKey ?? process.env.OPENAI_API_KEY,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async embed(texts) {
|
|
28
|
+
if (texts.length === 0)
|
|
29
|
+
return [];
|
|
30
|
+
const results = [];
|
|
31
|
+
const batches = [];
|
|
32
|
+
for (let i = 0; i < texts.length; i += BATCH_SIZE) {
|
|
33
|
+
batches.push(texts.slice(i, i + BATCH_SIZE));
|
|
34
|
+
}
|
|
35
|
+
const MAX_PARALLEL = 4;
|
|
36
|
+
for (let i = 0; i < batches.length; i += MAX_PARALLEL) {
|
|
37
|
+
const parallelBatches = batches.slice(i, i + MAX_PARALLEL);
|
|
38
|
+
try {
|
|
39
|
+
const responses = await Promise.all(parallelBatches.map(async (batch, idx) => {
|
|
40
|
+
try {
|
|
41
|
+
return await this.client.embeddings.create({
|
|
42
|
+
model: this.model,
|
|
43
|
+
input: batch,
|
|
44
|
+
...(this.model.startsWith("text-embedding-3") && {
|
|
45
|
+
dimensions: this.dimensions,
|
|
46
|
+
}),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
console.error(`OpenAI embedding batch ${i + idx} failed:`, err);
|
|
51
|
+
return { data: [] };
|
|
52
|
+
}
|
|
53
|
+
}));
|
|
54
|
+
for (const response of responses) {
|
|
55
|
+
const sorted = response.data.sort((a, b) => a.index - b.index);
|
|
56
|
+
results.push(...sorted.map((e) => e.embedding));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
console.error(`OpenAI embedding batch group ${i / MAX_PARALLEL} failed:`, err);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return results;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.OpenAIEmbeddingProvider = OpenAIEmbeddingProvider;
|
|
67
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EmbeddingProvider — the interface every embedding backend must implement.
|
|
3
|
+
*
|
|
4
|
+
* Swap implementations by changing `config.embedding.provider` in config.json.
|
|
5
|
+
* Current implementations: openai, ollama, none.
|
|
6
|
+
*/
|
|
7
|
+
export interface EmbeddingProvider {
|
|
8
|
+
readonly name: string;
|
|
9
|
+
readonly model: string;
|
|
10
|
+
readonly dimensions: number;
|
|
11
|
+
/**
|
|
12
|
+
* Generate embeddings for a batch of texts.
|
|
13
|
+
* Returns one float vector per input text, in the same order.
|
|
14
|
+
*
|
|
15
|
+
* Implementations should handle rate limits, batching, and retries internally.
|
|
16
|
+
*/
|
|
17
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/embeddings/provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;CAC7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/embeddings/provider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CallGraph, DependencyGraph, SymbolIndex } from "../core/types";
|
|
2
|
+
export interface CallGraphContext {
|
|
3
|
+
symbols: SymbolIndex;
|
|
4
|
+
deps: DependencyGraph;
|
|
5
|
+
allFiles: Set<string>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Extracts function calls from a file using Tree-sitter.
|
|
9
|
+
* Returns a partial CallGraph for the given file.
|
|
10
|
+
*/
|
|
11
|
+
export declare function extractFileCalls(filePath: string, content: string, context: CallGraphContext): CallGraph;
|
|
12
|
+
/**
|
|
13
|
+
* Merges partial call graphs into a single global one and computes reverse edges.
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildGlobalCallGraph(partials: CallGraph[]): CallGraph;
|
|
16
|
+
//# sourceMappingURL=callgraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callgraph.d.ts","sourceRoot":"","sources":["../../src/indexer/callgraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAET,eAAe,EACf,WAAW,EACZ,MAAM,eAAe,CAAC;AAiBvB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,gBAAgB,GACxB,SAAS,CAsEX;AAkDD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,CA6BrE"}
|