@jafreck/lore 0.1.0 → 0.2.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/README.md +345 -196
- package/dist/cli.js +133 -12
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/indexer/db.d.ts.map +1 -1
- package/dist/indexer/db.js +96 -2
- package/dist/indexer/db.js.map +1 -1
- package/dist/indexer/docs.d.ts +42 -0
- package/dist/indexer/docs.d.ts.map +1 -0
- package/dist/indexer/docs.js +214 -0
- package/dist/indexer/docs.js.map +1 -0
- package/dist/indexer/embedder.d.ts +7 -0
- package/dist/indexer/embedder.d.ts.map +1 -1
- package/dist/indexer/embedder.js +10 -0
- package/dist/indexer/embedder.js.map +1 -1
- package/dist/indexer/extractors/types.d.ts +22 -0
- package/dist/indexer/extractors/types.d.ts.map +1 -1
- package/dist/indexer/extractors/types.js +12 -0
- package/dist/indexer/extractors/types.js.map +1 -1
- package/dist/indexer/extractors/typescript.d.ts +1 -1
- package/dist/indexer/extractors/typescript.d.ts.map +1 -1
- package/dist/indexer/extractors/typescript.js +38 -8
- package/dist/indexer/extractors/typescript.js.map +1 -1
- package/dist/indexer/git-hooks.d.ts +1 -0
- package/dist/indexer/git-hooks.d.ts.map +1 -1
- package/dist/indexer/git-hooks.js +3 -2
- package/dist/indexer/git-hooks.js.map +1 -1
- package/dist/indexer/index.d.ts +32 -7
- package/dist/indexer/index.d.ts.map +1 -1
- package/dist/indexer/index.js +427 -15
- package/dist/indexer/index.js.map +1 -1
- package/dist/indexer/lsp/client.d.ts +61 -0
- package/dist/indexer/lsp/client.d.ts.map +1 -0
- package/dist/indexer/lsp/client.js +217 -0
- package/dist/indexer/lsp/client.js.map +1 -0
- package/dist/indexer/lsp/config.d.ts +16 -0
- package/dist/indexer/lsp/config.d.ts.map +1 -0
- package/dist/indexer/lsp/config.js +78 -0
- package/dist/indexer/lsp/config.js.map +1 -0
- package/dist/indexer/lsp/enrichment.d.ts +55 -0
- package/dist/indexer/lsp/enrichment.d.ts.map +1 -0
- package/dist/indexer/lsp/enrichment.js +211 -0
- package/dist/indexer/lsp/enrichment.js.map +1 -0
- package/dist/indexer/lsp/registry.d.ts +19 -0
- package/dist/indexer/lsp/registry.d.ts.map +1 -0
- package/dist/indexer/lsp/registry.js +118 -0
- package/dist/indexer/lsp/registry.js.map +1 -0
- package/dist/indexer/parser.d.ts +7 -0
- package/dist/indexer/parser.d.ts.map +1 -1
- package/dist/indexer/parser.js +3 -1
- package/dist/indexer/parser.js.map +1 -1
- package/dist/indexer/poller.d.ts +7 -0
- package/dist/indexer/poller.d.ts.map +1 -1
- package/dist/indexer/poller.js +6 -0
- package/dist/indexer/poller.js.map +1 -1
- package/dist/indexer/walker.d.ts +22 -0
- package/dist/indexer/walker.d.ts.map +1 -1
- package/dist/indexer/walker.js +15 -0
- package/dist/indexer/walker.js.map +1 -1
- package/dist/indexer/watcher.d.ts +7 -0
- package/dist/indexer/watcher.d.ts.map +1 -1
- package/dist/indexer/watcher.js +6 -0
- package/dist/indexer/watcher.js.map +1 -1
- package/dist/kb-server/db.d.ts +82 -0
- package/dist/kb-server/db.d.ts.map +1 -1
- package/dist/kb-server/db.js +239 -0
- package/dist/kb-server/db.js.map +1 -1
- package/dist/kb-server/server.d.ts +11 -3
- package/dist/kb-server/server.d.ts.map +1 -1
- package/dist/kb-server/server.js +28 -6
- package/dist/kb-server/server.js.map +1 -1
- package/dist/kb-server/tools/architecture.d.ts +7 -0
- package/dist/kb-server/tools/architecture.d.ts.map +1 -1
- package/dist/kb-server/tools/architecture.js +35 -0
- package/dist/kb-server/tools/architecture.js.map +1 -1
- package/dist/kb-server/tools/docs.d.ts +78 -0
- package/dist/kb-server/tools/docs.d.ts.map +1 -0
- package/dist/kb-server/tools/docs.js +136 -0
- package/dist/kb-server/tools/docs.js.map +1 -0
- package/dist/kb-server/tools/lookup.d.ts.map +1 -1
- package/dist/kb-server/tools/lookup.js +5 -4
- package/dist/kb-server/tools/lookup.js.map +1 -1
- package/dist/kb-server/tools/notes.d.ts +1 -1
- package/dist/kb-server/tools/notes.d.ts.map +1 -1
- package/dist/kb-server/tools/notes.js +35 -0
- package/dist/kb-server/tools/notes.js.map +1 -1
- package/dist/kb-server/tools/search.d.ts +54 -11
- package/dist/kb-server/tools/search.d.ts.map +1 -1
- package/dist/kb-server/tools/search.js +138 -34
- package/dist/kb-server/tools/search.js.map +1 -1
- package/package.json +16 -7
|
@@ -13,6 +13,30 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import type { Database } from '../db.js';
|
|
15
15
|
import type { EmbeddingProvider } from '../../indexer/embedder.js';
|
|
16
|
+
/**
|
|
17
|
+
* Observation emitted after every `kb_search` invocation.
|
|
18
|
+
* Consumers can use this to log, collect metrics, or detect search-quality issues.
|
|
19
|
+
*/
|
|
20
|
+
export interface SearchObservation {
|
|
21
|
+
/** ISO-8601 timestamp when the search completed. */
|
|
22
|
+
timestamp: string;
|
|
23
|
+
/** The raw query string sent by the caller. */
|
|
24
|
+
query: string;
|
|
25
|
+
/** The mode the caller requested (defaults to 'structural'). */
|
|
26
|
+
requestedMode: 'structural' | 'semantic' | 'fused';
|
|
27
|
+
/** The mode that was actually used (may differ due to fallback). */
|
|
28
|
+
modeUsed: string;
|
|
29
|
+
/** Number of results returned. */
|
|
30
|
+
resultCount: number;
|
|
31
|
+
/** Best (lowest distance / highest BM25) score among results, or `null` if empty. */
|
|
32
|
+
topScore: number | null;
|
|
33
|
+
/** Wall-clock milliseconds for the entire handler call. */
|
|
34
|
+
latencyMs: number;
|
|
35
|
+
/** Branch filter applied, if any. */
|
|
36
|
+
branch?: string;
|
|
37
|
+
}
|
|
38
|
+
/** Callback invoked after each search completes. Fire-and-forget — errors are swallowed. */
|
|
39
|
+
export type SearchObserver = (observation: SearchObservation) => void;
|
|
16
40
|
export declare const toolDef: {
|
|
17
41
|
readonly name: "kb_search";
|
|
18
42
|
readonly description: string;
|
|
@@ -43,18 +67,37 @@ export interface SearchArgs {
|
|
|
43
67
|
branch?: string;
|
|
44
68
|
}
|
|
45
69
|
export interface SearchResult {
|
|
46
|
-
results:
|
|
47
|
-
symbol_id: number;
|
|
48
|
-
name: string;
|
|
49
|
-
kind: string;
|
|
50
|
-
file_path: string;
|
|
51
|
-
start_line: number;
|
|
52
|
-
end_line: number;
|
|
53
|
-
score: number;
|
|
54
|
-
branch: string;
|
|
55
|
-
}>;
|
|
70
|
+
results: SearchResultItem[];
|
|
56
71
|
mode_used: string;
|
|
57
72
|
}
|
|
73
|
+
export interface SearchSymbolResult {
|
|
74
|
+
result_type: 'symbol';
|
|
75
|
+
symbol_id: number;
|
|
76
|
+
name: string;
|
|
77
|
+
kind: string;
|
|
78
|
+
file_path: string;
|
|
79
|
+
start_line: number;
|
|
80
|
+
end_line: number;
|
|
81
|
+
score: number;
|
|
82
|
+
branch: string;
|
|
83
|
+
}
|
|
84
|
+
export interface SearchDocSectionResult {
|
|
85
|
+
result_type: 'doc_section';
|
|
86
|
+
doc_section_id: number;
|
|
87
|
+
doc_id: number;
|
|
88
|
+
doc_kind: string;
|
|
89
|
+
doc_title: string;
|
|
90
|
+
section_index: number;
|
|
91
|
+
heading_path: string;
|
|
92
|
+
name: string;
|
|
93
|
+
kind: string;
|
|
94
|
+
file_path: string;
|
|
95
|
+
start_line: number;
|
|
96
|
+
end_line: number;
|
|
97
|
+
score: number;
|
|
98
|
+
branch: string;
|
|
99
|
+
}
|
|
100
|
+
export type SearchResultItem = SearchSymbolResult | SearchDocSectionResult;
|
|
58
101
|
/** Execute a knowledge-base search in the requested mode. */
|
|
59
|
-
export declare function handler(db: Database.Database, args: SearchArgs, embedder?: EmbeddingProvider): Promise<SearchResult>;
|
|
102
|
+
export declare function handler(db: Database.Database, args: SearchArgs, embedder?: EmbeddingProvider, observer?: SearchObserver): Promise<SearchResult>;
|
|
60
103
|
//# sourceMappingURL=search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/kb-server/tools/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/kb-server/tools/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAKnE;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,aAAa,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;IACnD,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,4FAA4F;AAC5F,MAAM,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAItE,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;CA0BV,CAAC;AAIX,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,QAAQ,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,aAAa,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAAG,sBAAsB,CAAC;AAmO3E,6DAA6D;AAC7D,wBAAsB,OAAO,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,UAAU,EAChB,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,YAAY,CAAC,CAgDvB"}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* Semantic and fused modes fall back to structural-only when no EmbeddingProvider
|
|
12
12
|
* is supplied, clearly indicating the degradation in `mode_used`.
|
|
13
13
|
*/
|
|
14
|
+
import { semanticSearchDocSections } from '../db.js';
|
|
14
15
|
// ─── Tool definition ──────────────────────────────────────────────────────────
|
|
15
16
|
export const toolDef = {
|
|
16
17
|
name: 'kb_search',
|
|
@@ -50,13 +51,33 @@ function sanitizeFts5Query(query) {
|
|
|
50
51
|
// Escape interior double-quotes, then wrap in double-quotes for a phrase query.
|
|
51
52
|
return `"${query.replace(/"/g, '""')}"`;
|
|
52
53
|
}
|
|
54
|
+
function symbolEnrichmentProjection(db) {
|
|
55
|
+
let columns = new Set();
|
|
56
|
+
try {
|
|
57
|
+
const rows = db.prepare('PRAGMA table_info(symbols)').all();
|
|
58
|
+
columns = new Set(rows.map((row) => row.name));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
columns = new Set();
|
|
62
|
+
}
|
|
63
|
+
const column = (name) => (columns.has(name) ? `s.${name} AS ${name}` : `NULL AS ${name}`);
|
|
64
|
+
return [
|
|
65
|
+
column('resolved_type_signature'),
|
|
66
|
+
column('resolved_return_type'),
|
|
67
|
+
column('definition_uri'),
|
|
68
|
+
column('definition_path'),
|
|
69
|
+
].join(',\n ');
|
|
70
|
+
}
|
|
53
71
|
/** Run a structural BM25 FTS5 search and return ranked rows. */
|
|
54
72
|
function structuralSearch(db, query, limit, branch) {
|
|
55
73
|
const safeQuery = sanitizeFts5Query(query);
|
|
56
74
|
const branchClause = branch !== undefined ? ' AND f.branch = ?' : '';
|
|
75
|
+
const enrichmentProjection = symbolEnrichmentProjection(db);
|
|
57
76
|
try {
|
|
58
|
-
const sql = `SELECT
|
|
77
|
+
const sql = `SELECT 'symbol' AS result_type,
|
|
78
|
+
s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
|
|
59
79
|
s.start_line, s.end_line,
|
|
80
|
+
${enrichmentProjection},
|
|
60
81
|
bm25(symbols_fts) AS score,
|
|
61
82
|
f.branch AS branch
|
|
62
83
|
FROM symbols_fts
|
|
@@ -64,7 +85,7 @@ function structuralSearch(db, query, limit, branch) {
|
|
|
64
85
|
JOIN files f ON f.id = s.file_id
|
|
65
86
|
WHERE symbols_fts MATCH ?${branchClause}
|
|
66
87
|
ORDER BY score
|
|
67
|
-
|
|
88
|
+
LIMIT ?`;
|
|
68
89
|
const params = branch !== undefined ? [safeQuery, branch, limit] : [safeQuery, limit];
|
|
69
90
|
const rows = db.prepare(sql).all(...params);
|
|
70
91
|
return rows;
|
|
@@ -72,18 +93,85 @@ function structuralSearch(db, query, limit, branch) {
|
|
|
72
93
|
catch {
|
|
73
94
|
// FTS5 parse error — fall back to LIKE-based search.
|
|
74
95
|
const likeQuery = `%${query}%`;
|
|
75
|
-
const sql = `SELECT
|
|
96
|
+
const sql = `SELECT 'symbol' AS result_type,
|
|
97
|
+
s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
|
|
76
98
|
s.start_line, s.end_line,
|
|
99
|
+
${enrichmentProjection},
|
|
77
100
|
0.0 AS score,
|
|
78
101
|
f.branch AS branch
|
|
79
102
|
FROM symbols s
|
|
80
103
|
JOIN files f ON f.id = s.file_id
|
|
81
104
|
WHERE s.name LIKE ?${branchClause}
|
|
82
|
-
|
|
105
|
+
LIMIT ?`;
|
|
83
106
|
const params = branch !== undefined ? [likeQuery, branch, limit] : [likeQuery, limit];
|
|
84
107
|
return db.prepare(sql).all(...params);
|
|
85
108
|
}
|
|
86
109
|
}
|
|
110
|
+
function hasVirtualTable(db, name) {
|
|
111
|
+
const row = db
|
|
112
|
+
.prepare("SELECT 1 AS present FROM sqlite_master WHERE type IN ('table', 'virtual table') AND name = ? LIMIT 1")
|
|
113
|
+
.get(name);
|
|
114
|
+
return row?.present === 1;
|
|
115
|
+
}
|
|
116
|
+
function semanticSymbolSearch(db, queryVector, limit, branch) {
|
|
117
|
+
if (!hasVirtualTable(db, 'symbol_embeddings')) {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
const branchClause = branch !== undefined ? ' AND f.branch = ?' : '';
|
|
121
|
+
const enrichment = symbolEnrichmentProjection(db);
|
|
122
|
+
const sql = `SELECT 'symbol' AS result_type,
|
|
123
|
+
s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
|
|
124
|
+
s.start_line, s.end_line,
|
|
125
|
+
${enrichment},
|
|
126
|
+
distance AS score,
|
|
127
|
+
f.branch AS branch
|
|
128
|
+
FROM symbol_embeddings
|
|
129
|
+
JOIN symbols s ON s.rowid = symbol_embeddings.rowid
|
|
130
|
+
JOIN files f ON f.id = s.file_id
|
|
131
|
+
WHERE embedding MATCH ?${branchClause}
|
|
132
|
+
ORDER BY distance
|
|
133
|
+
LIMIT ?`;
|
|
134
|
+
const params = branch !== undefined
|
|
135
|
+
? [JSON.stringify(queryVector), branch, limit]
|
|
136
|
+
: [JSON.stringify(queryVector), limit];
|
|
137
|
+
try {
|
|
138
|
+
return db.prepare(sql).all(...params);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function semanticDocSectionSearch(db, queryVector, limit, branch) {
|
|
145
|
+
if (!hasVirtualTable(db, 'doc_section_embeddings')) {
|
|
146
|
+
return [];
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
const rows = semanticSearchDocSections(db, {
|
|
150
|
+
queryVector,
|
|
151
|
+
branch,
|
|
152
|
+
limit,
|
|
153
|
+
});
|
|
154
|
+
return rows.map((row) => ({
|
|
155
|
+
result_type: 'doc_section',
|
|
156
|
+
doc_section_id: row.id,
|
|
157
|
+
doc_id: row.doc_id,
|
|
158
|
+
doc_kind: row.doc_kind,
|
|
159
|
+
doc_title: row.doc_title,
|
|
160
|
+
section_index: row.section_index,
|
|
161
|
+
heading_path: row.heading_path,
|
|
162
|
+
name: row.title || row.doc_title,
|
|
163
|
+
kind: 'doc_section',
|
|
164
|
+
file_path: row.doc_path,
|
|
165
|
+
start_line: row.line_start,
|
|
166
|
+
end_line: row.line_end,
|
|
167
|
+
score: row.score,
|
|
168
|
+
branch: row.doc_branch,
|
|
169
|
+
}));
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
}
|
|
87
175
|
/**
|
|
88
176
|
* Attempt a semantic (cosine) search via the vec0 virtual table.
|
|
89
177
|
* Returns `null` when no embedder is available or the table has no rows.
|
|
@@ -93,21 +181,11 @@ async function semanticSearch(db, query, limit, embedder, branch) {
|
|
|
93
181
|
const [queryVec] = await embedder.embed([query]);
|
|
94
182
|
if (!queryVec)
|
|
95
183
|
return null;
|
|
96
|
-
const
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
FROM symbol_embeddings
|
|
102
|
-
JOIN symbols s ON s.rowid = symbol_embeddings.rowid
|
|
103
|
-
JOIN files f ON f.id = s.file_id
|
|
104
|
-
WHERE embedding MATCH ?${branchClause}
|
|
105
|
-
ORDER BY distance
|
|
106
|
-
LIMIT ?`;
|
|
107
|
-
const params = branch !== undefined
|
|
108
|
-
? [JSON.stringify(queryVec), branch, limit]
|
|
109
|
-
: [JSON.stringify(queryVec), limit];
|
|
110
|
-
const rows = db.prepare(sql).all(...params);
|
|
184
|
+
const symbolRows = semanticSymbolSearch(db, queryVec, limit, branch);
|
|
185
|
+
const docRows = semanticDocSectionSearch(db, queryVec, limit, branch);
|
|
186
|
+
const rows = [...symbolRows, ...docRows]
|
|
187
|
+
.sort((a, b) => a.score - b.score)
|
|
188
|
+
.slice(0, limit);
|
|
111
189
|
return rows.length > 0 ? rows : null;
|
|
112
190
|
}
|
|
113
191
|
catch {
|
|
@@ -123,15 +201,17 @@ async function semanticSearch(db, query, limit, embedder, branch) {
|
|
|
123
201
|
function rrfFuse(structural, semantic, limit) {
|
|
124
202
|
const k = 60;
|
|
125
203
|
const scores = new Map();
|
|
204
|
+
const resultKey = (item) => item.result_type === 'symbol' ? `symbol:${item.symbol_id}` : `doc:${item.doc_section_id}`;
|
|
126
205
|
const addList = (list) => {
|
|
127
206
|
list.forEach((item, idx) => {
|
|
128
|
-
const
|
|
207
|
+
const key = resultKey(item);
|
|
208
|
+
const existing = scores.get(key);
|
|
129
209
|
const contrib = 1 / (k + idx + 1);
|
|
130
210
|
if (existing) {
|
|
131
211
|
existing.score += contrib;
|
|
132
212
|
}
|
|
133
213
|
else {
|
|
134
|
-
scores.set(
|
|
214
|
+
scores.set(key, { item, score: contrib });
|
|
135
215
|
}
|
|
136
216
|
});
|
|
137
217
|
};
|
|
@@ -144,27 +224,51 @@ function rrfFuse(structural, semantic, limit) {
|
|
|
144
224
|
.map(({ item, score }) => ({ ...item, score }));
|
|
145
225
|
}
|
|
146
226
|
/** Execute a knowledge-base search in the requested mode. */
|
|
147
|
-
export async function handler(db, args, embedder) {
|
|
227
|
+
export async function handler(db, args, embedder, observer) {
|
|
228
|
+
const start = Date.now();
|
|
148
229
|
const limit = args.limit ?? 20;
|
|
149
230
|
const mode = args.mode ?? 'structural';
|
|
150
231
|
const structural = structuralSearch(db, args.query, limit, args.branch);
|
|
232
|
+
let result;
|
|
151
233
|
if (mode === 'structural') {
|
|
152
|
-
|
|
234
|
+
result = { results: structural, mode_used: 'structural' };
|
|
153
235
|
}
|
|
154
|
-
if (!embedder) {
|
|
236
|
+
else if (!embedder) {
|
|
155
237
|
// No query-time embedder available — callers can detect this degradation.
|
|
156
|
-
|
|
238
|
+
result = { results: structural, mode_used: 'structural (no query-time embedder)' };
|
|
157
239
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
if (semantic) {
|
|
161
|
-
|
|
240
|
+
else {
|
|
241
|
+
const semantic = await semanticSearch(db, args.query, limit, embedder, args.branch);
|
|
242
|
+
if (mode === 'semantic') {
|
|
243
|
+
result = semantic
|
|
244
|
+
? { results: semantic, mode_used: 'semantic' }
|
|
245
|
+
: { results: structural, mode_used: 'structural (fallback: no embeddings)' };
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
// mode === 'fused'
|
|
249
|
+
const fused = rrfFuse(structural, semantic, limit);
|
|
250
|
+
const modeUsed = semantic ? 'fused' : 'structural (fallback: no embeddings)';
|
|
251
|
+
result = { results: fused, mode_used: modeUsed };
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// ── Emit observation ─────────────────────────────────────────────────────
|
|
255
|
+
if (observer) {
|
|
256
|
+
try {
|
|
257
|
+
observer({
|
|
258
|
+
timestamp: new Date().toISOString(),
|
|
259
|
+
query: args.query,
|
|
260
|
+
requestedMode: mode,
|
|
261
|
+
modeUsed: result.mode_used,
|
|
262
|
+
resultCount: result.results.length,
|
|
263
|
+
topScore: result.results.length > 0 ? result.results[0].score : null,
|
|
264
|
+
latencyMs: Date.now() - start,
|
|
265
|
+
branch: args.branch,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
// Observer errors must never break search.
|
|
162
270
|
}
|
|
163
|
-
return { results: structural, mode_used: 'structural (fallback: no embeddings)' };
|
|
164
271
|
}
|
|
165
|
-
|
|
166
|
-
const fused = rrfFuse(structural, semantic, limit);
|
|
167
|
-
const modeUsed = semantic ? 'fused' : 'structural (fallback: no embeddings)';
|
|
168
|
-
return { results: fused, mode_used: modeUsed };
|
|
272
|
+
return result;
|
|
169
273
|
}
|
|
170
274
|
//# sourceMappingURL=search.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/kb-server/tools/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/kb-server/tools/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AA8BrD,iFAAiF;AAEjF,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE,WAAW;IACjB,WAAW,EACT,yFAAyF;QACzF,sDAAsD;QACtD,+FAA+F;QAC/F,oEAAoE;IACtE,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sBAAsB;aACpC;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAC;gBACzC,WAAW,EAAE,sCAAsC;aACpD;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mDAAmD;aACjE;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB;CACO,CAAC;AA+CX;;;;;;;GAOG;AACH,SAAS,iBAAiB,CAAC,KAAa;IACtC,gFAAgF;IAChF,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED,SAAS,0BAA0B,CAAC,EAAqB;IACvD,IAAI,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC,GAAG,EAA6B,CAAC;QACvF,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,CACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAC/D,CAAC;IAEF,OAAO;QACL,MAAM,CAAC,yBAAyB,CAAC;QACjC,MAAM,CAAC,sBAAsB,CAAC;QAC9B,MAAM,CAAC,gBAAgB,CAAC;QACxB,MAAM,CAAC,iBAAiB,CAAC;KAC1B,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AAChC,CAAC;AAED,gEAAgE;AAChE,SAAS,gBAAgB,CACvB,EAAqB,EACrB,KAAa,EACb,KAAa,EACb,MAAe;IAEf,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,oBAAoB,GAAG,0BAA0B,CAAC,EAAE,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG;;;kBAGE,oBAAoB;;;;;;qCAMD,YAAY;;mBAE9B,CAAC;QAChB,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAyB,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;QACrD,MAAM,SAAS,GAAG,IAAI,KAAK,GAAG,CAAC;QAC/B,MAAM,GAAG,GAAG;;;kBAGE,oBAAoB;;;;;+BAKP,YAAY;mBACxB,CAAC;QAChB,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACtF,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAyB,CAAC;IAChE,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,EAAqB,EAAE,IAAY;IAC1D,MAAM,GAAG,GAAG,EAAE;SACX,OAAO,CACN,sGAAsG,CACvG;SACA,GAAG,CAAC,IAAI,CAAoC,CAAC;IAChD,OAAO,GAAG,EAAE,OAAO,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,oBAAoB,CAC3B,EAAqB,EACrB,WAAqB,EACrB,KAAa,EACb,MAAe;IAEf,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,mBAAmB,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,UAAU,GAAG,0BAA0B,CAAC,EAAE,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG;;;gBAGE,UAAU;;;;;;iCAMO,YAAY;;gBAE7B,CAAC;IACf,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS;QACjC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC;QAC9C,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC;IAEzC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAyB,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAC/B,EAAqB,EACrB,WAAqB,EACrB,KAAa,EACb,MAAe;IAEf,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,wBAAwB,CAAC,EAAE,CAAC;QACnD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,yBAAyB,CAAC,EAAE,EAAE;YACzC,WAAW;YACX,MAAM;YACN,KAAK;SACN,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,WAAW,EAAE,aAAa;YAC1B,cAAc,EAAE,GAAG,CAAC,EAAE;YACtB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,SAAS;YAChC,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,GAAG,CAAC,QAAQ;YACvB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,MAAM,EAAE,GAAG,CAAC,UAAU;SACvB,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,cAAc,CAC3B,EAAqB,EACrB,KAAa,EACb,KAAa,EACb,QAA2B,EAC3B,MAAe;IAEf,IAAI,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,UAAU,GAAG,oBAAoB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,wBAAwB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;aACrC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAEnB,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,OAAO,CACd,UAAgC,EAChC,QAAmC,EACnC,KAAa;IAEb,MAAM,CAAC,GAAG,EAAE,CAAC;IACb,MAAM,MAAM,GAAG,IAAI,GAAG,EAAqD,CAAC;IAE5E,MAAM,SAAS,GAAG,CAAC,IAAsB,EAAU,EAAE,CACnD,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;IAE5F,MAAM,OAAO,GAAG,CAAC,IAAwB,EAAQ,EAAE;QACjD,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YACzB,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;YAClC,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,CAAC,UAAU,CAAC,CAAC;IACpB,IAAI,QAAQ;QAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEhC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;SAC/B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;SACf,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,EAAqB,EACrB,IAAgB,EAChB,QAA4B,EAC5B,QAAyB;IAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC;IAEvC,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAExE,IAAI,MAAoB,CAAC;IAEzB,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,MAAM,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IAC5D,CAAC;SAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrB,0EAA0E;QAC1E,MAAM,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,qCAAqC,EAAE,CAAC;IACrF,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAEpF,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,GAAG,QAAQ;gBACf,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE;gBAC9C,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,sCAAsC,EAAE,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,mBAAmB;YACnB,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC,CAAC;YAC7E,MAAM,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YACH,QAAQ,CAAC;gBACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,aAAa,EAAE,IAAI;gBACnB,QAAQ,EAAE,MAAM,CAAC,SAAS;gBAC1B,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;gBAClC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;gBACrE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jafreck/lore",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Language-aware codebase indexer — tree-sitter parsing, symbol extraction, call-graph construction, and optional embeddings for semantic search",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -12,6 +12,14 @@
|
|
|
12
12
|
},
|
|
13
13
|
"./mcp": {
|
|
14
14
|
"default": "./dist/kb-server/server.js"
|
|
15
|
+
},
|
|
16
|
+
"./kb-server/db": {
|
|
17
|
+
"types": "./dist/kb-server/db.d.ts",
|
|
18
|
+
"default": "./dist/kb-server/db.js"
|
|
19
|
+
},
|
|
20
|
+
"./kb-server/tools/*": {
|
|
21
|
+
"types": "./dist/kb-server/tools/*.d.ts",
|
|
22
|
+
"default": "./dist/kb-server/tools/*.js"
|
|
15
23
|
}
|
|
16
24
|
},
|
|
17
25
|
"bin": {
|
|
@@ -24,6 +32,7 @@
|
|
|
24
32
|
"build": "tsc",
|
|
25
33
|
"clean": "rm -rf dist",
|
|
26
34
|
"lint": "tsc --noEmit",
|
|
35
|
+
"prepare": "npm run build",
|
|
27
36
|
"prepublishOnly": "npm run clean && npm run build",
|
|
28
37
|
"test": "vitest run",
|
|
29
38
|
"coverage": "vitest run --coverage"
|
|
@@ -52,13 +61,13 @@
|
|
|
52
61
|
"fast-glob": "^3.3.3",
|
|
53
62
|
"simple-git": "^3.32.3",
|
|
54
63
|
"sqlite-vec": "^0.1.6",
|
|
55
|
-
"tree-sitter": "0.
|
|
64
|
+
"tree-sitter": "0.22.4",
|
|
56
65
|
"tree-sitter-bash": "^0.25.1",
|
|
57
|
-
"tree-sitter-c": "0.
|
|
66
|
+
"tree-sitter-c": "0.24.1",
|
|
58
67
|
"tree-sitter-c-sharp": "0.23.1",
|
|
59
68
|
"tree-sitter-cpp": "0.23.4",
|
|
60
69
|
"tree-sitter-dart": "^1.0.0",
|
|
61
|
-
"tree-sitter-elixir": "^0.3.
|
|
70
|
+
"tree-sitter-elixir": "^0.3.5",
|
|
62
71
|
"tree-sitter-elm": "^4.5.0",
|
|
63
72
|
"tree-sitter-go": "0.23.4",
|
|
64
73
|
"tree-sitter-haskell": "^0.23.1",
|
|
@@ -70,9 +79,9 @@
|
|
|
70
79
|
"tree-sitter-objc": "^3.0.2",
|
|
71
80
|
"tree-sitter-ocaml": "^0.24.2",
|
|
72
81
|
"tree-sitter-php": "^0.24.2",
|
|
73
|
-
"tree-sitter-python": "0.23.
|
|
82
|
+
"tree-sitter-python": "0.23.6",
|
|
74
83
|
"tree-sitter-ruby": "^0.23.1",
|
|
75
|
-
"tree-sitter-rust": "0.
|
|
84
|
+
"tree-sitter-rust": "0.24.0",
|
|
76
85
|
"tree-sitter-scala": "^0.24.0",
|
|
77
86
|
"tree-sitter-swift": "^0.7.1",
|
|
78
87
|
"tree-sitter-typescript": "0.23.2",
|
|
@@ -81,7 +90,7 @@
|
|
|
81
90
|
},
|
|
82
91
|
"devDependencies": {
|
|
83
92
|
"@types/better-sqlite3": "^7.6.13",
|
|
84
|
-
"@types/node": "^
|
|
93
|
+
"@types/node": "^25",
|
|
85
94
|
"@vitest/coverage-v8": "^4.0",
|
|
86
95
|
"typescript": "^5.9",
|
|
87
96
|
"vitest": "^4.0"
|