@yuihub/server 1.0.0-beta.10
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/LICENSE +21 -0
- package/README.md +62 -0
- package/dist/api/text-process.d.ts +2 -0
- package/dist/api/text-process.d.ts.map +1 -0
- package/dist/api/text-process.js +48 -0
- package/dist/api/text-process.js.map +1 -0
- package/dist/auth.d.ts +30 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +71 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli/setup.d.ts +2 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +120 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/config/schema.d.ts +334 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +45 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/service.d.ts +12 -0
- package/dist/config/service.d.ts.map +1 -0
- package/dist/config/service.js +81 -0
- package/dist/config/service.js.map +1 -0
- package/dist/engine/agent/context.d.ts +35 -0
- package/dist/engine/agent/context.d.ts.map +1 -0
- package/dist/engine/agent/context.js +72 -0
- package/dist/engine/agent/context.js.map +1 -0
- package/dist/engine/agent/core.d.ts +19 -0
- package/dist/engine/agent/core.d.ts.map +1 -0
- package/dist/engine/agent/core.js +67 -0
- package/dist/engine/agent/core.js.map +1 -0
- package/dist/engine/agent/live-context.d.ts +8 -0
- package/dist/engine/agent/live-context.d.ts.map +1 -0
- package/dist/engine/agent/live-context.js +19 -0
- package/dist/engine/agent/live-context.js.map +1 -0
- package/dist/engine/agent/tools/fs.d.ts +16 -0
- package/dist/engine/agent/tools/fs.d.ts.map +1 -0
- package/dist/engine/agent/tools/fs.js +78 -0
- package/dist/engine/agent/tools/fs.js.map +1 -0
- package/dist/engine/agent/tools/memory.d.ts +18 -0
- package/dist/engine/agent/tools/memory.d.ts.map +1 -0
- package/dist/engine/agent/tools/memory.js +51 -0
- package/dist/engine/agent/tools/memory.js.map +1 -0
- package/dist/engine/ai/local-genai-service.d.ts +22 -0
- package/dist/engine/ai/local-genai-service.d.ts.map +1 -0
- package/dist/engine/ai/local-genai-service.js +158 -0
- package/dist/engine/ai/local-genai-service.js.map +1 -0
- package/dist/engine/ai/registry.d.ts +16 -0
- package/dist/engine/ai/registry.d.ts.map +1 -0
- package/dist/engine/ai/registry.js +78 -0
- package/dist/engine/ai/registry.js.map +1 -0
- package/dist/engine/ai/tools.d.ts +7 -0
- package/dist/engine/ai/tools.d.ts.map +1 -0
- package/dist/engine/ai/tools.js +2 -0
- package/dist/engine/ai/tools.js.map +1 -0
- package/dist/engine/ai/types.d.ts +21 -0
- package/dist/engine/ai/types.d.ts.map +1 -0
- package/dist/engine/ai/types.js +2 -0
- package/dist/engine/ai/types.js.map +1 -0
- package/dist/engine/ai/vertex-genai-service.d.ts +13 -0
- package/dist/engine/ai/vertex-genai-service.d.ts.map +1 -0
- package/dist/engine/ai/vertex-genai-service.js +93 -0
- package/dist/engine/ai/vertex-genai-service.js.map +1 -0
- package/dist/engine/chunker.d.ts +19 -0
- package/dist/engine/chunker.d.ts.map +1 -0
- package/dist/engine/chunker.js +79 -0
- package/dist/engine/chunker.js.map +1 -0
- package/dist/engine/composite-vector-store.d.ts +21 -0
- package/dist/engine/composite-vector-store.d.ts.map +1 -0
- package/dist/engine/composite-vector-store.js +69 -0
- package/dist/engine/composite-vector-store.js.map +1 -0
- package/dist/engine/embeddings/local-service.d.ts +10 -0
- package/dist/engine/embeddings/local-service.d.ts.map +1 -0
- package/dist/engine/embeddings/local-service.js +37 -0
- package/dist/engine/embeddings/local-service.js.map +1 -0
- package/dist/engine/embeddings/types.d.ts +10 -0
- package/dist/engine/embeddings/types.d.ts.map +1 -0
- package/dist/engine/embeddings/types.js +2 -0
- package/dist/engine/embeddings/types.js.map +1 -0
- package/dist/engine/embeddings/vertex-service.d.ts +11 -0
- package/dist/engine/embeddings/vertex-service.d.ts.map +1 -0
- package/dist/engine/embeddings/vertex-service.js +45 -0
- package/dist/engine/embeddings/vertex-service.js.map +1 -0
- package/dist/engine/indexer.d.ts +12 -0
- package/dist/engine/indexer.d.ts.map +1 -0
- package/dist/engine/indexer.js +74 -0
- package/dist/engine/indexer.js.map +1 -0
- package/dist/engine/lock.d.ts +24 -0
- package/dist/engine/lock.d.ts.map +1 -0
- package/dist/engine/lock.js +58 -0
- package/dist/engine/lock.js.map +1 -0
- package/dist/engine/schema.d.ts +19 -0
- package/dist/engine/schema.d.ts.map +1 -0
- package/dist/engine/schema.js +18 -0
- package/dist/engine/schema.js.map +1 -0
- package/dist/engine/vector-store-types.d.ts +24 -0
- package/dist/engine/vector-store-types.d.ts.map +1 -0
- package/dist/engine/vector-store-types.js +2 -0
- package/dist/engine/vector-store-types.js.map +1 -0
- package/dist/engine/vector-store.d.ts +21 -0
- package/dist/engine/vector-store.d.ts.map +1 -0
- package/dist/engine/vector-store.js +105 -0
- package/dist/engine/vector-store.js.map +1 -0
- package/dist/engine/watcher.d.ts +16 -0
- package/dist/engine/watcher.d.ts.map +1 -0
- package/dist/engine/watcher.js +94 -0
- package/dist/engine/watcher.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +361 -0
- package/dist/server.js.map +1 -0
- package/dist/sync/github-provider.d.ts +20 -0
- package/dist/sync/github-provider.d.ts.map +1 -0
- package/dist/sync/github-provider.js +80 -0
- package/dist/sync/github-provider.js.map +1 -0
- package/dist/sync/scheduler.d.ts +18 -0
- package/dist/sync/scheduler.d.ts.map +1 -0
- package/dist/sync/scheduler.js +67 -0
- package/dist/sync/scheduler.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/engine/ai/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAClE,YAAY,IAAI,MAAM,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/engine/ai/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IGenAIService, GenAIResult } from './types.js';
|
|
2
|
+
import { ToolDef } from './tools.js';
|
|
3
|
+
export declare class VertexGenAIService implements IGenAIService {
|
|
4
|
+
private config;
|
|
5
|
+
private client;
|
|
6
|
+
private model;
|
|
7
|
+
constructor(config: any);
|
|
8
|
+
init(): Promise<void>;
|
|
9
|
+
getModelName(): string;
|
|
10
|
+
generate(prompt: string, tools?: ToolDef[]): Promise<GenAIResult>;
|
|
11
|
+
stream(prompt: string, tools?: ToolDef[]): AsyncGenerator<string>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=vertex-genai-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertex-genai-service.d.ts","sourceRoot":"","sources":["../../../src/engine/ai/vertex-genai-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAIrC,qBAAa,kBAAmB,YAAW,aAAa;IACtD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,KAAK,CAAgC;gBAEjC,MAAM,EAAE,GAAG;IAIjB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,YAAY,IAAI,MAAM;IAIhB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IA6DhE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC;CAYzE"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { VertexAI } from '@google-cloud/vertexai';
|
|
2
|
+
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
3
|
+
export class VertexGenAIService {
|
|
4
|
+
config; // VertexProviderConfig
|
|
5
|
+
client = null;
|
|
6
|
+
model = null;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
}
|
|
10
|
+
async init() {
|
|
11
|
+
if (!this.config.projectId || !this.config.location) {
|
|
12
|
+
console.warn("[Vertex] projectId or location missing in config. Attempting default or might fail.");
|
|
13
|
+
if (!this.config.projectId)
|
|
14
|
+
throw new Error("Vertex AI projectId missing");
|
|
15
|
+
if (!this.config.location)
|
|
16
|
+
throw new Error("Vertex AI location missing");
|
|
17
|
+
}
|
|
18
|
+
this.client = new VertexAI({
|
|
19
|
+
project: this.config.projectId,
|
|
20
|
+
location: this.config.location,
|
|
21
|
+
});
|
|
22
|
+
const modelName = this.getModelName();
|
|
23
|
+
this.model = this.client.getGenerativeModel({ model: modelName });
|
|
24
|
+
console.log(`[Vertex] Initializing GenAI Service: ${modelName}`);
|
|
25
|
+
}
|
|
26
|
+
getModelName() {
|
|
27
|
+
return this.config.chatModel || 'gemini-2.5-flash';
|
|
28
|
+
}
|
|
29
|
+
async generate(prompt, tools) {
|
|
30
|
+
if (!this.model)
|
|
31
|
+
await this.init();
|
|
32
|
+
const request = {
|
|
33
|
+
contents: [{ role: 'user', parts: [{ text: prompt }] }],
|
|
34
|
+
};
|
|
35
|
+
if (tools && tools.length > 0) {
|
|
36
|
+
// Map ToolDef to Vertex AI FunctionDeclaration
|
|
37
|
+
// Vertex AI expects { functionDeclarations: [...] } inside 'tools'
|
|
38
|
+
const functionDeclarations = tools.map(t => {
|
|
39
|
+
// Cast to any to avoid TypeScript infinite type instantiation error
|
|
40
|
+
const jsonSchema = zodToJsonSchema(t.parameters);
|
|
41
|
+
// Clean up schema for Vertex (remove $schema property)
|
|
42
|
+
delete jsonSchema.$schema;
|
|
43
|
+
return {
|
|
44
|
+
name: t.name,
|
|
45
|
+
description: t.description,
|
|
46
|
+
parameters: jsonSchema,
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
request.tools = [{ functionDeclarations }];
|
|
50
|
+
}
|
|
51
|
+
const result = await this.model.generateContent(request);
|
|
52
|
+
const response = result.response;
|
|
53
|
+
const candidate = response.candidates?.[0];
|
|
54
|
+
const content = candidate?.content;
|
|
55
|
+
let text = '';
|
|
56
|
+
const toolCalls = [];
|
|
57
|
+
if (content?.parts) {
|
|
58
|
+
for (const part of content.parts) {
|
|
59
|
+
if (part.text) {
|
|
60
|
+
text += part.text;
|
|
61
|
+
}
|
|
62
|
+
if (part.functionCall) {
|
|
63
|
+
toolCalls.push({
|
|
64
|
+
name: part.functionCall.name,
|
|
65
|
+
args: part.functionCall.args,
|
|
66
|
+
id: 'call_' + Math.random().toString(36).substr(2, 9) // Vertex doesn't consistently give IDs for single turn?
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const usage = response.usageMetadata;
|
|
72
|
+
return {
|
|
73
|
+
text,
|
|
74
|
+
toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
|
|
75
|
+
usage: {
|
|
76
|
+
promptTokens: usage?.promptTokenCount || 0,
|
|
77
|
+
completionTokens: usage?.candidatesTokenCount || 0
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
async *stream(prompt, tools) {
|
|
82
|
+
if (!this.model)
|
|
83
|
+
await this.init();
|
|
84
|
+
const resultStream = await this.model.generateContentStream(prompt);
|
|
85
|
+
for await (const chunk of resultStream.stream) {
|
|
86
|
+
const text = chunk.candidates?.[0].content.parts[0]?.text;
|
|
87
|
+
if (text) {
|
|
88
|
+
yield text;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=vertex-genai-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertex-genai-service.js","sourceRoot":"","sources":["../../../src/engine/ai/vertex-genai-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface Chunk {
|
|
2
|
+
text: string;
|
|
3
|
+
metadata: {
|
|
4
|
+
type: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
startLine: number;
|
|
7
|
+
endLine: number;
|
|
8
|
+
scope?: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare class SemanticChunker {
|
|
12
|
+
private parser;
|
|
13
|
+
constructor();
|
|
14
|
+
/**
|
|
15
|
+
* Parse code and extract semantic chunks (classes, functions, methods)
|
|
16
|
+
*/
|
|
17
|
+
chunk(code: string, lang: 'javascript' | 'typescript' | 'tsx'): Promise<Chunk[]>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/engine/chunker.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;;IAMvB;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,YAAY,GAAG,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;CA4DvF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import Parser from 'tree-sitter';
|
|
2
|
+
import Javascript from 'tree-sitter-javascript';
|
|
3
|
+
// TypeScript definitions need checking, often generic 'tree-sitter-typescript' package
|
|
4
|
+
// exports both typescript and tsx.
|
|
5
|
+
// For now, assuming standard CommonJS interoperability via default import or requires usually works in Node.
|
|
6
|
+
import { createRequire } from 'module';
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
const Typescript = require('tree-sitter-typescript').typescript;
|
|
9
|
+
const TSX = require('tree-sitter-typescript').tsx;
|
|
10
|
+
export class SemanticChunker {
|
|
11
|
+
parser;
|
|
12
|
+
constructor() {
|
|
13
|
+
this.parser = new Parser();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Parse code and extract semantic chunks (classes, functions, methods)
|
|
17
|
+
*/
|
|
18
|
+
async chunk(code, lang) {
|
|
19
|
+
switch (lang) {
|
|
20
|
+
case 'javascript':
|
|
21
|
+
this.parser.setLanguage(Javascript);
|
|
22
|
+
break;
|
|
23
|
+
case 'typescript':
|
|
24
|
+
this.parser.setLanguage(Typescript);
|
|
25
|
+
break;
|
|
26
|
+
case 'tsx':
|
|
27
|
+
this.parser.setLanguage(TSX);
|
|
28
|
+
break;
|
|
29
|
+
default: throw new Error(`Unsupported language: ${lang}`);
|
|
30
|
+
}
|
|
31
|
+
const tree = this.parser.parse(code);
|
|
32
|
+
const chunks = [];
|
|
33
|
+
// Simple query to find definitions
|
|
34
|
+
// Note: Query syntax depends on grammar.
|
|
35
|
+
// Need to handle errors if query fails.
|
|
36
|
+
try {
|
|
37
|
+
const query = new Parser.Query(this.parser.getLanguage(), `
|
|
38
|
+
(function_declaration name: (identifier) @name) @def
|
|
39
|
+
(class_declaration name: (identifier) @name) @def
|
|
40
|
+
(method_definition name: (property_identifier) @name) @def
|
|
41
|
+
(arrow_function) @def
|
|
42
|
+
`);
|
|
43
|
+
const matches = query.matches(tree.rootNode);
|
|
44
|
+
for (const match of matches) {
|
|
45
|
+
const defNode = match.captures.find(c => c.name === 'def')?.node;
|
|
46
|
+
const nameNode = match.captures.find(c => c.name === 'name')?.node;
|
|
47
|
+
if (defNode) {
|
|
48
|
+
chunks.push({
|
|
49
|
+
text: defNode.text,
|
|
50
|
+
metadata: {
|
|
51
|
+
type: defNode.type,
|
|
52
|
+
name: nameNode?.text || 'anonymous',
|
|
53
|
+
startLine: defNode.startPosition.row + 1,
|
|
54
|
+
endLine: defNode.endPosition.row + 1
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
console.warn('Query failed or grammar mismatch:', e);
|
|
62
|
+
// Fallback: entire file? or split by lines?
|
|
63
|
+
// For now, return whole as one chunk if parsing fails semantically.
|
|
64
|
+
chunks.push({
|
|
65
|
+
text: code,
|
|
66
|
+
metadata: { type: 'file', startLine: 1, endLine: code.split('\n').length }
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// Safety: If no chunks found (e.g. simple script without functions), add whole content
|
|
70
|
+
if (chunks.length === 0 && code.trim().length > 0) {
|
|
71
|
+
chunks.push({
|
|
72
|
+
text: code,
|
|
73
|
+
metadata: { type: 'script', startLine: 1, endLine: code.split('\n').length }
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return chunks;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/engine/chunker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Entry } from '@yuihub/core';
|
|
2
|
+
import { IVectorStore, SearchResult } from './vector-store-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* CompositeVectorStore
|
|
5
|
+
* Manages multiple VectorStore instances (Dual Embedding).
|
|
6
|
+
* - Writes to ALL stores (Fan-out).
|
|
7
|
+
* - Searches from ALL stores and merges using RRF.
|
|
8
|
+
*/
|
|
9
|
+
export declare class CompositeVectorStore implements IVectorStore {
|
|
10
|
+
private stores;
|
|
11
|
+
constructor(stores: IVectorStore[]);
|
|
12
|
+
init(): Promise<void>;
|
|
13
|
+
add(entries: Entry[]): Promise<void>;
|
|
14
|
+
isEmpty(): Promise<boolean>;
|
|
15
|
+
deleteBySource(source: string): Promise<number>;
|
|
16
|
+
search(query: string, limit?: number, filter?: {
|
|
17
|
+
tag?: string;
|
|
18
|
+
session?: string;
|
|
19
|
+
}): Promise<SearchResult[]>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=composite-vector-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composite-vector-store.d.ts","sourceRoot":"","sources":["../../src/engine/composite-vector-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAErE;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IACvD,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,YAAY,EAAE;IAI5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBpC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAM3B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM/C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,MAAM,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CA8BtH"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CompositeVectorStore
|
|
3
|
+
* Manages multiple VectorStore instances (Dual Embedding).
|
|
4
|
+
* - Writes to ALL stores (Fan-out).
|
|
5
|
+
* - Searches from ALL stores and merges using RRF.
|
|
6
|
+
*/
|
|
7
|
+
export class CompositeVectorStore {
|
|
8
|
+
stores;
|
|
9
|
+
constructor(stores) {
|
|
10
|
+
this.stores = stores;
|
|
11
|
+
}
|
|
12
|
+
async init() {
|
|
13
|
+
await Promise.all(this.stores.map(s => s.init()));
|
|
14
|
+
}
|
|
15
|
+
async add(entries) {
|
|
16
|
+
// Fan-out write with error collection
|
|
17
|
+
const errors = [];
|
|
18
|
+
await Promise.all(this.stores.map(async (s) => {
|
|
19
|
+
try {
|
|
20
|
+
await s.add(entries);
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
console.error(`[CompositeVectorStore] add failed for store:`, e);
|
|
24
|
+
errors.push(e);
|
|
25
|
+
}
|
|
26
|
+
}));
|
|
27
|
+
// If all stores failed, throw
|
|
28
|
+
if (errors.length === this.stores.length) {
|
|
29
|
+
throw new Error('All stores failed to add entries');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async isEmpty() {
|
|
33
|
+
// Return true if all stores are empty
|
|
34
|
+
const results = await Promise.all(this.stores.map(s => s.isEmpty()));
|
|
35
|
+
return results.every(r => r === true);
|
|
36
|
+
}
|
|
37
|
+
async deleteBySource(source) {
|
|
38
|
+
// Fan-out delete and sum results
|
|
39
|
+
const counts = await Promise.all(this.stores.map(s => s.deleteBySource(source)));
|
|
40
|
+
return counts.reduce((sum, c) => sum + c, 0);
|
|
41
|
+
}
|
|
42
|
+
async search(query, limit = 10, filter) {
|
|
43
|
+
// Hybrid Search: RRF
|
|
44
|
+
// 1. Parallel Search
|
|
45
|
+
const resultsPerStore = await Promise.all(this.stores.map(s => s.search(query, limit * 2, filter))); // Fetch deeper for fusing
|
|
46
|
+
// 2. RRF Fusion
|
|
47
|
+
// RRF score = sum(1 / (k + rank))
|
|
48
|
+
const K = 60;
|
|
49
|
+
const scores = new Map();
|
|
50
|
+
const docMap = new Map(); // Keep detailed doc
|
|
51
|
+
for (const results of resultsPerStore) {
|
|
52
|
+
results.forEach((doc, rank) => {
|
|
53
|
+
if (!docMap.has(doc.id)) {
|
|
54
|
+
docMap.set(doc.id, doc);
|
|
55
|
+
}
|
|
56
|
+
const currentScore = scores.get(doc.id) || 0;
|
|
57
|
+
const rrfContribution = 1.0 / (K + rank + 1);
|
|
58
|
+
scores.set(doc.id, currentScore + rrfContribution);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// 3. Sort & Limit
|
|
62
|
+
const sortedIds = Array.from(scores.entries())
|
|
63
|
+
.sort((a, b) => b[1] - a[1]) // Descending score
|
|
64
|
+
.slice(0, limit)
|
|
65
|
+
.map(([id]) => id);
|
|
66
|
+
return sortedIds.map(id => docMap.get(id));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=composite-vector-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composite-vector-store.js","sourceRoot":"","sources":["../../src/engine/composite-vector-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { IEmbeddingService, EmbeddingOutput } from './types.js';
|
|
2
|
+
export declare class LocalEmbeddingService implements IEmbeddingService {
|
|
3
|
+
private embedder;
|
|
4
|
+
private modelName;
|
|
5
|
+
constructor(modelName?: string);
|
|
6
|
+
init(): Promise<void>;
|
|
7
|
+
embed(text: string): Promise<EmbeddingOutput>;
|
|
8
|
+
getDimensions(): number;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=local-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-service.d.ts","sourceRoot":"","sources":["../../../src/engine/embeddings/local-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEhE,qBAAa,qBAAsB,YAAW,iBAAiB;IAC7D,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,SAAS,CAA2B;gBAEhC,SAAS,CAAC,EAAE,MAAM;IAIxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAYnD,aAAa,IAAI,MAAM;CASxB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { pipeline } from '@xenova/transformers';
|
|
2
|
+
export class LocalEmbeddingService {
|
|
3
|
+
embedder = null;
|
|
4
|
+
modelName = 'Xenova/bge-m3';
|
|
5
|
+
constructor(modelName) {
|
|
6
|
+
if (modelName)
|
|
7
|
+
this.modelName = modelName;
|
|
8
|
+
}
|
|
9
|
+
async init() {
|
|
10
|
+
if (this.embedder)
|
|
11
|
+
return;
|
|
12
|
+
// NOTE: This downloads the model on first run.
|
|
13
|
+
this.embedder = await pipeline('feature-extraction', this.modelName);
|
|
14
|
+
}
|
|
15
|
+
async embed(text) {
|
|
16
|
+
if (!this.embedder)
|
|
17
|
+
throw new Error('Embedder not initialized');
|
|
18
|
+
// Pooling: mean, Normalize: true is standard for sentence similarity
|
|
19
|
+
const output = await this.embedder(text, { pooling: 'mean', normalize: true });
|
|
20
|
+
return {
|
|
21
|
+
data: Array.from(output.data),
|
|
22
|
+
dimensions: output.dims ? output.dims[1] : output.data.length
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
getDimensions() {
|
|
26
|
+
// Default for all-MiniLM-L6-v2 is 384.
|
|
27
|
+
// If using bge-m3, it is 1024.
|
|
28
|
+
// Ideally this should be determined after init, but for now we hardcode or guess based on model name?
|
|
29
|
+
// Or we fetch it from embedder config if possible.
|
|
30
|
+
if (this.modelName.includes('MiniLM'))
|
|
31
|
+
return 384;
|
|
32
|
+
if (this.modelName.includes('bge-m3'))
|
|
33
|
+
return 1024;
|
|
34
|
+
return 384; // Fallback
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=local-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-service.js","sourceRoot":"","sources":["../../../src/engine/embeddings/local-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,MAAM,OAAO,qBAAqB;IACxB,QAAQ,GAAQ,IAAI,CAAC;IACrB,SAAS,GAAW,eAAe,CAAC;IAE5C,YAAY,SAAkB;QAC5B,IAAI,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,+CAA+C;QAC/C,IAAI,CAAC,QAAQ,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAEhE,qEAAqE;QACrE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/E,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAC7B,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM;SAC9D,CAAC;IACJ,CAAC;IAED,aAAa;QACX,wCAAwC;QACxC,+BAA+B;QAC/B,sGAAsG;QACtG,mDAAmD;QACnD,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,GAAG,CAAC;QAClD,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QACnD,OAAO,GAAG,CAAC,CAAC,WAAW;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface EmbeddingOutput {
|
|
2
|
+
data: number[];
|
|
3
|
+
dimensions: number;
|
|
4
|
+
}
|
|
5
|
+
export interface IEmbeddingService {
|
|
6
|
+
init(): Promise<void>;
|
|
7
|
+
embed(text: string): Promise<EmbeddingOutput>;
|
|
8
|
+
getDimensions(): number;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/engine/embeddings/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9C,aAAa,IAAI,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/engine/embeddings/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { IEmbeddingService, EmbeddingOutput } from './types.js';
|
|
2
|
+
export declare class VertexEmbeddingService implements IEmbeddingService {
|
|
3
|
+
private config;
|
|
4
|
+
private client;
|
|
5
|
+
private model;
|
|
6
|
+
constructor(config: any);
|
|
7
|
+
init(): Promise<void>;
|
|
8
|
+
embed(text: string): Promise<EmbeddingOutput>;
|
|
9
|
+
getDimensions(): number;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=vertex-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertex-service.d.ts","sourceRoot":"","sources":["../../../src/engine/embeddings/vertex-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGhE,qBAAa,sBAAuB,YAAW,iBAAiB;IAC9D,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,KAAK,CAAgC;gBAEjC,MAAM,EAAE,GAAG;IAIjB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBrB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAmBnD,aAAa,IAAI,MAAM;CAGxB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { VertexAI } from '@google-cloud/vertexai';
|
|
2
|
+
export class VertexEmbeddingService {
|
|
3
|
+
config;
|
|
4
|
+
client = null;
|
|
5
|
+
model = null;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
}
|
|
9
|
+
async init() {
|
|
10
|
+
if (!this.config.projectId || !this.config.location) {
|
|
11
|
+
if (!this.config.projectId)
|
|
12
|
+
throw new Error("Vertex AI requires 'projectId' in config or env");
|
|
13
|
+
if (!this.config.location)
|
|
14
|
+
throw new Error("Vertex AI requires 'location' in config or env");
|
|
15
|
+
}
|
|
16
|
+
this.client = new VertexAI({
|
|
17
|
+
project: this.config.projectId,
|
|
18
|
+
location: this.config.location,
|
|
19
|
+
});
|
|
20
|
+
// 'gemini-embedding-001' or user config
|
|
21
|
+
const modelName = this.config.embeddingModel || 'gemini-embedding-001';
|
|
22
|
+
this.model = this.client.getGenerativeModel({ model: modelName });
|
|
23
|
+
console.log(`[Vertex] Embedding Service Initialized: ${modelName} (${this.config.projectId}/${this.config.location})`);
|
|
24
|
+
}
|
|
25
|
+
async embed(text) {
|
|
26
|
+
if (!this.model)
|
|
27
|
+
await this.init();
|
|
28
|
+
// Cast to any to bypass TS error if embedContent is missing in type definition but present in runtime
|
|
29
|
+
// or if version mismatch.
|
|
30
|
+
const result = await this.model.embedContent(text);
|
|
31
|
+
// handling response structure
|
|
32
|
+
const embedding = result.embedding;
|
|
33
|
+
if (!embedding || !embedding.values) {
|
|
34
|
+
throw new Error('Vertex AI returned empty embedding');
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
data: embedding.values,
|
|
38
|
+
dimensions: embedding.values.length
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
getDimensions() {
|
|
42
|
+
return 768;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=vertex-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertex-service.js","sourceRoot":"","sources":["../../../src/engine/embeddings/vertex-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAmB,MAAM,wBAAwB,CAAC;AAEnE,MAAM,OAAO,sBAAsB;IACzB,MAAM,CAAM;IACZ,MAAM,GAAoB,IAAI,CAAC;IAC/B,KAAK,GAA2B,IAAI,CAAC;IAE7C,YAAY,MAAW;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YAC/F,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACjG,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC;YACvB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YAC9B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;SACjC,CAAC,CAAC;QAEH,wCAAwC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,sBAAsB,CAAC;QACvE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAElE,OAAO,CAAC,GAAG,CAAC,2CAA2C,SAAS,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAEnC,sGAAsG;QACtG,0BAA0B;QAC1B,MAAM,MAAM,GAAG,MAAO,IAAI,CAAC,KAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE5D,8BAA8B;QAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,MAAM;YACtB,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM;SACpC,CAAC;IACJ,CAAC;IAED,aAAa;QACX,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { IVectorStore } from './vector-store-types.js';
|
|
2
|
+
export declare class Indexer {
|
|
3
|
+
private queue;
|
|
4
|
+
private chunker;
|
|
5
|
+
private vectorStore;
|
|
6
|
+
constructor(vectorStore: IVectorStore);
|
|
7
|
+
enqueue(filePath: string): Promise<any>;
|
|
8
|
+
enqueueDelete(filePath: string): Promise<any>;
|
|
9
|
+
private worker;
|
|
10
|
+
private handleDelete;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=indexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../src/engine/indexer.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAOvD,qBAAa,OAAO;IAClB,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,WAAW,CAAe;gBAEtB,WAAW,EAAE,YAAY;IAO/B,OAAO,CAAC,QAAQ,EAAE,MAAM;IAIxB,aAAa,CAAC,QAAQ,EAAE,MAAM;YAItB,MAAM;YAsDN,YAAY;CAI3B"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import fastq from 'fastq';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import { globalMutex } from './lock.js';
|
|
4
|
+
import { SemanticChunker } from './chunker.js';
|
|
5
|
+
export class Indexer {
|
|
6
|
+
queue;
|
|
7
|
+
chunker;
|
|
8
|
+
vectorStore;
|
|
9
|
+
constructor(vectorStore) {
|
|
10
|
+
this.vectorStore = vectorStore;
|
|
11
|
+
this.chunker = new SemanticChunker();
|
|
12
|
+
// Concurrency 1 (Serialized)
|
|
13
|
+
this.queue = fastq.promise(this, this.worker, 1);
|
|
14
|
+
}
|
|
15
|
+
async enqueue(filePath) {
|
|
16
|
+
return this.queue.push({ filePath, type: 'index' });
|
|
17
|
+
}
|
|
18
|
+
async enqueueDelete(filePath) {
|
|
19
|
+
return this.queue.push({ filePath, type: 'delete' });
|
|
20
|
+
}
|
|
21
|
+
async worker(job) {
|
|
22
|
+
const { filePath, type } = job;
|
|
23
|
+
// Acquire Global Lock (Wait for API /save)
|
|
24
|
+
const release = await globalMutex.acquire();
|
|
25
|
+
try {
|
|
26
|
+
if (type === 'delete') {
|
|
27
|
+
await this.handleDelete(filePath);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
console.log(`[Indexer] Processing ${filePath}`);
|
|
31
|
+
if (!await fs.pathExists(filePath)) {
|
|
32
|
+
console.log(`[Indexer] File no longer exists: ${filePath}`);
|
|
33
|
+
await this.handleDelete(filePath);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
37
|
+
// Determining language from extension
|
|
38
|
+
let lang = 'typescript'; // Default
|
|
39
|
+
if (filePath.endsWith('.js') || filePath.endsWith('.mjs'))
|
|
40
|
+
lang = 'javascript';
|
|
41
|
+
else if (filePath.endsWith('.tsx'))
|
|
42
|
+
lang = 'tsx';
|
|
43
|
+
const chunks = await this.chunker.chunk(content, lang);
|
|
44
|
+
const entries = chunks.map(c => ({
|
|
45
|
+
id: '', // Generated on insert
|
|
46
|
+
mode: 'private',
|
|
47
|
+
date: new Date().toISOString(),
|
|
48
|
+
text: c.text,
|
|
49
|
+
source: filePath,
|
|
50
|
+
metadata: {
|
|
51
|
+
...c.metadata
|
|
52
|
+
}
|
|
53
|
+
}));
|
|
54
|
+
// Delete old entries for this source before adding new ones
|
|
55
|
+
const deleted = await this.vectorStore.deleteBySource(filePath);
|
|
56
|
+
if (deleted > 0) {
|
|
57
|
+
console.log(`[Indexer] Removed ${deleted} old entries for ${filePath}`);
|
|
58
|
+
}
|
|
59
|
+
await this.vectorStore.add(entries);
|
|
60
|
+
console.log(`[Indexer] Indexed ${entries.length} chunks from ${filePath}`);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.error(`[Indexer] Failed to index ${filePath}:`, error);
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
release();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async handleDelete(filePath) {
|
|
70
|
+
const deleted = await this.vectorStore.deleteBySource(filePath);
|
|
71
|
+
console.log(`[Indexer] Deleted ${deleted} entries for removed file: ${filePath}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/engine/indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub V1 Backend - Lock Utilities
|
|
3
|
+
* ReadWriteLock for LanceDB concurrency control
|
|
4
|
+
*/
|
|
5
|
+
import { RWLock } from 'async-rwlock';
|
|
6
|
+
export declare const rwLock: RWLock;
|
|
7
|
+
/**
|
|
8
|
+
* Execute function with write lock (exclusive)
|
|
9
|
+
* Use for: /save, /checkpoints, indexing
|
|
10
|
+
*/
|
|
11
|
+
export declare function withWriteLock<T>(fn: () => Promise<T>): Promise<T>;
|
|
12
|
+
/**
|
|
13
|
+
* Execute function with read lock (shared)
|
|
14
|
+
* Use for: /search, /export/context
|
|
15
|
+
*/
|
|
16
|
+
export declare function withReadLock<T>(fn: () => Promise<T>): Promise<T>;
|
|
17
|
+
/**
|
|
18
|
+
* Execute function with exponential backoff retry
|
|
19
|
+
*/
|
|
20
|
+
export declare function withRetry<T>(fn: () => Promise<T>, maxRetries?: number, baseDelayMs?: number): Promise<T>;
|
|
21
|
+
import { Mutex } from 'async-mutex';
|
|
22
|
+
/** @deprecated Use withWriteLock instead */
|
|
23
|
+
export declare const globalMutex: Mutex;
|
|
24
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/engine/lock.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtC,eAAO,MAAM,MAAM,QAAe,CAAC;AAEnC;;;GAGG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOvE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOtE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,UAAU,SAAI,EACd,WAAW,SAAM,GAChB,OAAO,CAAC,CAAC,CAAC,CAiBZ;AAGD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,4CAA4C;AAC5C,eAAO,MAAM,WAAW,OAAc,CAAC"}
|