@yuaone/core 0.4.7 → 0.4.9
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/dist/agent-loop.d.ts +10 -0
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +190 -0
- package/dist/agent-loop.js.map +1 -1
- package/dist/ast-analyzer.d.ts +147 -0
- package/dist/ast-analyzer.d.ts.map +1 -0
- package/dist/ast-analyzer.js +344 -0
- package/dist/ast-analyzer.js.map +1 -0
- package/dist/codebase-context.d.ts +24 -4
- package/dist/codebase-context.d.ts.map +1 -1
- package/dist/codebase-context.js +100 -10
- package/dist/codebase-context.js.map +1 -1
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +7 -0
- package/dist/constants.js.map +1 -1
- package/dist/cross-file-refactor.d.ts +12 -3
- package/dist/cross-file-refactor.d.ts.map +1 -1
- package/dist/cross-file-refactor.js +35 -3
- package/dist/cross-file-refactor.js.map +1 -1
- package/dist/execution-engine.d.ts +9 -0
- package/dist/execution-engine.d.ts.map +1 -1
- package/dist/execution-engine.js +59 -10
- package/dist/execution-engine.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/vector-store.d.ts +148 -0
- package/dist/vector-store.d.ts.map +1 -0
- package/dist/vector-store.js +328 -0
- package/dist/vector-store.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module vector-store
|
|
3
|
+
* @description In-memory vector store + Ollama embedding provider.
|
|
4
|
+
*
|
|
5
|
+
* Offline-friendly alternative to pgvector:
|
|
6
|
+
* - InMemoryVectorStore: cosine similarity over Map, persisted to .yuan/vector-store.json
|
|
7
|
+
* - OllamaEmbeddingProvider: calls Ollama local API (nomic-embed-text),
|
|
8
|
+
* falls back to TF-IDF bag-of-words on failure (no network required)
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from "node:fs";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import * as http from "node:http";
|
|
13
|
+
// ─── Cosine Similarity ──────────────────────────────────────────────────────
|
|
14
|
+
/**
|
|
15
|
+
* Cosine similarity between two equal-length vectors.
|
|
16
|
+
* Returns value in [0, 1] (0 = orthogonal, 1 = identical).
|
|
17
|
+
*/
|
|
18
|
+
function cosineSimilarity(a, b) {
|
|
19
|
+
if (a.length !== b.length || a.length === 0)
|
|
20
|
+
return 0;
|
|
21
|
+
const dot = a.reduce((sum, ai, i) => sum + ai * b[i], 0);
|
|
22
|
+
const magA = Math.sqrt(a.reduce((sum, ai) => sum + ai * ai, 0));
|
|
23
|
+
const magB = Math.sqrt(b.reduce((sum, bi) => sum + bi * bi, 0));
|
|
24
|
+
return magA && magB ? dot / (magA * magB) : 0;
|
|
25
|
+
}
|
|
26
|
+
// ─── TF-IDF Fallback Embedder ───────────────────────────────────────────────
|
|
27
|
+
const TFIDF_DIM = 256;
|
|
28
|
+
/**
|
|
29
|
+
* Simple deterministic hash code for a string.
|
|
30
|
+
* Used to map words to a fixed-size vector dimension.
|
|
31
|
+
*/
|
|
32
|
+
function hashCode(word) {
|
|
33
|
+
let h = 0;
|
|
34
|
+
for (let i = 0; i < word.length; i++) {
|
|
35
|
+
h = (h << 5) - h + word.charCodeAt(i);
|
|
36
|
+
h |= 0; // convert to 32-bit int
|
|
37
|
+
}
|
|
38
|
+
return Math.abs(h);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Builds a 256-dim TF-IDF bag-of-words vector for a text string.
|
|
42
|
+
* Deterministic — no external calls required.
|
|
43
|
+
*/
|
|
44
|
+
function buildTfIdfVector(text) {
|
|
45
|
+
const vector = new Array(TFIDF_DIM).fill(0);
|
|
46
|
+
const words = text
|
|
47
|
+
.toLowerCase()
|
|
48
|
+
.replace(/[^a-z0-9_\s]/g, " ")
|
|
49
|
+
.split(/\s+/)
|
|
50
|
+
.filter((w) => w.length > 1);
|
|
51
|
+
for (const word of words) {
|
|
52
|
+
const idx = hashCode(word) % TFIDF_DIM;
|
|
53
|
+
vector[idx] += 1;
|
|
54
|
+
}
|
|
55
|
+
// Normalize to unit vector
|
|
56
|
+
const mag = Math.sqrt(vector.reduce((s, v) => s + v * v, 0));
|
|
57
|
+
if (mag > 0) {
|
|
58
|
+
for (let i = 0; i < vector.length; i++) {
|
|
59
|
+
vector[i] /= mag;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return vector;
|
|
63
|
+
}
|
|
64
|
+
// ─── OllamaEmbeddingProvider ─────────────────────────────────────────────────
|
|
65
|
+
/**
|
|
66
|
+
* Generates embeddings using a local Ollama server.
|
|
67
|
+
*
|
|
68
|
+
* Uses `nomic-embed-text` model by default (768-dim).
|
|
69
|
+
* Falls back to TF-IDF bag-of-words (256-dim) if Ollama is unavailable.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* const provider = new OllamaEmbeddingProvider();
|
|
74
|
+
* const [[v]] = await provider.embed(["hello world"]);
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export class OllamaEmbeddingProvider {
|
|
78
|
+
baseUrl;
|
|
79
|
+
model;
|
|
80
|
+
timeoutMs;
|
|
81
|
+
_dimension;
|
|
82
|
+
_ollamaAvailable = null;
|
|
83
|
+
constructor(options) {
|
|
84
|
+
this.baseUrl = options?.baseUrl ?? "http://localhost:11434";
|
|
85
|
+
this.model = options?.model ?? "nomic-embed-text";
|
|
86
|
+
this.timeoutMs = options?.timeoutMs ?? 10_000;
|
|
87
|
+
// Will be resolved to 768 if Ollama responds, 256 otherwise
|
|
88
|
+
this._dimension = 768;
|
|
89
|
+
}
|
|
90
|
+
get dimension() {
|
|
91
|
+
return this._dimension;
|
|
92
|
+
}
|
|
93
|
+
async embed(texts) {
|
|
94
|
+
const results = [];
|
|
95
|
+
for (const text of texts) {
|
|
96
|
+
const vec = await this._embedOne(text);
|
|
97
|
+
results.push(vec);
|
|
98
|
+
}
|
|
99
|
+
return results;
|
|
100
|
+
}
|
|
101
|
+
async _embedOne(text) {
|
|
102
|
+
// Fast-path: if we already know Ollama is down, skip the HTTP call
|
|
103
|
+
if (this._ollamaAvailable === false) {
|
|
104
|
+
this._dimension = TFIDF_DIM;
|
|
105
|
+
return buildTfIdfVector(text);
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const vec = await this._callOllama(text);
|
|
109
|
+
this._ollamaAvailable = true;
|
|
110
|
+
this._dimension = vec.length;
|
|
111
|
+
return vec;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Mark Ollama as unavailable for this session
|
|
115
|
+
this._ollamaAvailable = false;
|
|
116
|
+
this._dimension = TFIDF_DIM;
|
|
117
|
+
return buildTfIdfVector(text);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
_callOllama(text) {
|
|
121
|
+
return new Promise((resolve, reject) => {
|
|
122
|
+
const body = JSON.stringify({ model: this.model, prompt: text });
|
|
123
|
+
const url = new URL("/api/embeddings", this.baseUrl);
|
|
124
|
+
const options = {
|
|
125
|
+
hostname: url.hostname,
|
|
126
|
+
port: url.port ? Number(url.port) : 11434,
|
|
127
|
+
path: url.pathname,
|
|
128
|
+
method: "POST",
|
|
129
|
+
headers: {
|
|
130
|
+
"Content-Type": "application/json",
|
|
131
|
+
"Content-Length": Buffer.byteLength(body),
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
const req = http.request(options, (res) => {
|
|
135
|
+
const chunks = [];
|
|
136
|
+
res.on("data", (chunk) => chunks.push(chunk));
|
|
137
|
+
res.on("end", () => {
|
|
138
|
+
try {
|
|
139
|
+
const raw = Buffer.concat(chunks).toString("utf8");
|
|
140
|
+
const parsed = JSON.parse(raw);
|
|
141
|
+
if (!Array.isArray(parsed.embedding) || parsed.embedding.length === 0) {
|
|
142
|
+
reject(new Error("Ollama returned empty embedding"));
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
resolve(parsed.embedding);
|
|
146
|
+
}
|
|
147
|
+
catch (e) {
|
|
148
|
+
reject(e);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
res.on("error", reject);
|
|
152
|
+
});
|
|
153
|
+
req.setTimeout(this.timeoutMs, () => {
|
|
154
|
+
req.destroy();
|
|
155
|
+
reject(new Error(`Ollama request timed out after ${this.timeoutMs}ms`));
|
|
156
|
+
});
|
|
157
|
+
req.on("error", reject);
|
|
158
|
+
req.write(body);
|
|
159
|
+
req.end();
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Returns whether the last embed call reached Ollama successfully.
|
|
164
|
+
* `null` means no call has been made yet.
|
|
165
|
+
*/
|
|
166
|
+
get ollamaAvailable() {
|
|
167
|
+
return this._ollamaAvailable;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// ─── InMemoryVectorStore ─────────────────────────────────────────────────────
|
|
171
|
+
/**
|
|
172
|
+
* In-memory vector store with cosine similarity search.
|
|
173
|
+
*
|
|
174
|
+
* - All vectors kept in a `Map` for O(n) linear scan.
|
|
175
|
+
* - Persisted to `.yuan/vector-store.json` for cross-session reuse.
|
|
176
|
+
* - Accepts any `VectorEmbeddingProvider` (Ollama, TF-IDF, OpenAI, etc.).
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```ts
|
|
180
|
+
* const store = new InMemoryVectorStore({
|
|
181
|
+
* projectId: "my-project",
|
|
182
|
+
* projectPath: "/path/to/project",
|
|
183
|
+
* embeddingProvider: new OllamaEmbeddingProvider(),
|
|
184
|
+
* });
|
|
185
|
+
* await store.load();
|
|
186
|
+
* await store.addDocument("doc-1", "user authentication logic", { file: "auth.ts" });
|
|
187
|
+
* const results = await store.search("login flow", 5);
|
|
188
|
+
* ```
|
|
189
|
+
*/
|
|
190
|
+
export class InMemoryVectorStore {
|
|
191
|
+
projectId;
|
|
192
|
+
storePath;
|
|
193
|
+
embeddingProvider;
|
|
194
|
+
documents;
|
|
195
|
+
dirty;
|
|
196
|
+
constructor(options) {
|
|
197
|
+
this.projectId = options.projectId;
|
|
198
|
+
this.storePath = path.join(options.projectPath, ".yuan", "vector-store.json");
|
|
199
|
+
this.embeddingProvider = options.embeddingProvider;
|
|
200
|
+
this.documents = new Map();
|
|
201
|
+
this.dirty = false;
|
|
202
|
+
}
|
|
203
|
+
// ─── Persistence ──────────────────────────────────────────────────────────
|
|
204
|
+
/**
|
|
205
|
+
* Load persisted documents from disk.
|
|
206
|
+
* Safe to call even if the file doesn't exist yet.
|
|
207
|
+
*/
|
|
208
|
+
async load() {
|
|
209
|
+
try {
|
|
210
|
+
if (!fs.existsSync(this.storePath))
|
|
211
|
+
return;
|
|
212
|
+
const raw = fs.readFileSync(this.storePath, "utf8");
|
|
213
|
+
const data = JSON.parse(raw);
|
|
214
|
+
if (data.version !== 1 || data.projectId !== this.projectId)
|
|
215
|
+
return;
|
|
216
|
+
for (const [id, doc] of Object.entries(data.documents)) {
|
|
217
|
+
this.documents.set(id, doc);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// Corrupt file — start fresh
|
|
222
|
+
this.documents.clear();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Persist current documents to disk.
|
|
227
|
+
* Creates `.yuan/` directory if it doesn't exist.
|
|
228
|
+
*/
|
|
229
|
+
async save() {
|
|
230
|
+
if (!this.dirty)
|
|
231
|
+
return;
|
|
232
|
+
const dir = path.dirname(this.storePath);
|
|
233
|
+
if (!fs.existsSync(dir)) {
|
|
234
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
235
|
+
}
|
|
236
|
+
const data = {
|
|
237
|
+
version: 1,
|
|
238
|
+
projectId: this.projectId,
|
|
239
|
+
documents: Object.fromEntries(this.documents.entries()),
|
|
240
|
+
};
|
|
241
|
+
fs.writeFileSync(this.storePath, JSON.stringify(data, null, 2), "utf8");
|
|
242
|
+
this.dirty = false;
|
|
243
|
+
}
|
|
244
|
+
// ─── Indexing ─────────────────────────────────────────────────────────────
|
|
245
|
+
/**
|
|
246
|
+
* Add or update a document. Generates embedding from the provided text.
|
|
247
|
+
*
|
|
248
|
+
* @param id - Unique document identifier
|
|
249
|
+
* @param text - Text content to embed
|
|
250
|
+
* @param metadata - Arbitrary metadata attached to the document
|
|
251
|
+
*/
|
|
252
|
+
async addDocument(id, text, metadata = {}) {
|
|
253
|
+
const [vector] = await this.embeddingProvider.embed([text]);
|
|
254
|
+
this.documents.set(id, { vector, text, metadata });
|
|
255
|
+
this.dirty = true;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Remove a document by id.
|
|
259
|
+
* @returns true if the document existed and was removed.
|
|
260
|
+
*/
|
|
261
|
+
removeDocument(id) {
|
|
262
|
+
const existed = this.documents.delete(id);
|
|
263
|
+
if (existed)
|
|
264
|
+
this.dirty = true;
|
|
265
|
+
return existed;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Remove all documents whose metadata.filePath matches the given path.
|
|
269
|
+
* @returns number of removed documents.
|
|
270
|
+
*/
|
|
271
|
+
async removeByFile(filePath) {
|
|
272
|
+
let removed = 0;
|
|
273
|
+
for (const [id, doc] of this.documents.entries()) {
|
|
274
|
+
if (doc.metadata["filePath"] === filePath) {
|
|
275
|
+
this.documents.delete(id);
|
|
276
|
+
removed++;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (removed > 0)
|
|
280
|
+
this.dirty = true;
|
|
281
|
+
return removed;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Clear all documents.
|
|
285
|
+
*/
|
|
286
|
+
clear() {
|
|
287
|
+
this.documents.clear();
|
|
288
|
+
this.dirty = true;
|
|
289
|
+
}
|
|
290
|
+
// ─── Search ───────────────────────────────────────────────────────────────
|
|
291
|
+
/**
|
|
292
|
+
* Semantic search: embed queryText then rank all documents by cosine similarity.
|
|
293
|
+
*
|
|
294
|
+
* @param queryText - Natural language or code query
|
|
295
|
+
* @param topK - Maximum number of results to return (default 10)
|
|
296
|
+
* @param threshold - Minimum similarity score to include (default 0)
|
|
297
|
+
* @returns Array of results sorted by similarity descending
|
|
298
|
+
*/
|
|
299
|
+
async search(queryText, topK = 10, threshold = 0) {
|
|
300
|
+
if (this.documents.size === 0)
|
|
301
|
+
return [];
|
|
302
|
+
const [queryVec] = await this.embeddingProvider.embed([queryText]);
|
|
303
|
+
const scored = [];
|
|
304
|
+
for (const [id, doc] of this.documents.entries()) {
|
|
305
|
+
const sim = cosineSimilarity(queryVec, doc.vector);
|
|
306
|
+
if (sim >= threshold) {
|
|
307
|
+
scored.push({ id, sim, doc });
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
scored.sort((a, b) => b.sim - a.sim);
|
|
311
|
+
return scored.slice(0, topK).map(({ id, sim, doc }) => ({
|
|
312
|
+
id,
|
|
313
|
+
text: doc.text,
|
|
314
|
+
similarity: sim,
|
|
315
|
+
metadata: doc.metadata,
|
|
316
|
+
}));
|
|
317
|
+
}
|
|
318
|
+
// ─── Stats ────────────────────────────────────────────────────────────────
|
|
319
|
+
/** Total number of stored documents. */
|
|
320
|
+
get size() {
|
|
321
|
+
return this.documents.size;
|
|
322
|
+
}
|
|
323
|
+
/** Returns true if there are no stored documents. */
|
|
324
|
+
get isEmpty() {
|
|
325
|
+
return this.documents.size === 0;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=vector-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-store.js","sourceRoot":"","sources":["../src/vector-store.ts"],"names":[],"mappings":"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"}
|