@speakeasy-api/docs-mcp-core 0.1.0
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 +661 -0
- package/README.md +27 -0
- package/dist/chunking.d.ts +3 -0
- package/dist/chunking.d.ts.map +1 -0
- package/dist/chunking.js +332 -0
- package/dist/chunking.js.map +1 -0
- package/dist/cursor.d.ts +12 -0
- package/dist/cursor.d.ts.map +1 -0
- package/dist/cursor.js +83 -0
- package/dist/cursor.js.map +1 -0
- package/dist/embedding-cache.d.ts +46 -0
- package/dist/embedding-cache.d.ts.map +1 -0
- package/dist/embedding-cache.js +230 -0
- package/dist/embedding-cache.js.map +1 -0
- package/dist/embedding.d.ts +66 -0
- package/dist/embedding.d.ts.map +1 -0
- package/dist/embedding.js +264 -0
- package/dist/embedding.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/lancedb.d.ts +42 -0
- package/dist/lancedb.d.ts.map +1 -0
- package/dist/lancedb.js +442 -0
- package/dist/lancedb.js.map +1 -0
- package/dist/manifest.d.ts +19 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +245 -0
- package/dist/manifest.js.map +1 -0
- package/dist/metadata.d.ts +6 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +152 -0
- package/dist/metadata.js.map +1 -0
- package/dist/parser.d.ts +6 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +21 -0
- package/dist/parser.js.map +1 -0
- package/dist/search-common.d.ts +7 -0
- package/dist/search-common.d.ts.map +1 -0
- package/dist/search-common.js +81 -0
- package/dist/search-common.js.map +1 -0
- package/dist/search.d.ts +13 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +166 -0
- package/dist/search.js.map +1 -0
- package/dist/types.d.ts +125 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Chunk, EmbeddingProvider, GetDocRequest, GetDocResult, SearchEngine, SearchRequest, SearchResult } from "./types.js";
|
|
2
|
+
export interface BuildLanceDbIndexOptions {
|
|
3
|
+
dbPath: string;
|
|
4
|
+
chunks: Chunk[];
|
|
5
|
+
tableName?: string;
|
|
6
|
+
metadataKeys?: string[];
|
|
7
|
+
vectorsByChunkId?: Map<string, number[]>;
|
|
8
|
+
}
|
|
9
|
+
export interface OpenLanceDbSearchEngineOptions {
|
|
10
|
+
dbPath: string;
|
|
11
|
+
tableName?: string;
|
|
12
|
+
metadataKeys: string[];
|
|
13
|
+
proximityWeight?: number;
|
|
14
|
+
phraseSlop?: number;
|
|
15
|
+
queryEmbeddingProvider?: EmbeddingProvider;
|
|
16
|
+
vectorWeight?: number;
|
|
17
|
+
onWarning?: (message: string) => void;
|
|
18
|
+
}
|
|
19
|
+
export interface LanceDbIndexBuildResult {
|
|
20
|
+
tableName: string;
|
|
21
|
+
metadataKeys: string[];
|
|
22
|
+
}
|
|
23
|
+
export declare function buildLanceDbIndex(options: BuildLanceDbIndexOptions): Promise<LanceDbIndexBuildResult>;
|
|
24
|
+
export declare class LanceDbSearchEngine implements SearchEngine {
|
|
25
|
+
private readonly table;
|
|
26
|
+
private readonly metadataKeys;
|
|
27
|
+
private readonly proximityWeight;
|
|
28
|
+
private readonly phraseSlop;
|
|
29
|
+
private readonly queryEmbeddingProvider;
|
|
30
|
+
private readonly vectorWeight;
|
|
31
|
+
private readonly onWarning;
|
|
32
|
+
private hasWarnedVectorFailure;
|
|
33
|
+
private constructor();
|
|
34
|
+
static open(options: OpenLanceDbSearchEngineOptions): Promise<LanceDbSearchEngine>;
|
|
35
|
+
search(request: SearchRequest): Promise<SearchResult>;
|
|
36
|
+
getDoc(request: GetDocRequest): Promise<GetDocResult>;
|
|
37
|
+
private runFtsQuery;
|
|
38
|
+
private runVectorQuery;
|
|
39
|
+
private buildHint;
|
|
40
|
+
private warnVectorFailure;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=lancedb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lancedb.d.ts","sourceRoot":"","sources":["../src/lancedb.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,KAAK,EAEL,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,YAAY,EAGZ,aAAa,EACb,YAAY,EACb,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB,CAAC,EAAE,iBAAiB,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,uBAAuB,CAAC,CAsDlC;AAED,qBAAa,mBAAoB,YAAW,YAAY;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAgC;IACvE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;IACtD,OAAO,CAAC,sBAAsB,CAAS;IAEvC,OAAO;WAkBM,IAAI,CAAC,OAAO,EAAE,8BAA8B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA2BlF,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA0DrD,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;YAmE7C,WAAW;YAcX,cAAc;YAiCd,SAAS;IA6CvB,OAAO,CAAC,iBAAiB;CAS1B"}
|
package/dist/lancedb.js
ADDED
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
import { connect, Index, MultiMatchQuery, PhraseQuery } from "@lancedb/lancedb";
|
|
2
|
+
import { decodeSearchCursor, encodeSearchCursor } from "./cursor.js";
|
|
3
|
+
import { clampLimit, isChunkIdFormat, makeSnippet } from "./search-common.js";
|
|
4
|
+
const DEFAULT_TABLE_NAME = "chunks";
|
|
5
|
+
const RRF_K = 60;
|
|
6
|
+
export async function buildLanceDbIndex(options) {
|
|
7
|
+
const tableName = options.tableName ?? DEFAULT_TABLE_NAME;
|
|
8
|
+
const metadataKeys = options.metadataKeys ?? collectMetadataKeys(options.chunks);
|
|
9
|
+
const rows = options.chunks.map((chunk) => serializeChunkRow(chunk, metadataKeys, options.vectorsByChunkId));
|
|
10
|
+
if (rows.length === 0) {
|
|
11
|
+
return { tableName, metadataKeys };
|
|
12
|
+
}
|
|
13
|
+
const db = await connect(options.dbPath);
|
|
14
|
+
try {
|
|
15
|
+
const table = await db.createTable(tableName, rows, { mode: "overwrite" });
|
|
16
|
+
await table.createIndex("content_text", {
|
|
17
|
+
config: Index.fts({ withPosition: true }),
|
|
18
|
+
replace: true
|
|
19
|
+
});
|
|
20
|
+
await table.createIndex("heading", {
|
|
21
|
+
config: Index.fts({ withPosition: true }),
|
|
22
|
+
replace: true
|
|
23
|
+
});
|
|
24
|
+
await Promise.all([
|
|
25
|
+
safeCreateScalarIndex(table, "chunk_id"),
|
|
26
|
+
safeCreateScalarIndex(table, "filepath"),
|
|
27
|
+
safeCreateScalarIndex(table, "chunk_index")
|
|
28
|
+
]);
|
|
29
|
+
// Create IVF-PQ vector index when there are enough rows with vectors
|
|
30
|
+
if (options.vectorsByChunkId && options.vectorsByChunkId.size >= 256) {
|
|
31
|
+
const numPartitions = Math.max(1, Math.round(Math.sqrt(options.vectorsByChunkId.size)));
|
|
32
|
+
try {
|
|
33
|
+
await table.createIndex("vector", {
|
|
34
|
+
config: Index.ivfPq({ numPartitions }),
|
|
35
|
+
replace: true,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Non-fatal: brute-force vector search still works without the index
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
table.close();
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
db.close();
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
tableName,
|
|
49
|
+
metadataKeys
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export class LanceDbSearchEngine {
|
|
53
|
+
table;
|
|
54
|
+
metadataKeys;
|
|
55
|
+
proximityWeight;
|
|
56
|
+
phraseSlop;
|
|
57
|
+
queryEmbeddingProvider;
|
|
58
|
+
vectorWeight;
|
|
59
|
+
onWarning;
|
|
60
|
+
hasWarnedVectorFailure = false;
|
|
61
|
+
constructor(table, metadataKeys, options = {}) {
|
|
62
|
+
this.table = table;
|
|
63
|
+
this.metadataKeys = [...metadataKeys];
|
|
64
|
+
this.proximityWeight = options.proximityWeight ?? 1.25;
|
|
65
|
+
this.phraseSlop = normalizePhraseSlop(options.phraseSlop);
|
|
66
|
+
this.queryEmbeddingProvider = options.queryEmbeddingProvider;
|
|
67
|
+
this.vectorWeight = options.vectorWeight ?? 1;
|
|
68
|
+
this.onWarning = options.onWarning ?? ((message) => console.warn(`warn: ${message}`));
|
|
69
|
+
}
|
|
70
|
+
static async open(options) {
|
|
71
|
+
const db = await connect(options.dbPath);
|
|
72
|
+
const table = await db.openTable(options.tableName ?? DEFAULT_TABLE_NAME);
|
|
73
|
+
const engineOptions = {};
|
|
74
|
+
if (options.proximityWeight !== undefined) {
|
|
75
|
+
engineOptions.proximityWeight = options.proximityWeight;
|
|
76
|
+
}
|
|
77
|
+
if (options.phraseSlop !== undefined) {
|
|
78
|
+
engineOptions.phraseSlop = options.phraseSlop;
|
|
79
|
+
}
|
|
80
|
+
if (options.queryEmbeddingProvider !== undefined) {
|
|
81
|
+
engineOptions.queryEmbeddingProvider = options.queryEmbeddingProvider;
|
|
82
|
+
}
|
|
83
|
+
if (options.vectorWeight !== undefined) {
|
|
84
|
+
engineOptions.vectorWeight = options.vectorWeight;
|
|
85
|
+
}
|
|
86
|
+
if (options.onWarning !== undefined) {
|
|
87
|
+
engineOptions.onWarning = options.onWarning;
|
|
88
|
+
}
|
|
89
|
+
return new LanceDbSearchEngine(table, options.metadataKeys, engineOptions);
|
|
90
|
+
}
|
|
91
|
+
async search(request) {
|
|
92
|
+
const query = request.query.trim();
|
|
93
|
+
if (!query) {
|
|
94
|
+
throw new Error("query is required");
|
|
95
|
+
}
|
|
96
|
+
const limit = clampLimit(request.limit);
|
|
97
|
+
const filters = request.filters ?? {};
|
|
98
|
+
const offset = request.cursor
|
|
99
|
+
? decodeSearchCursor(request.cursor, { query, filters }).offset
|
|
100
|
+
: 0;
|
|
101
|
+
const whereClause = buildWhereClause(filters, request.taxonomy_keys);
|
|
102
|
+
const fetchLimit = Math.min(Math.max(offset + limit + 200, limit * 5), 5000);
|
|
103
|
+
const [matchRows, phraseRows, vectorRows] = await Promise.all([
|
|
104
|
+
this.runFtsQuery(new MultiMatchQuery(query, ["heading", "content_text"], { boosts: [3, 1] }), whereClause, fetchLimit),
|
|
105
|
+
this.runFtsQuery(new PhraseQuery(query, "content_text", { slop: this.phraseSlop }), whereClause, fetchLimit),
|
|
106
|
+
this.runVectorQuery(query, whereClause, fetchLimit)
|
|
107
|
+
]);
|
|
108
|
+
const matchWeight = request.rrf_weights?.match ?? 1;
|
|
109
|
+
const phraseWeight = request.rrf_weights?.phrase ?? this.proximityWeight;
|
|
110
|
+
const vecWeight = request.rrf_weights?.vector ?? this.vectorWeight;
|
|
111
|
+
const blended = blendRows(matchRows, phraseRows, vectorRows, phraseWeight, vecWeight, matchWeight);
|
|
112
|
+
const paged = blended.slice(offset, offset + limit);
|
|
113
|
+
const hits = paged.map((entry) => toSearchHit(entry.row, entry.score, query, this.metadataKeys));
|
|
114
|
+
const nextOffset = offset + paged.length;
|
|
115
|
+
const nextCursor = nextOffset < blended.length
|
|
116
|
+
? encodeSearchCursor({ offset: nextOffset, limit }, { query, filters })
|
|
117
|
+
: null;
|
|
118
|
+
if (hits.length > 0) {
|
|
119
|
+
return {
|
|
120
|
+
hits,
|
|
121
|
+
next_cursor: nextCursor,
|
|
122
|
+
hint: null
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
hits,
|
|
127
|
+
next_cursor: nextCursor,
|
|
128
|
+
hint: await this.buildHint(query, filters)
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
async getDoc(request) {
|
|
132
|
+
if (!isChunkIdFormat(request.chunk_id)) {
|
|
133
|
+
throw new Error(`Chunk ID '${request.chunk_id}' has invalid format. Expected {filepath} or {filepath}#{heading-path}.`);
|
|
134
|
+
}
|
|
135
|
+
const context = Math.max(0, Math.min(5, request.context ?? 0));
|
|
136
|
+
const targetRows = await this.table
|
|
137
|
+
.query()
|
|
138
|
+
.where(`chunk_id = '${escapeSqlString(request.chunk_id)}'`)
|
|
139
|
+
.limit(1)
|
|
140
|
+
.toArray();
|
|
141
|
+
if (targetRows.length === 0) {
|
|
142
|
+
throw new Error(`Chunk ID '${request.chunk_id}' not found. Use search_docs to discover valid chunk IDs.`);
|
|
143
|
+
}
|
|
144
|
+
const target = targetRows[0];
|
|
145
|
+
const filepath = expectStringField(target, "filepath");
|
|
146
|
+
const targetIndex = toNumberField(target, "chunk_index");
|
|
147
|
+
const minIndex = Math.max(0, targetIndex - context);
|
|
148
|
+
const maxIndex = targetIndex + context;
|
|
149
|
+
// Fetch only the needed range using BETWEEN for efficiency
|
|
150
|
+
const escapedFilepath = escapeSqlString(filepath);
|
|
151
|
+
const rangeRows = await this.table
|
|
152
|
+
.query()
|
|
153
|
+
.where(`filepath = '${escapedFilepath}' AND chunk_index BETWEEN ${minIndex} AND ${maxIndex}`)
|
|
154
|
+
.toArray();
|
|
155
|
+
// Lightweight count query for total chunks in the file (select only chunk_index)
|
|
156
|
+
const allChunkIndexRows = await this.table
|
|
157
|
+
.query()
|
|
158
|
+
.where(`filepath = '${escapedFilepath}'`)
|
|
159
|
+
.select(["chunk_index"])
|
|
160
|
+
.toArray();
|
|
161
|
+
const totalChunks = allChunkIndexRows.length;
|
|
162
|
+
const normalized = rangeRows
|
|
163
|
+
.map((row) => row)
|
|
164
|
+
.sort((a, b) => toNumberField(a, "chunk_index") - toNumberField(b, "chunk_index"));
|
|
165
|
+
const blocks = [];
|
|
166
|
+
for (const row of normalized) {
|
|
167
|
+
const chunkId = expectStringField(row, "chunk_id");
|
|
168
|
+
const content = expectStringField(row, "content");
|
|
169
|
+
const chunkIndex = toNumberField(row, "chunk_index");
|
|
170
|
+
const positionLabel = `Chunk ${chunkIndex + 1} of ${totalChunks}`;
|
|
171
|
+
const contextOffset = chunkIndex - targetIndex;
|
|
172
|
+
const role = contextOffset === 0
|
|
173
|
+
? "Target"
|
|
174
|
+
: `Context: ${contextOffset > 0 ? `+${contextOffset}` : contextOffset}`;
|
|
175
|
+
blocks.push(`--- Chunk: ${chunkId} (${positionLabel}) (${role}) ---\n${content}`);
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
text: blocks.join("\n\n")
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
async runFtsQuery(query, whereClause, limit) {
|
|
182
|
+
let builder = this.table.search(query, "fts");
|
|
183
|
+
if (whereClause) {
|
|
184
|
+
builder = builder.where(whereClause);
|
|
185
|
+
}
|
|
186
|
+
const rows = await builder.limit(limit).toArray();
|
|
187
|
+
return rows.map((row) => row);
|
|
188
|
+
}
|
|
189
|
+
async runVectorQuery(query, whereClause, limit) {
|
|
190
|
+
if (!this.queryEmbeddingProvider) {
|
|
191
|
+
return [];
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
const vectors = await this.queryEmbeddingProvider.embed([query]);
|
|
195
|
+
const vector = vectors[0];
|
|
196
|
+
if (!vector || vector.length === 0) {
|
|
197
|
+
return [];
|
|
198
|
+
}
|
|
199
|
+
let builder = this.table.search(vector, "vector", "vector");
|
|
200
|
+
if (whereClause) {
|
|
201
|
+
builder = builder.where(whereClause);
|
|
202
|
+
}
|
|
203
|
+
const rows = await builder.limit(limit).toArray();
|
|
204
|
+
return rows.map((row) => row);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
this.warnVectorFailure(error);
|
|
208
|
+
return [];
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
async buildHint(query, filters) {
|
|
212
|
+
const fallbackRows = await this.table
|
|
213
|
+
.search(new MultiMatchQuery(query, ["heading", "content_text"], { boosts: [3, 1] }), "fts")
|
|
214
|
+
.limit(100)
|
|
215
|
+
.toArray();
|
|
216
|
+
if (fallbackRows.length === 0) {
|
|
217
|
+
return {
|
|
218
|
+
message: "0 results found. No matches were found for this query in the indexed corpus.",
|
|
219
|
+
suggested_filters: {}
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
const suggestions = {};
|
|
223
|
+
for (const [key, activeValue] of Object.entries(filters)) {
|
|
224
|
+
const values = new Set();
|
|
225
|
+
for (const row of fallbackRows) {
|
|
226
|
+
const metadata = extractMetadata(row, this.metadataKeys);
|
|
227
|
+
const candidate = metadata[key];
|
|
228
|
+
if (!candidate || candidate === activeValue) {
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
values.add(candidate);
|
|
232
|
+
}
|
|
233
|
+
if (values.size > 0) {
|
|
234
|
+
suggestions[key] = [...values].sort((a, b) => a.localeCompare(b));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const filterSummary = Object.entries(filters)
|
|
238
|
+
.map(([key, value]) => `${key}='${value}'`)
|
|
239
|
+
.join(", ");
|
|
240
|
+
return {
|
|
241
|
+
message: filterSummary
|
|
242
|
+
? `0 results found for query '${query}' with filters ${filterSummary}.`
|
|
243
|
+
: `0 results found for query '${query}'.`,
|
|
244
|
+
suggested_filters: suggestions
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
warnVectorFailure(error) {
|
|
248
|
+
if (this.hasWarnedVectorFailure) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
252
|
+
this.onWarning(`vector search degraded to lexical-only: ${detail}`);
|
|
253
|
+
this.hasWarnedVectorFailure = true;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
function blendRows(matchRows, phraseRows, vectorRows, proximityWeight, vectorWeight, matchWeight = 1) {
|
|
257
|
+
const byChunkId = new Map();
|
|
258
|
+
const captureRanks = (rows, key) => {
|
|
259
|
+
for (const [index, row] of rows.entries()) {
|
|
260
|
+
const chunkId = expectStringField(row, "chunk_id");
|
|
261
|
+
const rank = index + 1;
|
|
262
|
+
const entry = byChunkId.get(chunkId) ?? { row };
|
|
263
|
+
entry.row = row;
|
|
264
|
+
const existing = entry[key];
|
|
265
|
+
if (existing === undefined || rank < existing) {
|
|
266
|
+
entry[key] = rank;
|
|
267
|
+
}
|
|
268
|
+
byChunkId.set(chunkId, entry);
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
captureRanks(matchRows, "matchRank");
|
|
272
|
+
captureRanks(phraseRows, "phraseRank");
|
|
273
|
+
captureRanks(vectorRows, "vectorRank");
|
|
274
|
+
return [...byChunkId.values()]
|
|
275
|
+
.map((entry) => {
|
|
276
|
+
const score = rrf(entry.matchRank, matchWeight) +
|
|
277
|
+
rrf(entry.phraseRank, proximityWeight) +
|
|
278
|
+
rrf(entry.vectorRank, vectorWeight);
|
|
279
|
+
return {
|
|
280
|
+
row: entry.row,
|
|
281
|
+
score: Number(score.toFixed(6))
|
|
282
|
+
};
|
|
283
|
+
})
|
|
284
|
+
.sort((a, b) => {
|
|
285
|
+
if (b.score !== a.score) {
|
|
286
|
+
return b.score - a.score;
|
|
287
|
+
}
|
|
288
|
+
return expectStringField(a.row, "chunk_id").localeCompare(expectStringField(b.row, "chunk_id"));
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
function buildWhereClause(filters, taxonomyKeys) {
|
|
292
|
+
const clauses = [];
|
|
293
|
+
const language = filters.language;
|
|
294
|
+
const scope = filters.scope;
|
|
295
|
+
// Only apply auto-include if scope and language are both indexed taxonomy keys
|
|
296
|
+
const hasScope = !taxonomyKeys || taxonomyKeys.includes("scope");
|
|
297
|
+
const hasLanguage = !taxonomyKeys || taxonomyKeys.includes("language");
|
|
298
|
+
if (hasScope && hasLanguage && language && !scope) {
|
|
299
|
+
const escapedLanguage = escapeSqlString(language);
|
|
300
|
+
const scopeColumn = quoteIdentifier("scope");
|
|
301
|
+
const languageColumn = quoteIdentifier("language");
|
|
302
|
+
clauses.push(`((${scopeColumn} = 'sdk-specific' AND ${languageColumn} = '${escapedLanguage}') OR ${scopeColumn} = 'global-guide' OR (${scopeColumn} <> 'sdk-specific' AND ${scopeColumn} <> 'global-guide' AND (${languageColumn} = '' OR ${languageColumn} = '${escapedLanguage}')))`);
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
if (language) {
|
|
306
|
+
clauses.push(`${quoteIdentifier("language")} = '${escapeSqlString(language)}'`);
|
|
307
|
+
}
|
|
308
|
+
if (scope) {
|
|
309
|
+
clauses.push(`${quoteIdentifier("scope")} = '${escapeSqlString(scope)}'`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
for (const [key, value] of Object.entries(filters)) {
|
|
313
|
+
if (key === "language" || key === "scope") {
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
clauses.push(`${quoteIdentifier(key)} = '${escapeSqlString(value)}'`);
|
|
317
|
+
}
|
|
318
|
+
return clauses.length > 0 ? clauses.join(" AND ") : null;
|
|
319
|
+
}
|
|
320
|
+
function toSearchHit(row, score, query, metadataKeys) {
|
|
321
|
+
const contentText = expectStringField(row, "content_text");
|
|
322
|
+
return {
|
|
323
|
+
chunk_id: expectStringField(row, "chunk_id"),
|
|
324
|
+
heading: expectStringField(row, "heading"),
|
|
325
|
+
breadcrumb: expectStringField(row, "breadcrumb"),
|
|
326
|
+
snippet: makeSnippet(contentText, query),
|
|
327
|
+
filepath: expectStringField(row, "filepath"),
|
|
328
|
+
metadata: extractMetadata(row, metadataKeys),
|
|
329
|
+
score
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
function extractMetadata(row, metadataKeys) {
|
|
333
|
+
const metadataJson = row.metadata_json;
|
|
334
|
+
if (typeof metadataJson === "string" && metadataJson.trim()) {
|
|
335
|
+
try {
|
|
336
|
+
const parsed = JSON.parse(metadataJson);
|
|
337
|
+
const metadata = {};
|
|
338
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
339
|
+
if (typeof value === "string" && value) {
|
|
340
|
+
metadata[key] = value;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return metadata;
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
// Fall through to column extraction.
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
const metadata = {};
|
|
350
|
+
for (const key of metadataKeys) {
|
|
351
|
+
const value = row[key];
|
|
352
|
+
if (typeof value === "string" && value) {
|
|
353
|
+
metadata[key] = value;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return metadata;
|
|
357
|
+
}
|
|
358
|
+
function serializeChunkRow(chunk, metadataKeys, vectorsByChunkId) {
|
|
359
|
+
const record = {
|
|
360
|
+
chunk_id: chunk.chunk_id,
|
|
361
|
+
filepath: chunk.filepath,
|
|
362
|
+
heading: chunk.heading,
|
|
363
|
+
heading_level: chunk.heading_level,
|
|
364
|
+
content: chunk.content,
|
|
365
|
+
content_text: chunk.content_text,
|
|
366
|
+
breadcrumb: chunk.breadcrumb,
|
|
367
|
+
chunk_index: chunk.chunk_index,
|
|
368
|
+
metadata_json: JSON.stringify(chunk.metadata)
|
|
369
|
+
};
|
|
370
|
+
for (const key of metadataKeys) {
|
|
371
|
+
record[key] = chunk.metadata[key] ?? "";
|
|
372
|
+
}
|
|
373
|
+
const vector = vectorsByChunkId?.get(chunk.chunk_id);
|
|
374
|
+
if (vector) {
|
|
375
|
+
record.vector = vector;
|
|
376
|
+
}
|
|
377
|
+
return record;
|
|
378
|
+
}
|
|
379
|
+
function collectMetadataKeys(chunks) {
|
|
380
|
+
const keys = new Set();
|
|
381
|
+
for (const chunk of chunks) {
|
|
382
|
+
for (const key of Object.keys(chunk.metadata)) {
|
|
383
|
+
keys.add(key);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return [...keys].sort((a, b) => a.localeCompare(b));
|
|
387
|
+
}
|
|
388
|
+
async function safeCreateScalarIndex(table, column) {
|
|
389
|
+
try {
|
|
390
|
+
await table.createIndex(column, {
|
|
391
|
+
config: Index.btree(),
|
|
392
|
+
replace: true
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
catch {
|
|
396
|
+
// Non-fatal optimization path.
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
function escapeSqlString(value) {
|
|
400
|
+
return value
|
|
401
|
+
.replace(/\\/g, "\\\\")
|
|
402
|
+
.replaceAll("\0", "")
|
|
403
|
+
.replace(/'/g, "''");
|
|
404
|
+
}
|
|
405
|
+
function rrf(rank, weight) {
|
|
406
|
+
if (rank === undefined || weight <= 0) {
|
|
407
|
+
return 0;
|
|
408
|
+
}
|
|
409
|
+
return weight / (RRF_K + rank);
|
|
410
|
+
}
|
|
411
|
+
function quoteIdentifier(identifier) {
|
|
412
|
+
return `\`${identifier.replace(/`/g, "``")}\``;
|
|
413
|
+
}
|
|
414
|
+
function expectStringField(row, field) {
|
|
415
|
+
const value = row[field];
|
|
416
|
+
if (typeof value === "string") {
|
|
417
|
+
return value;
|
|
418
|
+
}
|
|
419
|
+
if (value === null || value === undefined) {
|
|
420
|
+
return "";
|
|
421
|
+
}
|
|
422
|
+
return String(value);
|
|
423
|
+
}
|
|
424
|
+
function toNumberField(row, field) {
|
|
425
|
+
const value = row[field];
|
|
426
|
+
if (typeof value === "number") {
|
|
427
|
+
return value;
|
|
428
|
+
}
|
|
429
|
+
if (typeof value === "bigint") {
|
|
430
|
+
return Number(value);
|
|
431
|
+
}
|
|
432
|
+
const parsed = Number(value);
|
|
433
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
434
|
+
}
|
|
435
|
+
function normalizePhraseSlop(value) {
|
|
436
|
+
if (value === undefined || !Number.isFinite(value)) {
|
|
437
|
+
return 0;
|
|
438
|
+
}
|
|
439
|
+
const rounded = Math.floor(value);
|
|
440
|
+
return Math.max(0, Math.min(5, rounded));
|
|
441
|
+
}
|
|
442
|
+
//# sourceMappingURL=lancedb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lancedb.js","sourceRoot":"","sources":["../src/lancedb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ChunkingStrategy, Manifest, ResolvedFileConfig } from "./types.js";
|
|
2
|
+
export declare function parseManifest(input: unknown): Manifest;
|
|
3
|
+
export declare function parseManifestJson(contents: string): Manifest;
|
|
4
|
+
export declare function resolveFileConfig(params: {
|
|
5
|
+
relativeFilePath: string;
|
|
6
|
+
manifestBaseDir?: string;
|
|
7
|
+
manifest?: Manifest;
|
|
8
|
+
markdown?: string;
|
|
9
|
+
defaults?: Partial<ResolvedFileConfig>;
|
|
10
|
+
}): ResolvedFileConfig;
|
|
11
|
+
/**
|
|
12
|
+
* Scans markdown for an HTML comment chunking hint of the form:
|
|
13
|
+
* <!-- mcp_chunking_hint: {"chunk_by": "h3"} -->
|
|
14
|
+
*
|
|
15
|
+
* Returns a partial strategy override (just `chunk_by`) if found and valid,
|
|
16
|
+
* or undefined if no hint is present or parsing fails.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseHtmlChunkingHint(markdown: string): Pick<ChunkingStrategy, "chunk_by"> | undefined;
|
|
19
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,QAAQ,EAER,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAMpB,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAwBtD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAQ5D;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACxC,GAAG,kBAAkB,CA+DrB;AAkED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,GACf,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,GAAG,SAAS,CAqBhD"}
|