@abhinav2203/coderag 0.1.1
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 +201 -0
- package/README.md +196 -0
- package/dist/adapters/codeflow-core.d.ts +10 -0
- package/dist/adapters/codeflow-core.js +212 -0
- package/dist/adapters/codeflow-core.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +179 -0
- package/dist/cli.js.map +1 -0
- package/dist/errors/index.d.ts +17 -0
- package/dist/errors/index.js +35 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/documents.d.ts +16 -0
- package/dist/indexer/documents.js +148 -0
- package/dist/indexer/documents.js.map +1 -0
- package/dist/indexer/embedder.d.ts +7 -0
- package/dist/indexer/embedder.js +12 -0
- package/dist/indexer/embedder.js.map +1 -0
- package/dist/indexer/git-hook.d.ts +2 -0
- package/dist/indexer/git-hook.js +53 -0
- package/dist/indexer/git-hook.js.map +1 -0
- package/dist/indexer/indexer.d.ts +22 -0
- package/dist/indexer/indexer.js +108 -0
- package/dist/indexer/indexer.js.map +1 -0
- package/dist/llm/context-builder.d.ts +7 -0
- package/dist/llm/context-builder.js +93 -0
- package/dist/llm/context-builder.js.map +1 -0
- package/dist/llm/prompt.d.ts +3 -0
- package/dist/llm/prompt.js +80 -0
- package/dist/llm/prompt.js.map +1 -0
- package/dist/llm/transports.d.ts +23 -0
- package/dist/llm/transports.js +271 -0
- package/dist/llm/transports.js.map +1 -0
- package/dist/mcp/server.d.ts +10 -0
- package/dist/mcp/server.js +70 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/retrieval/page-index.d.ts +3 -0
- package/dist/retrieval/page-index.js +26 -0
- package/dist/retrieval/page-index.js.map +1 -0
- package/dist/retrieval/search.d.ts +20 -0
- package/dist/retrieval/search.js +164 -0
- package/dist/retrieval/search.js.map +1 -0
- package/dist/retrieval/traversal.d.ts +6 -0
- package/dist/retrieval/traversal.js +29 -0
- package/dist/retrieval/traversal.js.map +1 -0
- package/dist/service/coderag.d.ts +58 -0
- package/dist/service/coderag.js +208 -0
- package/dist/service/coderag.js.map +1 -0
- package/dist/service/config.d.ts +13 -0
- package/dist/service/config.js +130 -0
- package/dist/service/config.js.map +1 -0
- package/dist/service/http-metrics.d.ts +8 -0
- package/dist/service/http-metrics.js +36 -0
- package/dist/service/http-metrics.js.map +1 -0
- package/dist/service/http.d.ts +11 -0
- package/dist/service/http.js +262 -0
- package/dist/service/http.js.map +1 -0
- package/dist/store/file-cache.d.ts +6 -0
- package/dist/store/file-cache.js +24 -0
- package/dist/store/file-cache.js.map +1 -0
- package/dist/store/index-lock.d.ts +14 -0
- package/dist/store/index-lock.js +112 -0
- package/dist/store/index-lock.js.map +1 -0
- package/dist/store/manifest-store.d.ts +16 -0
- package/dist/store/manifest-store.js +49 -0
- package/dist/store/manifest-store.js.map +1 -0
- package/dist/store/vector-store.d.ts +18 -0
- package/dist/store/vector-store.js +140 -0
- package/dist/store/vector-store.js.map +1 -0
- package/dist/types.d.ts +251 -0
- package/dist/types.js +63 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/filesystem.d.ts +8 -0
- package/dist/utils/filesystem.js +38 -0
- package/dist/utils/filesystem.js.map +1 -0
- package/dist/utils/logger.d.ts +2 -0
- package/dist/utils/logger.js +19 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/text.d.ts +8 -0
- package/dist/utils/text.js +151 -0
- package/dist/utils/text.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { IndexingError } from "../errors/index.js";
|
|
5
|
+
import { ensureDir, fileExists, readJson } from "../utils/filesystem.js";
|
|
6
|
+
const LOCK_FILE_NAME = "index.lock.json";
|
|
7
|
+
const sleep = async (durationMs) => {
|
|
8
|
+
await new Promise((resolve) => setTimeout(resolve, durationMs));
|
|
9
|
+
};
|
|
10
|
+
const isAlreadyExistsError = (error) => error instanceof Error && "code" in error && error.code === "EEXIST";
|
|
11
|
+
const buildLockMetadata = (reason) => ({
|
|
12
|
+
pid: process.pid,
|
|
13
|
+
host: os.hostname(),
|
|
14
|
+
reason,
|
|
15
|
+
acquiredAt: new Date().toISOString()
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* Coordinates access to the shared on-disk index state across processes.
|
|
19
|
+
*/
|
|
20
|
+
export class IndexLock {
|
|
21
|
+
config;
|
|
22
|
+
logger;
|
|
23
|
+
lockFilePath;
|
|
24
|
+
constructor(storageRoot, config, logger) {
|
|
25
|
+
this.config = config;
|
|
26
|
+
this.logger = logger;
|
|
27
|
+
this.lockFilePath = path.join(storageRoot, LOCK_FILE_NAME);
|
|
28
|
+
}
|
|
29
|
+
async withLock(reason, action) {
|
|
30
|
+
const releaseLock = await this.acquire(reason);
|
|
31
|
+
try {
|
|
32
|
+
return await action();
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
await releaseLock();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async waitForRelease() {
|
|
39
|
+
const startTime = Date.now();
|
|
40
|
+
let waited = false;
|
|
41
|
+
while (await fileExists(this.lockFilePath)) {
|
|
42
|
+
waited = true;
|
|
43
|
+
await this.clearStaleLock();
|
|
44
|
+
if (!(await fileExists(this.lockFilePath))) {
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
if (Date.now() - startTime > this.config.timeoutMs) {
|
|
48
|
+
throw new IndexingError("Timed out while waiting for the repository index lock to be released.", {
|
|
49
|
+
lockFilePath: this.lockFilePath
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
await sleep(this.config.pollMs);
|
|
53
|
+
}
|
|
54
|
+
return waited;
|
|
55
|
+
}
|
|
56
|
+
async acquire(reason) {
|
|
57
|
+
const startTime = Date.now();
|
|
58
|
+
try {
|
|
59
|
+
await ensureDir(path.dirname(this.lockFilePath));
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
throw new IndexingError("Failed to prepare the repository index lock directory.", {
|
|
63
|
+
lockFilePath: this.lockFilePath
|
|
64
|
+
}, { cause: error });
|
|
65
|
+
}
|
|
66
|
+
while (true) {
|
|
67
|
+
try {
|
|
68
|
+
const handle = await fs.open(this.lockFilePath, "wx");
|
|
69
|
+
const metadata = buildLockMetadata(reason);
|
|
70
|
+
await handle.writeFile(`${JSON.stringify(metadata, null, 2)}\n`, "utf8");
|
|
71
|
+
await handle.close();
|
|
72
|
+
return async () => {
|
|
73
|
+
await fs.rm(this.lockFilePath, { force: true });
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (!isAlreadyExistsError(error)) {
|
|
78
|
+
throw new IndexingError("Failed to acquire the repository index lock.", {
|
|
79
|
+
lockFilePath: this.lockFilePath
|
|
80
|
+
}, { cause: error });
|
|
81
|
+
}
|
|
82
|
+
await this.clearStaleLock();
|
|
83
|
+
if (Date.now() - startTime > this.config.timeoutMs) {
|
|
84
|
+
throw new IndexingError("Timed out while waiting to acquire the repository index lock.", {
|
|
85
|
+
lockFilePath: this.lockFilePath
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
await sleep(this.config.pollMs);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async clearStaleLock() {
|
|
93
|
+
const stats = await fs.stat(this.lockFilePath).catch(() => null);
|
|
94
|
+
if (!stats) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const ageMs = Date.now() - stats.mtimeMs;
|
|
98
|
+
if (ageMs <= this.config.staleMs) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const metadata = await readJson(this.lockFilePath).catch(() => null);
|
|
102
|
+
this.logger?.warn("Removing stale CodeRag index lock.", {
|
|
103
|
+
lockFilePath: this.lockFilePath,
|
|
104
|
+
ageMs,
|
|
105
|
+
pid: metadata?.pid,
|
|
106
|
+
host: metadata?.host,
|
|
107
|
+
reason: metadata?.reason
|
|
108
|
+
});
|
|
109
|
+
await fs.rm(this.lockFilePath, { force: true });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=index-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-lock.js","sourceRoot":"","sources":["../../src/store/index-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { GraphSnapshot, IndexManifest, IndexedNodeDocument } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Persists the graph snapshot, manifest, and node documents used by CodeRag.
|
|
4
|
+
*/
|
|
5
|
+
export declare class ManifestStore {
|
|
6
|
+
private readonly manifestPath;
|
|
7
|
+
private readonly snapshotPath;
|
|
8
|
+
private readonly documentsPath;
|
|
9
|
+
constructor(storageRoot: string);
|
|
10
|
+
loadManifest(): Promise<IndexManifest | null>;
|
|
11
|
+
saveManifest(manifest: IndexManifest): Promise<void>;
|
|
12
|
+
loadSnapshot(): Promise<GraphSnapshot | null>;
|
|
13
|
+
saveSnapshot(snapshot: GraphSnapshot): Promise<void>;
|
|
14
|
+
loadDocuments(): Promise<Record<string, IndexedNodeDocument>>;
|
|
15
|
+
saveDocuments(documents: Record<string, IndexedNodeDocument>): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { IndexingError } from "../errors/index.js";
|
|
3
|
+
import { fileExists, readJson, writeJson } from "../utils/filesystem.js";
|
|
4
|
+
const MANIFEST_FILE = "index-manifest.json";
|
|
5
|
+
const SNAPSHOT_FILE = "graph-snapshot.json";
|
|
6
|
+
const DOCUMENTS_FILE = "documents.json";
|
|
7
|
+
const loadOptionalJson = async (filePath) => {
|
|
8
|
+
if (!(await fileExists(filePath))) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
return await readJson(filePath);
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
throw new IndexingError("Failed to read persisted CodeRag state.", { filePath }, { cause: error });
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Persists the graph snapshot, manifest, and node documents used by CodeRag.
|
|
20
|
+
*/
|
|
21
|
+
export class ManifestStore {
|
|
22
|
+
manifestPath;
|
|
23
|
+
snapshotPath;
|
|
24
|
+
documentsPath;
|
|
25
|
+
constructor(storageRoot) {
|
|
26
|
+
this.manifestPath = path.join(storageRoot, MANIFEST_FILE);
|
|
27
|
+
this.snapshotPath = path.join(storageRoot, SNAPSHOT_FILE);
|
|
28
|
+
this.documentsPath = path.join(storageRoot, DOCUMENTS_FILE);
|
|
29
|
+
}
|
|
30
|
+
async loadManifest() {
|
|
31
|
+
return loadOptionalJson(this.manifestPath);
|
|
32
|
+
}
|
|
33
|
+
async saveManifest(manifest) {
|
|
34
|
+
await writeJson(this.manifestPath, manifest);
|
|
35
|
+
}
|
|
36
|
+
async loadSnapshot() {
|
|
37
|
+
return loadOptionalJson(this.snapshotPath);
|
|
38
|
+
}
|
|
39
|
+
async saveSnapshot(snapshot) {
|
|
40
|
+
await writeJson(this.snapshotPath, snapshot);
|
|
41
|
+
}
|
|
42
|
+
async loadDocuments() {
|
|
43
|
+
return (await loadOptionalJson(this.documentsPath)) ?? {};
|
|
44
|
+
}
|
|
45
|
+
async saveDocuments(documents) {
|
|
46
|
+
await writeJson(this.documentsPath, documents);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=manifest-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-store.js","sourceRoot":"","sources":["../../src/store/manifest-store.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEzE,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAC5C,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAC5C,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAExC,MAAM,gBAAgB,GAAG,KAAK,EAAS,QAAgB,EAAyB,EAAE;IAChF,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAQ,QAAQ,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CAAC,yCAAyC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACrG,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,aAAa;IACP,YAAY,CAAS;IACrB,YAAY,CAAS;IACrB,aAAa,CAAS;IAEvC,YAAY,WAAmB;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC1D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC1D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,gBAAgB,CAAgB,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAuB;QACxC,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,gBAAgB,CAAgB,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAuB;QACxC,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,CAAC,MAAM,gBAAgB,CAAsC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;IACjG,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAA8C;QAChE,MAAM,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { IndexedNodeDocument, VectorStore } from "../types.js";
|
|
2
|
+
export declare const toRow: (record: IndexedNodeDocument) => Record<string, unknown>;
|
|
3
|
+
export declare const fromRow: (record: Record<string, unknown>) => IndexedNodeDocument;
|
|
4
|
+
export declare class LanceVectorStore implements VectorStore {
|
|
5
|
+
private readonly dbPath;
|
|
6
|
+
private connectionPromise?;
|
|
7
|
+
constructor(storageRoot: string);
|
|
8
|
+
private getConnection;
|
|
9
|
+
private getTable;
|
|
10
|
+
private getAllRows;
|
|
11
|
+
reset(records: IndexedNodeDocument[]): Promise<void>;
|
|
12
|
+
deleteByNodeIds(nodeIds: string[]): Promise<void>;
|
|
13
|
+
upsert(records: IndexedNodeDocument[]): Promise<void>;
|
|
14
|
+
search(queryVector: number[], limit: number): Promise<IndexedNodeDocument[]>;
|
|
15
|
+
get(nodeId: string): Promise<IndexedNodeDocument | null>;
|
|
16
|
+
getMany(nodeIds: string[]): Promise<IndexedNodeDocument[]>;
|
|
17
|
+
close(): Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import * as lancedb from "@lancedb/lancedb";
|
|
3
|
+
import { ensureDir } from "../utils/filesystem.js";
|
|
4
|
+
const TABLE_NAME = "node_documents";
|
|
5
|
+
const DELETE_ALL_FILTER = "\"nodeId\" IS NOT NULL";
|
|
6
|
+
export const toRow = (record) => ({
|
|
7
|
+
nodeId: record.nodeId,
|
|
8
|
+
name: record.name,
|
|
9
|
+
kind: record.kind,
|
|
10
|
+
filePath: record.filePath,
|
|
11
|
+
summary: record.summary,
|
|
12
|
+
signature: record.signature ?? "",
|
|
13
|
+
doc: record.doc,
|
|
14
|
+
vector: record.vector,
|
|
15
|
+
startLine: record.startLine,
|
|
16
|
+
endLine: record.endLine
|
|
17
|
+
});
|
|
18
|
+
export const fromRow = (record) => ({
|
|
19
|
+
nodeId: String(record.nodeId),
|
|
20
|
+
name: String(record.name),
|
|
21
|
+
kind: record.kind,
|
|
22
|
+
filePath: String(record.filePath),
|
|
23
|
+
summary: String(record.summary),
|
|
24
|
+
signature: String(record.signature ?? ""),
|
|
25
|
+
doc: String(record.doc),
|
|
26
|
+
vector: Array.isArray(record.vector) ? record.vector.map(Number) : Array.from(record.vector).map(Number),
|
|
27
|
+
startLine: Number(record.startLine),
|
|
28
|
+
endLine: Number(record.endLine)
|
|
29
|
+
});
|
|
30
|
+
export class LanceVectorStore {
|
|
31
|
+
dbPath;
|
|
32
|
+
connectionPromise;
|
|
33
|
+
constructor(storageRoot) {
|
|
34
|
+
this.dbPath = path.join(storageRoot, "lancedb");
|
|
35
|
+
}
|
|
36
|
+
async getConnection() {
|
|
37
|
+
if (!this.connectionPromise) {
|
|
38
|
+
this.connectionPromise = (async () => {
|
|
39
|
+
await ensureDir(this.dbPath);
|
|
40
|
+
return lancedb.connect(this.dbPath);
|
|
41
|
+
})();
|
|
42
|
+
}
|
|
43
|
+
return this.connectionPromise;
|
|
44
|
+
}
|
|
45
|
+
async getTable() {
|
|
46
|
+
const connection = await this.getConnection();
|
|
47
|
+
const tableNames = await connection.tableNames();
|
|
48
|
+
if (!tableNames.includes(TABLE_NAME)) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return connection.openTable(TABLE_NAME);
|
|
52
|
+
}
|
|
53
|
+
async getAllRows() {
|
|
54
|
+
const table = await this.getTable();
|
|
55
|
+
if (!table) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
const rows = await table.query().toArray();
|
|
59
|
+
return rows.map((row) => fromRow(row));
|
|
60
|
+
}
|
|
61
|
+
async reset(records) {
|
|
62
|
+
if (records.length === 0) {
|
|
63
|
+
const table = await this.getTable();
|
|
64
|
+
if (!table) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
await table.delete(DELETE_ALL_FILTER);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const connection = await this.getConnection();
|
|
71
|
+
const tableNames = await connection.tableNames();
|
|
72
|
+
if (!tableNames.includes(TABLE_NAME)) {
|
|
73
|
+
await connection.createTable(TABLE_NAME, records.map(toRow));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const table = await connection.openTable(TABLE_NAME);
|
|
77
|
+
await table.add(records.map(toRow), { mode: "overwrite" });
|
|
78
|
+
}
|
|
79
|
+
async deleteByNodeIds(nodeIds) {
|
|
80
|
+
if (nodeIds.length === 0) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const table = await this.getTable();
|
|
84
|
+
if (!table) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const remainingRows = (await this.getAllRows()).filter((row) => !nodeIds.includes(row.nodeId));
|
|
88
|
+
if (remainingRows.length === 0) {
|
|
89
|
+
await table.delete(DELETE_ALL_FILTER);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
await table.add(remainingRows.map(toRow), { mode: "overwrite" });
|
|
93
|
+
}
|
|
94
|
+
async upsert(records) {
|
|
95
|
+
if (records.length === 0) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const table = await this.getTable();
|
|
99
|
+
if (!table) {
|
|
100
|
+
await this.reset(records);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const mergedRows = new Map((await this.getAllRows()).map((row) => [row.nodeId, row]));
|
|
104
|
+
for (const record of records) {
|
|
105
|
+
mergedRows.set(record.nodeId, record);
|
|
106
|
+
}
|
|
107
|
+
await table.add([...mergedRows.values()].map(toRow), { mode: "overwrite" });
|
|
108
|
+
}
|
|
109
|
+
async search(queryVector, limit) {
|
|
110
|
+
const table = await this.getTable();
|
|
111
|
+
if (!table) {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
const rows = await table.vectorSearch(Float32Array.from(queryVector)).limit(limit).toArray();
|
|
115
|
+
return rows.map((row) => fromRow(row));
|
|
116
|
+
}
|
|
117
|
+
async get(nodeId) {
|
|
118
|
+
const results = await this.getMany([nodeId]);
|
|
119
|
+
return results[0] ?? null;
|
|
120
|
+
}
|
|
121
|
+
async getMany(nodeIds) {
|
|
122
|
+
if (nodeIds.length === 0) {
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
const table = await this.getTable();
|
|
126
|
+
if (!table) {
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
const rows = await table.query().limit(Math.max(nodeIds.length * 8, 32)).toArray();
|
|
130
|
+
const requestedNodeIds = new Set(nodeIds);
|
|
131
|
+
return rows.map((row) => fromRow(row)).filter((row) => requestedNodeIds.has(row.nodeId));
|
|
132
|
+
}
|
|
133
|
+
async close() {
|
|
134
|
+
const table = await this.getTable();
|
|
135
|
+
if (table?.close) {
|
|
136
|
+
await table.close();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=vector-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-store.js","sourceRoot":"","sources":["../../src/store/vector-store.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import type { BlueprintEdge, BlueprintGraph, BlueprintNode, BlueprintNodeKind } from "@abhinav2203/codeflow-core/schema";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export declare const customHttpFormatSchema: z.ZodEnum<{
|
|
4
|
+
json: "json";
|
|
5
|
+
ndjson: "ndjson";
|
|
6
|
+
sse: "sse";
|
|
7
|
+
}>;
|
|
8
|
+
export type CustomHttpFormat = z.infer<typeof customHttpFormatSchema>;
|
|
9
|
+
export declare const llmTransportKindSchema: z.ZodEnum<{
|
|
10
|
+
"openai-compatible": "openai-compatible";
|
|
11
|
+
"custom-http": "custom-http";
|
|
12
|
+
}>;
|
|
13
|
+
export type LlmTransportKind = z.infer<typeof llmTransportKindSchema>;
|
|
14
|
+
export declare const retrievalConfigSchema: z.ZodObject<{
|
|
15
|
+
topK: z.ZodDefault<z.ZodNumber>;
|
|
16
|
+
rerankK: z.ZodDefault<z.ZodNumber>;
|
|
17
|
+
maxContextChars: z.ZodDefault<z.ZodNumber>;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
export type RetrievalConfig = z.infer<typeof retrievalConfigSchema>;
|
|
20
|
+
export declare const traversalConfigSchema: z.ZodObject<{
|
|
21
|
+
defaultDepth: z.ZodDefault<z.ZodNumber>;
|
|
22
|
+
maxDepth: z.ZodDefault<z.ZodNumber>;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
export type TraversalConfig = z.infer<typeof traversalConfigSchema>;
|
|
25
|
+
export declare const lockingConfigSchema: z.ZodObject<{
|
|
26
|
+
timeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
27
|
+
pollMs: z.ZodDefault<z.ZodNumber>;
|
|
28
|
+
staleMs: z.ZodDefault<z.ZodNumber>;
|
|
29
|
+
}, z.core.$strip>;
|
|
30
|
+
export type LockingConfig = z.infer<typeof lockingConfigSchema>;
|
|
31
|
+
export declare const serviceConfigSchema: z.ZodObject<{
|
|
32
|
+
host: z.ZodDefault<z.ZodString>;
|
|
33
|
+
port: z.ZodDefault<z.ZodNumber>;
|
|
34
|
+
apiKey: z.ZodOptional<z.ZodString>;
|
|
35
|
+
}, z.core.$strip>;
|
|
36
|
+
export type ServiceConfig = z.infer<typeof serviceConfigSchema>;
|
|
37
|
+
export declare const llmConfigSchema: z.ZodObject<{
|
|
38
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
39
|
+
transport: z.ZodDefault<z.ZodEnum<{
|
|
40
|
+
"openai-compatible": "openai-compatible";
|
|
41
|
+
"custom-http": "custom-http";
|
|
42
|
+
}>>;
|
|
43
|
+
baseUrl: z.ZodOptional<z.ZodString>;
|
|
44
|
+
model: z.ZodOptional<z.ZodString>;
|
|
45
|
+
apiKey: z.ZodOptional<z.ZodString>;
|
|
46
|
+
timeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
47
|
+
customHttpFormat: z.ZodDefault<z.ZodEnum<{
|
|
48
|
+
json: "json";
|
|
49
|
+
ndjson: "ndjson";
|
|
50
|
+
sse: "sse";
|
|
51
|
+
}>>;
|
|
52
|
+
headers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
53
|
+
}, z.core.$strip>;
|
|
54
|
+
export type SerializableLlmConfig = z.infer<typeof llmConfigSchema>;
|
|
55
|
+
export type LlmConfig = SerializableLlmConfig;
|
|
56
|
+
export declare const serializableConfigSchema: z.ZodObject<{
|
|
57
|
+
repoPath: z.ZodString;
|
|
58
|
+
storageRoot: z.ZodDefault<z.ZodString>;
|
|
59
|
+
retrieval: z.ZodDefault<z.ZodObject<{
|
|
60
|
+
topK: z.ZodDefault<z.ZodNumber>;
|
|
61
|
+
rerankK: z.ZodDefault<z.ZodNumber>;
|
|
62
|
+
maxContextChars: z.ZodDefault<z.ZodNumber>;
|
|
63
|
+
}, z.core.$strip>>;
|
|
64
|
+
traversal: z.ZodDefault<z.ZodObject<{
|
|
65
|
+
defaultDepth: z.ZodDefault<z.ZodNumber>;
|
|
66
|
+
maxDepth: z.ZodDefault<z.ZodNumber>;
|
|
67
|
+
}, z.core.$strip>>;
|
|
68
|
+
locking: z.ZodDefault<z.ZodObject<{
|
|
69
|
+
timeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
70
|
+
pollMs: z.ZodDefault<z.ZodNumber>;
|
|
71
|
+
staleMs: z.ZodDefault<z.ZodNumber>;
|
|
72
|
+
}, z.core.$strip>>;
|
|
73
|
+
service: z.ZodDefault<z.ZodObject<{
|
|
74
|
+
host: z.ZodDefault<z.ZodString>;
|
|
75
|
+
port: z.ZodDefault<z.ZodNumber>;
|
|
76
|
+
apiKey: z.ZodOptional<z.ZodString>;
|
|
77
|
+
}, z.core.$strip>>;
|
|
78
|
+
llm: z.ZodDefault<z.ZodObject<{
|
|
79
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
80
|
+
transport: z.ZodDefault<z.ZodEnum<{
|
|
81
|
+
"openai-compatible": "openai-compatible";
|
|
82
|
+
"custom-http": "custom-http";
|
|
83
|
+
}>>;
|
|
84
|
+
baseUrl: z.ZodOptional<z.ZodString>;
|
|
85
|
+
model: z.ZodOptional<z.ZodString>;
|
|
86
|
+
apiKey: z.ZodOptional<z.ZodString>;
|
|
87
|
+
timeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
88
|
+
customHttpFormat: z.ZodDefault<z.ZodEnum<{
|
|
89
|
+
json: "json";
|
|
90
|
+
ndjson: "ndjson";
|
|
91
|
+
sse: "sse";
|
|
92
|
+
}>>;
|
|
93
|
+
headers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
94
|
+
}, z.core.$strip>>;
|
|
95
|
+
docsPath: z.ZodOptional<z.ZodString>;
|
|
96
|
+
}, z.core.$strip>;
|
|
97
|
+
export type SerializableCodeRagConfig = z.infer<typeof serializableConfigSchema>;
|
|
98
|
+
export interface Logger {
|
|
99
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
100
|
+
info(message: string, context?: Record<string, unknown>): void;
|
|
101
|
+
warn(message: string, context?: Record<string, unknown>): void;
|
|
102
|
+
error(message: string, context?: Record<string, unknown>): void;
|
|
103
|
+
}
|
|
104
|
+
export interface SourceSpan {
|
|
105
|
+
nodeId: string;
|
|
106
|
+
filePath: string;
|
|
107
|
+
startLine: number;
|
|
108
|
+
endLine: number;
|
|
109
|
+
symbol?: string;
|
|
110
|
+
}
|
|
111
|
+
export interface CallSite {
|
|
112
|
+
edgeKey: string;
|
|
113
|
+
fromNodeId: string;
|
|
114
|
+
toNodeId: string;
|
|
115
|
+
filePath: string;
|
|
116
|
+
lineNumbers: number[];
|
|
117
|
+
expressions: string[];
|
|
118
|
+
}
|
|
119
|
+
export interface IndexedNodeDocument {
|
|
120
|
+
nodeId: string;
|
|
121
|
+
name: string;
|
|
122
|
+
kind: BlueprintNodeKind;
|
|
123
|
+
filePath: string;
|
|
124
|
+
summary: string;
|
|
125
|
+
signature?: string;
|
|
126
|
+
doc: string;
|
|
127
|
+
sourceText?: string;
|
|
128
|
+
vector: number[];
|
|
129
|
+
startLine: number;
|
|
130
|
+
endLine: number;
|
|
131
|
+
}
|
|
132
|
+
export interface GraphSnapshot {
|
|
133
|
+
provider: string;
|
|
134
|
+
repoPath: string;
|
|
135
|
+
generatedAt: string;
|
|
136
|
+
graph: BlueprintGraph;
|
|
137
|
+
sourceSpans: Record<string, SourceSpan>;
|
|
138
|
+
callSites: Record<string, CallSite>;
|
|
139
|
+
}
|
|
140
|
+
export interface IndexManifestNodeEntry {
|
|
141
|
+
nodeId: string;
|
|
142
|
+
filePath: string;
|
|
143
|
+
docHash: string;
|
|
144
|
+
fileHash: string;
|
|
145
|
+
}
|
|
146
|
+
export interface IndexManifest {
|
|
147
|
+
generatedAt: string;
|
|
148
|
+
repoPath: string;
|
|
149
|
+
provider: string;
|
|
150
|
+
nodes: Record<string, IndexManifestNodeEntry>;
|
|
151
|
+
fileHashes: Record<string, string>;
|
|
152
|
+
}
|
|
153
|
+
export interface QueryOptions {
|
|
154
|
+
depth?: number;
|
|
155
|
+
includeAnswer?: boolean;
|
|
156
|
+
onToken?: (token: string) => void;
|
|
157
|
+
}
|
|
158
|
+
export type AnswerMode = "llm" | "context-only";
|
|
159
|
+
export interface RetrievedNodeContext {
|
|
160
|
+
nodeId: string;
|
|
161
|
+
name: string;
|
|
162
|
+
kind: BlueprintNodeKind;
|
|
163
|
+
filePath: string;
|
|
164
|
+
fullFileContent: string;
|
|
165
|
+
startLine: number;
|
|
166
|
+
endLine: number;
|
|
167
|
+
callSiteLines: number[];
|
|
168
|
+
doc: string;
|
|
169
|
+
relationship: "primary" | "calls" | "called-by";
|
|
170
|
+
}
|
|
171
|
+
export interface ContextPackage {
|
|
172
|
+
question: string;
|
|
173
|
+
answerMode: AnswerMode;
|
|
174
|
+
primaryNode: RetrievedNodeContext | null;
|
|
175
|
+
relatedNodes: RetrievedNodeContext[];
|
|
176
|
+
graphSummary: string;
|
|
177
|
+
warnings: string[];
|
|
178
|
+
}
|
|
179
|
+
export interface QueryResult {
|
|
180
|
+
question: string;
|
|
181
|
+
answerMode: AnswerMode;
|
|
182
|
+
answer: string;
|
|
183
|
+
context: ContextPackage;
|
|
184
|
+
}
|
|
185
|
+
export interface LookupResult {
|
|
186
|
+
node: BlueprintNode;
|
|
187
|
+
span?: SourceSpan;
|
|
188
|
+
outgoingEdges: BlueprintEdge[];
|
|
189
|
+
incomingEdges: BlueprintEdge[];
|
|
190
|
+
doc?: IndexedNodeDocument;
|
|
191
|
+
}
|
|
192
|
+
export interface ExplainResult {
|
|
193
|
+
node: BlueprintNode;
|
|
194
|
+
summary: string;
|
|
195
|
+
dependencies: BlueprintNode[];
|
|
196
|
+
dependents: BlueprintNode[];
|
|
197
|
+
span?: SourceSpan;
|
|
198
|
+
}
|
|
199
|
+
export interface ImpactResult {
|
|
200
|
+
node: BlueprintNode;
|
|
201
|
+
impactedNodes: BlueprintNode[];
|
|
202
|
+
graphSummary: string;
|
|
203
|
+
}
|
|
204
|
+
export interface IndexSummary {
|
|
205
|
+
graph: BlueprintGraph;
|
|
206
|
+
manifest: IndexManifest;
|
|
207
|
+
snapshot: GraphSnapshot;
|
|
208
|
+
indexedNodeCount: number;
|
|
209
|
+
}
|
|
210
|
+
export interface EmbeddingProvider {
|
|
211
|
+
readonly name: string;
|
|
212
|
+
readonly dimensions: number;
|
|
213
|
+
embed(text: string): Promise<number[]>;
|
|
214
|
+
}
|
|
215
|
+
export interface VectorStore {
|
|
216
|
+
reset(records: IndexedNodeDocument[]): Promise<void>;
|
|
217
|
+
deleteByNodeIds(nodeIds: string[]): Promise<void>;
|
|
218
|
+
upsert(records: IndexedNodeDocument[]): Promise<void>;
|
|
219
|
+
search(queryVector: number[], limit: number): Promise<IndexedNodeDocument[]>;
|
|
220
|
+
get(nodeId: string): Promise<IndexedNodeDocument | null>;
|
|
221
|
+
getMany(nodeIds: string[]): Promise<IndexedNodeDocument[]>;
|
|
222
|
+
close(): Promise<void>;
|
|
223
|
+
}
|
|
224
|
+
export interface LlmRequest {
|
|
225
|
+
question: string;
|
|
226
|
+
messages: Array<{
|
|
227
|
+
role: "system" | "user" | "assistant";
|
|
228
|
+
content: string;
|
|
229
|
+
}>;
|
|
230
|
+
context: ContextPackage;
|
|
231
|
+
model?: string;
|
|
232
|
+
stream: boolean;
|
|
233
|
+
}
|
|
234
|
+
export interface LlmResponse {
|
|
235
|
+
answer: string;
|
|
236
|
+
}
|
|
237
|
+
export interface LlmTransport {
|
|
238
|
+
readonly kind: LlmTransportKind;
|
|
239
|
+
generate(request: LlmRequest, onToken?: (token: string) => void): Promise<LlmResponse>;
|
|
240
|
+
}
|
|
241
|
+
export interface GraphProvider {
|
|
242
|
+
readonly name: string;
|
|
243
|
+
analyze(repoPath: string): Promise<BlueprintGraph>;
|
|
244
|
+
}
|
|
245
|
+
export interface CodeRagConfig extends SerializableCodeRagConfig {
|
|
246
|
+
logger?: Logger;
|
|
247
|
+
embeddingProvider?: EmbeddingProvider;
|
|
248
|
+
vectorStore?: VectorStore;
|
|
249
|
+
graphProvider?: GraphProvider;
|
|
250
|
+
llmTransport?: LlmTransport;
|
|
251
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const customHttpFormatSchema = z.enum(["json", "ndjson", "sse"]);
|
|
3
|
+
export const llmTransportKindSchema = z.enum(["openai-compatible", "custom-http"]);
|
|
4
|
+
export const retrievalConfigSchema = z.object({
|
|
5
|
+
topK: z.number().int().positive().default(6),
|
|
6
|
+
rerankK: z.number().int().positive().default(3),
|
|
7
|
+
maxContextChars: z.number().int().positive().default(16000)
|
|
8
|
+
});
|
|
9
|
+
export const traversalConfigSchema = z.object({
|
|
10
|
+
defaultDepth: z.number().int().min(0).default(1),
|
|
11
|
+
maxDepth: z.number().int().positive().default(3)
|
|
12
|
+
});
|
|
13
|
+
export const lockingConfigSchema = z.object({
|
|
14
|
+
timeoutMs: z.number().int().positive().default(30000),
|
|
15
|
+
pollMs: z.number().int().positive().default(150),
|
|
16
|
+
staleMs: z.number().int().positive().default(300000)
|
|
17
|
+
});
|
|
18
|
+
export const serviceConfigSchema = z.object({
|
|
19
|
+
host: z.string().min(1).default("127.0.0.1"),
|
|
20
|
+
port: z.number().int().positive().max(65535).default(4119),
|
|
21
|
+
apiKey: z.string().min(1).optional()
|
|
22
|
+
});
|
|
23
|
+
export const llmConfigSchema = z.object({
|
|
24
|
+
enabled: z.boolean().default(false),
|
|
25
|
+
transport: llmTransportKindSchema.default("openai-compatible"),
|
|
26
|
+
baseUrl: z.string().min(1).optional(),
|
|
27
|
+
model: z.string().min(1).optional(),
|
|
28
|
+
apiKey: z.string().min(1).optional(),
|
|
29
|
+
timeoutMs: z.number().int().positive().default(45000),
|
|
30
|
+
customHttpFormat: customHttpFormatSchema.default("json"),
|
|
31
|
+
headers: z.record(z.string(), z.string()).default({})
|
|
32
|
+
});
|
|
33
|
+
export const serializableConfigSchema = z.object({
|
|
34
|
+
repoPath: z.string().min(1),
|
|
35
|
+
storageRoot: z.string().min(1).default(".coderag"),
|
|
36
|
+
retrieval: retrievalConfigSchema.default({
|
|
37
|
+
topK: 6,
|
|
38
|
+
rerankK: 3,
|
|
39
|
+
maxContextChars: 16000
|
|
40
|
+
}),
|
|
41
|
+
traversal: traversalConfigSchema.default({
|
|
42
|
+
defaultDepth: 1,
|
|
43
|
+
maxDepth: 3
|
|
44
|
+
}),
|
|
45
|
+
locking: lockingConfigSchema.default({
|
|
46
|
+
timeoutMs: 30000,
|
|
47
|
+
pollMs: 150,
|
|
48
|
+
staleMs: 300000
|
|
49
|
+
}),
|
|
50
|
+
service: serviceConfigSchema.default({
|
|
51
|
+
host: "127.0.0.1",
|
|
52
|
+
port: 4119
|
|
53
|
+
}),
|
|
54
|
+
llm: llmConfigSchema.default({
|
|
55
|
+
enabled: false,
|
|
56
|
+
transport: "openai-compatible",
|
|
57
|
+
timeoutMs: 45000,
|
|
58
|
+
customHttpFormat: "json",
|
|
59
|
+
headers: {}
|
|
60
|
+
}),
|
|
61
|
+
docsPath: z.string().optional()
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=types.js.map
|