@jafreck/lore 0.2.0 → 0.2.2
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 +399 -199
- package/dist/cli.js +139 -18
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/indexer/db.d.ts +12 -11
- package/dist/indexer/db.d.ts.map +1 -1
- package/dist/indexer/db.js +118 -18
- 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/ensure-python-deps.d.ts +1 -1
- package/dist/indexer/ensure-python-deps.js +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-history.d.ts.map +1 -1
- package/dist/indexer/git-history.js +4 -4
- package/dist/indexer/git-history.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 +35 -9
- package/dist/indexer/index.d.ts.map +1 -1
- package/dist/indexer/index.js +470 -30
- 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 +8 -1
- package/dist/indexer/poller.d.ts.map +1 -1
- package/dist/indexer/poller.js +7 -1
- 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 +8 -1
- package/dist/indexer/watcher.d.ts.map +1 -1
- package/dist/indexer/watcher.js +7 -1
- package/dist/indexer/watcher.js.map +1 -1
- package/dist/{kb-server → lore-server}/db.d.ts +158 -4
- package/dist/lore-server/db.d.ts.map +1 -0
- package/dist/{kb-server → lore-server}/db.js +457 -26
- package/dist/lore-server/db.js.map +1 -0
- package/dist/lore-server/server.d.ts +43 -0
- package/dist/lore-server/server.d.ts.map +1 -0
- package/dist/lore-server/server.js +385 -0
- package/dist/lore-server/server.js.map +1 -0
- package/dist/{kb-server → lore-server}/tools/annotations.d.ts +2 -2
- package/dist/lore-server/tools/annotations.d.ts.map +1 -0
- package/dist/{kb-server → lore-server}/tools/annotations.js +2 -2
- package/dist/lore-server/tools/annotations.js.map +1 -0
- package/dist/{kb-server → lore-server}/tools/architecture.d.ts +9 -2
- package/dist/lore-server/tools/architecture.d.ts.map +1 -0
- package/dist/{kb-server → lore-server}/tools/architecture.js +37 -2
- package/dist/lore-server/tools/architecture.js.map +1 -0
- package/dist/lore-server/tools/blame.d.ts +159 -0
- package/dist/lore-server/tools/blame.d.ts.map +1 -0
- package/dist/lore-server/tools/blame.js +595 -0
- package/dist/lore-server/tools/blame.js.map +1 -0
- package/dist/{kb-server → lore-server}/tools/coverage.d.ts +2 -2
- package/dist/lore-server/tools/coverage.d.ts.map +1 -0
- package/dist/{kb-server → lore-server}/tools/coverage.js +2 -2
- package/dist/lore-server/tools/coverage.js.map +1 -0
- package/dist/lore-server/tools/docs.d.ts +86 -0
- package/dist/lore-server/tools/docs.d.ts.map +1 -0
- package/dist/lore-server/tools/docs.js +243 -0
- package/dist/lore-server/tools/docs.js.map +1 -0
- package/dist/{kb-server → lore-server}/tools/graph.d.ts +40 -3
- package/dist/lore-server/tools/graph.d.ts.map +1 -0
- package/dist/{kb-server → lore-server}/tools/graph.js +122 -11
- package/dist/lore-server/tools/graph.js.map +1 -0
- package/dist/{kb-server → lore-server}/tools/history.d.ts +13 -6
- package/dist/lore-server/tools/history.d.ts.map +1 -0
- package/dist/{kb-server → lore-server}/tools/history.js +43 -10
- package/dist/lore-server/tools/history.js.map +1 -0
- package/dist/lore-server/tools/lookup.d.ts +75 -0
- package/dist/lore-server/tools/lookup.d.ts.map +1 -0
- package/dist/lore-server/tools/lookup.js +148 -0
- package/dist/lore-server/tools/lookup.js.map +1 -0
- package/dist/{kb-server → lore-server}/tools/metrics.d.ts +3 -3
- package/dist/lore-server/tools/metrics.d.ts.map +1 -0
- package/dist/{kb-server → lore-server}/tools/metrics.js +3 -3
- package/dist/lore-server/tools/metrics.js.map +1 -0
- package/dist/{kb-server → lore-server}/tools/notes.d.ts +16 -16
- package/dist/lore-server/tools/notes.d.ts.map +1 -0
- package/dist/{kb-server → lore-server}/tools/notes.js +55 -20
- package/dist/lore-server/tools/notes.js.map +1 -0
- package/dist/{kb-server → lore-server}/tools/routes.d.ts +2 -2
- package/dist/lore-server/tools/routes.d.ts.map +1 -0
- package/dist/{kb-server → lore-server}/tools/routes.js +2 -2
- package/dist/lore-server/tools/routes.js.map +1 -0
- package/dist/{kb-server → lore-server}/tools/search.d.ts +57 -13
- package/dist/lore-server/tools/search.d.ts.map +1 -0
- package/dist/{kb-server → lore-server}/tools/search.js +123 -23
- package/dist/lore-server/tools/search.js.map +1 -0
- package/dist/{kb-server → lore-server}/tools/snippet.d.ts +20 -4
- package/dist/lore-server/tools/snippet.d.ts.map +1 -0
- package/dist/lore-server/tools/snippet.js +116 -0
- package/dist/lore-server/tools/snippet.js.map +1 -0
- package/dist/{kb-server → lore-server}/tools/test-map.d.ts +2 -2
- package/dist/lore-server/tools/test-map.d.ts.map +1 -0
- package/dist/{kb-server → lore-server}/tools/test-map.js +2 -2
- package/dist/lore-server/tools/test-map.js.map +1 -0
- package/dist/{kb-server → lore-server}/tools/writeback.d.ts +2 -2
- package/dist/lore-server/tools/writeback.d.ts.map +1 -0
- package/dist/{kb-server → lore-server}/tools/writeback.js +3 -3
- package/dist/lore-server/tools/writeback.js.map +1 -0
- package/package.json +14 -14
- package/dist/kb-server/db.d.ts.map +0 -1
- package/dist/kb-server/db.js.map +0 -1
- package/dist/kb-server/server.d.ts +0 -42
- package/dist/kb-server/server.d.ts.map +0 -1
- package/dist/kb-server/server.js +0 -241
- package/dist/kb-server/server.js.map +0 -1
- package/dist/kb-server/tools/annotations.d.ts.map +0 -1
- package/dist/kb-server/tools/annotations.js.map +0 -1
- package/dist/kb-server/tools/architecture.d.ts.map +0 -1
- package/dist/kb-server/tools/architecture.js.map +0 -1
- package/dist/kb-server/tools/blame.d.ts +0 -67
- package/dist/kb-server/tools/blame.d.ts.map +0 -1
- package/dist/kb-server/tools/blame.js +0 -162
- package/dist/kb-server/tools/blame.js.map +0 -1
- package/dist/kb-server/tools/coverage.d.ts.map +0 -1
- package/dist/kb-server/tools/coverage.js.map +0 -1
- package/dist/kb-server/tools/graph.d.ts.map +0 -1
- package/dist/kb-server/tools/graph.js.map +0 -1
- package/dist/kb-server/tools/history.d.ts.map +0 -1
- package/dist/kb-server/tools/history.js.map +0 -1
- package/dist/kb-server/tools/lookup.d.ts +0 -36
- package/dist/kb-server/tools/lookup.d.ts.map +0 -1
- package/dist/kb-server/tools/lookup.js +0 -45
- package/dist/kb-server/tools/lookup.js.map +0 -1
- package/dist/kb-server/tools/metrics.d.ts.map +0 -1
- package/dist/kb-server/tools/metrics.js.map +0 -1
- package/dist/kb-server/tools/notes.d.ts.map +0 -1
- package/dist/kb-server/tools/notes.js.map +0 -1
- package/dist/kb-server/tools/routes.d.ts.map +0 -1
- package/dist/kb-server/tools/routes.js.map +0 -1
- package/dist/kb-server/tools/search.d.ts.map +0 -1
- package/dist/kb-server/tools/search.js.map +0 -1
- package/dist/kb-server/tools/snippet.d.ts.map +0 -1
- package/dist/kb-server/tools/snippet.js +0 -49
- package/dist/kb-server/tools/snippet.js.map +0 -1
- package/dist/kb-server/tools/test-map.d.ts.map +0 -1
- package/dist/kb-server/tools/test-map.js.map +0 -1
- package/dist/kb-server/tools/writeback.d.ts.map +0 -1
- package/dist/kb-server/tools/writeback.js.map +0 -1
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module
|
|
2
|
+
* @module lore-server/tools/notes
|
|
3
3
|
*
|
|
4
4
|
* MCP tools:
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
5
|
+
* - lore_notes_write: upsert notes by (key, scope)
|
|
6
|
+
* - lore_notes_read: retrieve notes with staleness/recency metadata
|
|
7
7
|
*/
|
|
8
8
|
import Database from 'better-sqlite3';
|
|
9
9
|
const DEFAULT_SCOPE = 'global';
|
|
10
10
|
const DEFAULT_LIMIT = 20;
|
|
11
11
|
const MAX_LIMIT = 200;
|
|
12
|
-
export const
|
|
13
|
-
name: '
|
|
12
|
+
export const loreNotesWriteToolDef = {
|
|
13
|
+
name: 'lore_notes_write',
|
|
14
14
|
description: 'Upsert an LLM-authored note in the knowledge base by key and scope. ' +
|
|
15
15
|
'Defaults scope to "global" and updates updated_at on existing notes.',
|
|
16
16
|
inputSchema: {
|
|
@@ -31,8 +31,8 @@ export const kbNotesWriteToolDef = {
|
|
|
31
31
|
required: ['key', 'content'],
|
|
32
32
|
},
|
|
33
33
|
};
|
|
34
|
-
export const
|
|
35
|
-
name: '
|
|
34
|
+
export const loreNotesReadToolDef = {
|
|
35
|
+
name: 'lore_notes_read',
|
|
36
36
|
description: 'Read notes by exact key and/or key prefix, optionally filtered by scope. ' +
|
|
37
37
|
'Returns staleness metadata for file-scoped notes and recency metadata for global notes.',
|
|
38
38
|
inputSchema: {
|
|
@@ -55,7 +55,19 @@ function clampLimit(limit) {
|
|
|
55
55
|
return DEFAULT_LIMIT;
|
|
56
56
|
return Math.min(Math.max(1, Math.floor(limit)), MAX_LIMIT);
|
|
57
57
|
}
|
|
58
|
-
|
|
58
|
+
function parseDocScope(scope) {
|
|
59
|
+
if (!scope.startsWith('doc:'))
|
|
60
|
+
return null;
|
|
61
|
+
const encoded = scope.slice('doc:'.length);
|
|
62
|
+
const branchSeparator = encoded.lastIndexOf('@');
|
|
63
|
+
if (branchSeparator <= 0)
|
|
64
|
+
return null;
|
|
65
|
+
return {
|
|
66
|
+
path: encoded.slice(0, branchSeparator),
|
|
67
|
+
branch: encoded.slice(branchSeparator + 1),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function loreNotesWriteHandler(dbPath, args) {
|
|
59
71
|
const db = new Database(dbPath);
|
|
60
72
|
try {
|
|
61
73
|
db.pragma('foreign_keys = ON');
|
|
@@ -83,7 +95,7 @@ export function kbNotesWriteHandler(dbPath, args) {
|
|
|
83
95
|
db.close();
|
|
84
96
|
}
|
|
85
97
|
}
|
|
86
|
-
export function
|
|
98
|
+
export function loreNotesReadHandler(db, args) {
|
|
87
99
|
const limit = clampLimit(args.limit);
|
|
88
100
|
const where = [];
|
|
89
101
|
const params = [];
|
|
@@ -110,16 +122,39 @@ export function kbNotesReadHandler(db, args) {
|
|
|
110
122
|
ORDER BY updated_at DESC, id DESC
|
|
111
123
|
LIMIT ?`)
|
|
112
124
|
.all(...params, limit);
|
|
113
|
-
const
|
|
125
|
+
const loreIndexedAtRow = db
|
|
114
126
|
.prepare('SELECT MAX(indexed_at) AS indexed_at FROM files')
|
|
115
127
|
.get();
|
|
116
|
-
const
|
|
128
|
+
const loreIndexedAt = loreIndexedAtRow.indexed_at;
|
|
117
129
|
const getFileRecency = db.prepare(`SELECT last_hash, indexed_at
|
|
118
130
|
FROM files
|
|
119
131
|
WHERE path = ?
|
|
120
132
|
ORDER BY indexed_at DESC
|
|
121
133
|
LIMIT 1`);
|
|
134
|
+
const getDocRecency = db.prepare(`SELECT content_hash, indexed_at
|
|
135
|
+
FROM docs
|
|
136
|
+
WHERE path = ? AND branch = ?
|
|
137
|
+
ORDER BY indexed_at DESC
|
|
138
|
+
LIMIT 1`);
|
|
122
139
|
const notes = rows.map((row) => {
|
|
140
|
+
const docScope = parseDocScope(row.scope);
|
|
141
|
+
if (docScope) {
|
|
142
|
+
const docRow = getDocRecency.get(docScope.path, docScope.branch);
|
|
143
|
+
const stale = !docRow || (row.source_hash != null && row.source_hash !== docRow.content_hash);
|
|
144
|
+
const staleReason = !docRow
|
|
145
|
+
? 'doc_missing'
|
|
146
|
+
: stale
|
|
147
|
+
? 'source_hash_mismatch'
|
|
148
|
+
: null;
|
|
149
|
+
return {
|
|
150
|
+
...row,
|
|
151
|
+
stale,
|
|
152
|
+
stale_reason: staleReason,
|
|
153
|
+
file_last_hash: null,
|
|
154
|
+
file_indexed_at: null,
|
|
155
|
+
lore_indexed_at: null,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
123
158
|
if (row.scope.startsWith('file:')) {
|
|
124
159
|
const filePath = row.scope.slice('file:'.length);
|
|
125
160
|
const fileRow = getFileRecency.get(filePath);
|
|
@@ -143,18 +178,18 @@ export function kbNotesReadHandler(db, args) {
|
|
|
143
178
|
stale_reason: staleReason,
|
|
144
179
|
file_last_hash: fileRow?.last_hash ?? null,
|
|
145
180
|
file_indexed_at: fileRow?.indexed_at ?? null,
|
|
146
|
-
|
|
181
|
+
lore_indexed_at: null,
|
|
147
182
|
};
|
|
148
183
|
}
|
|
149
184
|
if (row.scope === DEFAULT_SCOPE) {
|
|
150
|
-
const stale =
|
|
185
|
+
const stale = loreIndexedAt != null ? row.updated_at < loreIndexedAt : false;
|
|
151
186
|
return {
|
|
152
187
|
...row,
|
|
153
188
|
stale,
|
|
154
|
-
stale_reason: stale ? '
|
|
189
|
+
stale_reason: stale ? 'lore_reindexed_since_note' : null,
|
|
155
190
|
file_last_hash: null,
|
|
156
191
|
file_indexed_at: null,
|
|
157
|
-
|
|
192
|
+
lore_indexed_at: loreIndexedAt,
|
|
158
193
|
};
|
|
159
194
|
}
|
|
160
195
|
return {
|
|
@@ -163,13 +198,13 @@ export function kbNotesReadHandler(db, args) {
|
|
|
163
198
|
stale_reason: null,
|
|
164
199
|
file_last_hash: null,
|
|
165
200
|
file_indexed_at: null,
|
|
166
|
-
|
|
201
|
+
lore_indexed_at: null,
|
|
167
202
|
};
|
|
168
203
|
});
|
|
169
204
|
return { notes, count: notes.length };
|
|
170
205
|
}
|
|
171
|
-
export const writeToolDef =
|
|
172
|
-
export const readToolDef =
|
|
173
|
-
export const writeHandler =
|
|
174
|
-
export const readHandler =
|
|
206
|
+
export const writeToolDef = loreNotesWriteToolDef;
|
|
207
|
+
export const readToolDef = loreNotesReadToolDef;
|
|
208
|
+
export const writeHandler = loreNotesWriteHandler;
|
|
209
|
+
export const readHandler = loreNotesReadHandler;
|
|
175
210
|
//# sourceMappingURL=notes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notes.js","sourceRoot":"","sources":["../../../src/lore-server/tools/notes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module
|
|
2
|
+
* @module lore-server/tools/routes
|
|
3
3
|
*
|
|
4
4
|
* MCP tool: query extracted API routes/endpoints.
|
|
5
5
|
*/
|
|
6
6
|
import type { Database } from '../db.js';
|
|
7
7
|
import { type ApiRouteRow } from '../db.js';
|
|
8
8
|
export declare const toolDef: {
|
|
9
|
-
readonly name: "
|
|
9
|
+
readonly name: "lore_routes";
|
|
10
10
|
readonly description: string;
|
|
11
11
|
readonly inputSchema: {
|
|
12
12
|
readonly type: "object";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/lore-server/tools/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAE3D,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;CAsBV,CAAC;AAEX,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,CAQ7E"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module
|
|
2
|
+
* @module lore-server/tools/routes
|
|
3
3
|
*
|
|
4
4
|
* MCP tool: query extracted API routes/endpoints.
|
|
5
5
|
*/
|
|
6
6
|
import { listApiRoutes } from '../db.js';
|
|
7
7
|
export const toolDef = {
|
|
8
|
-
name: '
|
|
8
|
+
name: 'lore_routes',
|
|
9
9
|
description: 'Query extracted API routes/endpoints from the knowledge-base index. ' +
|
|
10
10
|
'Optional filters: `method`, `path_prefix`, and `framework`.',
|
|
11
11
|
inputSchema: {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/lore-server/tools/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAoB,MAAM,UAAU,CAAC;AAE3D,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,sEAAsE;QACtE,6DAA6D;IAC/D,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sDAAsD;aACpE;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oCAAoC;aAClD;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gEAAgE;aAC9E;SACF;KACF;CACO,CAAC;AAYX,MAAM,UAAU,OAAO,CAAC,EAAqB,EAAE,IAAgB;IAC7D,OAAO;QACL,OAAO,EAAE,aAAa,CAAC,EAAE,EAAE;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module
|
|
2
|
+
* @module lore-server/tools/search
|
|
3
3
|
*
|
|
4
4
|
* MCP tool: multi-modal knowledge-base search.
|
|
5
5
|
*
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
import type { Database } from '../db.js';
|
|
15
15
|
import type { EmbeddingProvider } from '../../indexer/embedder.js';
|
|
16
16
|
/**
|
|
17
|
-
* Observation emitted after every `
|
|
17
|
+
* Observation emitted after every `lore_search` invocation.
|
|
18
18
|
* Consumers can use this to log, collect metrics, or detect search-quality issues.
|
|
19
19
|
*/
|
|
20
20
|
export interface SearchObservation {
|
|
@@ -38,7 +38,7 @@ export interface SearchObservation {
|
|
|
38
38
|
/** Callback invoked after each search completes. Fire-and-forget — errors are swallowed. */
|
|
39
39
|
export type SearchObserver = (observation: SearchObservation) => void;
|
|
40
40
|
export declare const toolDef: {
|
|
41
|
-
readonly name: "
|
|
41
|
+
readonly name: "lore_search";
|
|
42
42
|
readonly description: string;
|
|
43
43
|
readonly inputSchema: {
|
|
44
44
|
readonly type: "object";
|
|
@@ -56,6 +56,26 @@ export declare const toolDef: {
|
|
|
56
56
|
readonly type: "number";
|
|
57
57
|
readonly description: "Maximum number of results to return (default 20).";
|
|
58
58
|
};
|
|
59
|
+
readonly path_prefix: {
|
|
60
|
+
readonly type: "string";
|
|
61
|
+
readonly description: "Optional source file path prefix filter for symbol results.";
|
|
62
|
+
};
|
|
63
|
+
readonly language: {
|
|
64
|
+
readonly type: "string";
|
|
65
|
+
readonly description: "Optional source language filter for symbol results.";
|
|
66
|
+
};
|
|
67
|
+
readonly kind: {
|
|
68
|
+
readonly type: "string";
|
|
69
|
+
readonly description: "Optional symbol kind filter for symbol results.";
|
|
70
|
+
};
|
|
71
|
+
readonly doc_path_prefix: {
|
|
72
|
+
readonly type: "string";
|
|
73
|
+
readonly description: "Optional documentation path prefix filter for semantic/fused doc-section results.";
|
|
74
|
+
};
|
|
75
|
+
readonly doc_kind: {
|
|
76
|
+
readonly type: "string";
|
|
77
|
+
readonly description: "Optional documentation kind filter for semantic/fused doc-section results.";
|
|
78
|
+
};
|
|
59
79
|
};
|
|
60
80
|
readonly required: readonly ["query"];
|
|
61
81
|
};
|
|
@@ -65,20 +85,44 @@ export interface SearchArgs {
|
|
|
65
85
|
mode?: 'structural' | 'semantic' | 'fused';
|
|
66
86
|
limit?: number;
|
|
67
87
|
branch?: string;
|
|
88
|
+
path_prefix?: string;
|
|
89
|
+
language?: string;
|
|
90
|
+
kind?: string;
|
|
91
|
+
doc_path_prefix?: string;
|
|
92
|
+
doc_kind?: string;
|
|
68
93
|
}
|
|
69
94
|
export interface SearchResult {
|
|
70
|
-
results:
|
|
71
|
-
symbol_id: number;
|
|
72
|
-
name: string;
|
|
73
|
-
kind: string;
|
|
74
|
-
file_path: string;
|
|
75
|
-
start_line: number;
|
|
76
|
-
end_line: number;
|
|
77
|
-
score: number;
|
|
78
|
-
branch: string;
|
|
79
|
-
}>;
|
|
95
|
+
results: SearchResultItem[];
|
|
80
96
|
mode_used: string;
|
|
81
97
|
}
|
|
98
|
+
export interface SearchSymbolResult {
|
|
99
|
+
result_type: 'symbol';
|
|
100
|
+
symbol_id: number;
|
|
101
|
+
name: string;
|
|
102
|
+
kind: string;
|
|
103
|
+
file_path: string;
|
|
104
|
+
start_line: number;
|
|
105
|
+
end_line: number;
|
|
106
|
+
score: number;
|
|
107
|
+
branch: string;
|
|
108
|
+
}
|
|
109
|
+
export interface SearchDocSectionResult {
|
|
110
|
+
result_type: 'doc_section';
|
|
111
|
+
doc_section_id: number;
|
|
112
|
+
doc_id: number;
|
|
113
|
+
doc_kind: string;
|
|
114
|
+
doc_title: string;
|
|
115
|
+
section_index: number;
|
|
116
|
+
heading_path: string;
|
|
117
|
+
name: string;
|
|
118
|
+
kind: string;
|
|
119
|
+
file_path: string;
|
|
120
|
+
start_line: number;
|
|
121
|
+
end_line: number;
|
|
122
|
+
score: number;
|
|
123
|
+
branch: string;
|
|
124
|
+
}
|
|
125
|
+
export type SearchResultItem = SearchSymbolResult | SearchDocSectionResult;
|
|
82
126
|
/** Execute a knowledge-base search in the requested mode. */
|
|
83
127
|
export declare function handler(db: Database.Database, args: SearchArgs, embedder?: EmbeddingProvider, observer?: SearchObserver): Promise<SearchResult>;
|
|
84
128
|
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/lore-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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CV,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;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module
|
|
2
|
+
* @module lore-server/tools/search
|
|
3
3
|
*
|
|
4
4
|
* MCP tool: multi-modal knowledge-base search.
|
|
5
5
|
*
|
|
@@ -11,9 +11,10 @@
|
|
|
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
|
-
name: '
|
|
17
|
+
name: 'lore_search',
|
|
17
18
|
description: 'Search the knowledge-base index for symbols matching a natural-language or code query. ' +
|
|
18
19
|
'mode="structural" uses BM25 FTS5 (fast, exact-ish). ' +
|
|
19
20
|
'mode="semantic" uses cosine similarity over embedding vectors (requires indexed embeddings). ' +
|
|
@@ -34,6 +35,26 @@ export const toolDef = {
|
|
|
34
35
|
type: 'number',
|
|
35
36
|
description: 'Maximum number of results to return (default 20).',
|
|
36
37
|
},
|
|
38
|
+
path_prefix: {
|
|
39
|
+
type: 'string',
|
|
40
|
+
description: 'Optional source file path prefix filter for symbol results.',
|
|
41
|
+
},
|
|
42
|
+
language: {
|
|
43
|
+
type: 'string',
|
|
44
|
+
description: 'Optional source language filter for symbol results.',
|
|
45
|
+
},
|
|
46
|
+
kind: {
|
|
47
|
+
type: 'string',
|
|
48
|
+
description: 'Optional symbol kind filter for symbol results.',
|
|
49
|
+
},
|
|
50
|
+
doc_path_prefix: {
|
|
51
|
+
type: 'string',
|
|
52
|
+
description: 'Optional documentation path prefix filter for semantic/fused doc-section results.',
|
|
53
|
+
},
|
|
54
|
+
doc_kind: {
|
|
55
|
+
type: 'string',
|
|
56
|
+
description: 'Optional documentation kind filter for semantic/fused doc-section results.',
|
|
57
|
+
},
|
|
37
58
|
},
|
|
38
59
|
required: ['query'],
|
|
39
60
|
},
|
|
@@ -50,13 +71,33 @@ function sanitizeFts5Query(query) {
|
|
|
50
71
|
// Escape interior double-quotes, then wrap in double-quotes for a phrase query.
|
|
51
72
|
return `"${query.replace(/"/g, '""')}"`;
|
|
52
73
|
}
|
|
74
|
+
function symbolEnrichmentProjection(db) {
|
|
75
|
+
let columns = new Set();
|
|
76
|
+
try {
|
|
77
|
+
const rows = db.prepare('PRAGMA table_info(symbols)').all();
|
|
78
|
+
columns = new Set(rows.map((row) => row.name));
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
columns = new Set();
|
|
82
|
+
}
|
|
83
|
+
const column = (name) => (columns.has(name) ? `s.${name} AS ${name}` : `NULL AS ${name}`);
|
|
84
|
+
return [
|
|
85
|
+
column('resolved_type_signature'),
|
|
86
|
+
column('resolved_return_type'),
|
|
87
|
+
column('definition_uri'),
|
|
88
|
+
column('definition_path'),
|
|
89
|
+
].join(',\n ');
|
|
90
|
+
}
|
|
53
91
|
/** Run a structural BM25 FTS5 search and return ranked rows. */
|
|
54
92
|
function structuralSearch(db, query, limit, branch) {
|
|
55
93
|
const safeQuery = sanitizeFts5Query(query);
|
|
56
94
|
const branchClause = branch !== undefined ? ' AND f.branch = ?' : '';
|
|
95
|
+
const enrichmentProjection = symbolEnrichmentProjection(db);
|
|
57
96
|
try {
|
|
58
|
-
const sql = `SELECT
|
|
97
|
+
const sql = `SELECT 'symbol' AS result_type,
|
|
98
|
+
s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
|
|
59
99
|
s.start_line, s.end_line,
|
|
100
|
+
${enrichmentProjection},
|
|
60
101
|
bm25(symbols_fts) AS score,
|
|
61
102
|
f.branch AS branch
|
|
62
103
|
FROM symbols_fts
|
|
@@ -64,7 +105,7 @@ function structuralSearch(db, query, limit, branch) {
|
|
|
64
105
|
JOIN files f ON f.id = s.file_id
|
|
65
106
|
WHERE symbols_fts MATCH ?${branchClause}
|
|
66
107
|
ORDER BY score
|
|
67
|
-
|
|
108
|
+
LIMIT ?`;
|
|
68
109
|
const params = branch !== undefined ? [safeQuery, branch, limit] : [safeQuery, limit];
|
|
69
110
|
const rows = db.prepare(sql).all(...params);
|
|
70
111
|
return rows;
|
|
@@ -72,18 +113,85 @@ function structuralSearch(db, query, limit, branch) {
|
|
|
72
113
|
catch {
|
|
73
114
|
// FTS5 parse error — fall back to LIKE-based search.
|
|
74
115
|
const likeQuery = `%${query}%`;
|
|
75
|
-
const sql = `SELECT
|
|
116
|
+
const sql = `SELECT 'symbol' AS result_type,
|
|
117
|
+
s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
|
|
76
118
|
s.start_line, s.end_line,
|
|
119
|
+
${enrichmentProjection},
|
|
77
120
|
0.0 AS score,
|
|
78
121
|
f.branch AS branch
|
|
79
122
|
FROM symbols s
|
|
80
123
|
JOIN files f ON f.id = s.file_id
|
|
81
124
|
WHERE s.name LIKE ?${branchClause}
|
|
82
|
-
|
|
125
|
+
LIMIT ?`;
|
|
83
126
|
const params = branch !== undefined ? [likeQuery, branch, limit] : [likeQuery, limit];
|
|
84
127
|
return db.prepare(sql).all(...params);
|
|
85
128
|
}
|
|
86
129
|
}
|
|
130
|
+
function hasVirtualTable(db, name) {
|
|
131
|
+
const row = db
|
|
132
|
+
.prepare("SELECT 1 AS present FROM sqlite_master WHERE type IN ('table', 'virtual table') AND name = ? LIMIT 1")
|
|
133
|
+
.get(name);
|
|
134
|
+
return row?.present === 1;
|
|
135
|
+
}
|
|
136
|
+
function semanticSymbolSearch(db, queryVector, limit, branch) {
|
|
137
|
+
if (!hasVirtualTable(db, 'symbol_embeddings')) {
|
|
138
|
+
return [];
|
|
139
|
+
}
|
|
140
|
+
const branchClause = branch !== undefined ? ' AND f.branch = ?' : '';
|
|
141
|
+
const enrichment = symbolEnrichmentProjection(db);
|
|
142
|
+
const sql = `SELECT 'symbol' AS result_type,
|
|
143
|
+
s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
|
|
144
|
+
s.start_line, s.end_line,
|
|
145
|
+
${enrichment},
|
|
146
|
+
distance AS score,
|
|
147
|
+
f.branch AS branch
|
|
148
|
+
FROM symbol_embeddings
|
|
149
|
+
JOIN symbols s ON s.rowid = symbol_embeddings.rowid
|
|
150
|
+
JOIN files f ON f.id = s.file_id
|
|
151
|
+
WHERE embedding MATCH ?${branchClause}
|
|
152
|
+
ORDER BY distance
|
|
153
|
+
LIMIT ?`;
|
|
154
|
+
const params = branch !== undefined
|
|
155
|
+
? [JSON.stringify(queryVector), branch, limit]
|
|
156
|
+
: [JSON.stringify(queryVector), limit];
|
|
157
|
+
try {
|
|
158
|
+
return db.prepare(sql).all(...params);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function semanticDocSectionSearch(db, queryVector, limit, branch) {
|
|
165
|
+
if (!hasVirtualTable(db, 'doc_section_embeddings')) {
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
const rows = semanticSearchDocSections(db, {
|
|
170
|
+
queryVector,
|
|
171
|
+
branch,
|
|
172
|
+
limit,
|
|
173
|
+
});
|
|
174
|
+
return rows.map((row) => ({
|
|
175
|
+
result_type: 'doc_section',
|
|
176
|
+
doc_section_id: row.id,
|
|
177
|
+
doc_id: row.doc_id,
|
|
178
|
+
doc_kind: row.doc_kind,
|
|
179
|
+
doc_title: row.doc_title,
|
|
180
|
+
section_index: row.section_index,
|
|
181
|
+
heading_path: row.heading_path,
|
|
182
|
+
name: row.title || row.doc_title,
|
|
183
|
+
kind: 'doc_section',
|
|
184
|
+
file_path: row.doc_path,
|
|
185
|
+
start_line: row.line_start,
|
|
186
|
+
end_line: row.line_end,
|
|
187
|
+
score: row.score,
|
|
188
|
+
branch: row.doc_branch,
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
}
|
|
87
195
|
/**
|
|
88
196
|
* Attempt a semantic (cosine) search via the vec0 virtual table.
|
|
89
197
|
* Returns `null` when no embedder is available or the table has no rows.
|
|
@@ -93,21 +201,11 @@ async function semanticSearch(db, query, limit, embedder, branch) {
|
|
|
93
201
|
const [queryVec] = await embedder.embed([query]);
|
|
94
202
|
if (!queryVec)
|
|
95
203
|
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);
|
|
204
|
+
const symbolRows = semanticSymbolSearch(db, queryVec, limit, branch);
|
|
205
|
+
const docRows = semanticDocSectionSearch(db, queryVec, limit, branch);
|
|
206
|
+
const rows = [...symbolRows, ...docRows]
|
|
207
|
+
.sort((a, b) => a.score - b.score)
|
|
208
|
+
.slice(0, limit);
|
|
111
209
|
return rows.length > 0 ? rows : null;
|
|
112
210
|
}
|
|
113
211
|
catch {
|
|
@@ -123,15 +221,17 @@ async function semanticSearch(db, query, limit, embedder, branch) {
|
|
|
123
221
|
function rrfFuse(structural, semantic, limit) {
|
|
124
222
|
const k = 60;
|
|
125
223
|
const scores = new Map();
|
|
224
|
+
const resultKey = (item) => item.result_type === 'symbol' ? `symbol:${item.symbol_id}` : `doc:${item.doc_section_id}`;
|
|
126
225
|
const addList = (list) => {
|
|
127
226
|
list.forEach((item, idx) => {
|
|
128
|
-
const
|
|
227
|
+
const key = resultKey(item);
|
|
228
|
+
const existing = scores.get(key);
|
|
129
229
|
const contrib = 1 / (k + idx + 1);
|
|
130
230
|
if (existing) {
|
|
131
231
|
existing.score += contrib;
|
|
132
232
|
}
|
|
133
233
|
else {
|
|
134
|
-
scores.set(
|
|
234
|
+
scores.set(key, { item, score: contrib });
|
|
135
235
|
}
|
|
136
236
|
});
|
|
137
237
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/lore-server/tools/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module
|
|
2
|
+
* @module lore-server/tools/snippet
|
|
3
3
|
*
|
|
4
4
|
* MCP tool: extract source-code snippets for a given file path and
|
|
5
|
-
* optional line range directly from
|
|
5
|
+
* optional line range directly from indexed source snapshots.
|
|
6
6
|
*/
|
|
7
7
|
import type { Database } from '../db.js';
|
|
8
8
|
export declare const toolDef: {
|
|
9
|
-
readonly name: "
|
|
9
|
+
readonly name: "lore_snippet";
|
|
10
10
|
readonly description: string;
|
|
11
11
|
readonly inputSchema: {
|
|
12
12
|
readonly type: "object";
|
|
@@ -23,6 +23,14 @@ export declare const toolDef: {
|
|
|
23
23
|
readonly type: "number";
|
|
24
24
|
readonly description: "Last line to include (1-based, inclusive). Defaults to end-of-file.";
|
|
25
25
|
};
|
|
26
|
+
readonly symbol: {
|
|
27
|
+
readonly type: "string";
|
|
28
|
+
readonly description: "Optional symbol name to resolve snippet bounds from indexed symbol metadata.";
|
|
29
|
+
};
|
|
30
|
+
readonly branch: {
|
|
31
|
+
readonly type: "string";
|
|
32
|
+
readonly description: "Optional branch to disambiguate the file path.";
|
|
33
|
+
};
|
|
26
34
|
};
|
|
27
35
|
readonly required: readonly ["path"];
|
|
28
36
|
};
|
|
@@ -31,14 +39,22 @@ export interface SnippetArgs {
|
|
|
31
39
|
path: string;
|
|
32
40
|
start_line?: number;
|
|
33
41
|
end_line?: number;
|
|
42
|
+
symbol?: string;
|
|
34
43
|
branch?: string;
|
|
35
44
|
}
|
|
45
|
+
export interface SnippetContainingSymbol {
|
|
46
|
+
name: string;
|
|
47
|
+
kind: string;
|
|
48
|
+
start_line: number;
|
|
49
|
+
end_line: number;
|
|
50
|
+
}
|
|
36
51
|
export interface SnippetResult {
|
|
37
52
|
path: string;
|
|
38
53
|
start_line: number;
|
|
39
54
|
end_line: number;
|
|
40
55
|
text: string;
|
|
56
|
+
containing_symbol?: SnippetContainingSymbol;
|
|
41
57
|
}
|
|
42
|
-
/** Read source lines from
|
|
58
|
+
/** Read source lines from indexed source snapshots for the given indexed file path. */
|
|
43
59
|
export declare function handler(db: Database.Database, args: SnippetArgs): SnippetResult;
|
|
44
60
|
//# sourceMappingURL=snippet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippet.d.ts","sourceRoot":"","sources":["../../../src/lore-server/tools/snippet.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKzC,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCV,CAAC;AAIX,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;CAC7C;AA+DD,uFAAuF;AACvF,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,GAAG,aAAa,CA6C/E"}
|