@jafreck/lore 0.2.1 → 0.2.3
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 +68 -17
- package/dist/cli.js +6 -6
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +6 -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 +22 -16
- package/dist/indexer/db.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/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/index.d.ts +3 -2
- package/dist/indexer/index.d.ts.map +1 -1
- package/dist/indexer/index.js +44 -16
- package/dist/indexer/index.js.map +1 -1
- package/dist/indexer/poller.d.ts +1 -1
- package/dist/indexer/poller.js +1 -1
- package/dist/indexer/watcher.d.ts +1 -1
- package/dist/indexer/watcher.js +1 -1
- package/dist/{kb-server → lore-server}/db.d.ts +76 -4
- package/dist/lore-server/db.d.ts.map +1 -0
- package/dist/{kb-server → lore-server}/db.js +219 -27
- 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/{kb-server → lore-server}/server.js +169 -46
- 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 +2 -2
- package/dist/lore-server/tools/architecture.d.ts.map +1 -0
- package/dist/{kb-server → lore-server}/tools/architecture.js +2 -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/{kb-server → lore-server}/tools/docs.d.ts +11 -3
- 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 +21 -21
- 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 +28 -3
- package/dist/lore-server/tools/search.d.ts.map +1 -0
- package/dist/{kb-server → lore-server}/tools/search.js +22 -2
- 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 +8 -8
- 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 -43
- package/dist/kb-server/server.d.ts.map +0 -1
- 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/docs.d.ts.map +0 -1
- package/dist/kb-server/tools/docs.js +0 -136
- package/dist/kb-server/tools/docs.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 -46
- 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,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module
|
|
2
|
+
* @module lore-server/tools/docs
|
|
3
3
|
*
|
|
4
4
|
* MCP tool: list, fetch, and search indexed documentation.
|
|
5
5
|
*/
|
|
6
6
|
import type { Database } from '../db.js';
|
|
7
7
|
import { type DocRow, type DocSectionRow } from '../db.js';
|
|
8
|
+
import type { EmbeddingProvider } from '../../indexer/embedder.js';
|
|
8
9
|
export declare const toolDef: {
|
|
9
|
-
readonly name: "
|
|
10
|
+
readonly name: "lore_docs";
|
|
10
11
|
readonly description: string;
|
|
11
12
|
readonly inputSchema: {
|
|
12
13
|
readonly type: "object";
|
|
@@ -24,6 +25,11 @@ export declare const toolDef: {
|
|
|
24
25
|
readonly type: "string";
|
|
25
26
|
readonly description: "Search query text (used by action=\"search\").";
|
|
26
27
|
};
|
|
28
|
+
readonly mode: {
|
|
29
|
+
readonly type: "string";
|
|
30
|
+
readonly enum: readonly ["text", "semantic", "fused"];
|
|
31
|
+
readonly description: "Search mode for action=\"search\" (default: \"text\").";
|
|
32
|
+
};
|
|
27
33
|
readonly kind: {
|
|
28
34
|
readonly type: "string";
|
|
29
35
|
readonly description: "Optional single doc kind filter.";
|
|
@@ -59,6 +65,7 @@ export interface DocsArgs {
|
|
|
59
65
|
action: 'list' | 'get' | 'search';
|
|
60
66
|
path?: string;
|
|
61
67
|
query?: string;
|
|
68
|
+
mode?: 'text' | 'semantic' | 'fused';
|
|
62
69
|
kind?: string;
|
|
63
70
|
kinds?: string[];
|
|
64
71
|
include_sections?: boolean;
|
|
@@ -69,10 +76,11 @@ export interface DocsArgs {
|
|
|
69
76
|
export interface DocsResult {
|
|
70
77
|
action: DocsArgs['action'];
|
|
71
78
|
count: number;
|
|
79
|
+
mode_used?: string;
|
|
72
80
|
docs?: DocRow[];
|
|
73
81
|
doc?: DocRow | null;
|
|
74
82
|
sections?: DocSectionRow[];
|
|
75
83
|
results?: DocSectionRow[];
|
|
76
84
|
}
|
|
77
|
-
export declare function handler(db: Database.Database, args: DocsArgs): DocsResult
|
|
85
|
+
export declare function handler(db: Database.Database, args: DocsArgs, embedder?: EmbeddingProvider): Promise<DocsResult>;
|
|
78
86
|
//# sourceMappingURL=docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../../src/lore-server/tools/docs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAML,KAAK,MAAM,EACX,KAAK,aAAa,EAEnB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDV,CAAC;AAEX,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;CAC3B;AA0FD,wBAAsB,OAAO,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,QAAQ,EACd,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,OAAO,CAAC,UAAU,CAAC,CA8HrB"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module lore-server/tools/docs
|
|
3
|
+
*
|
|
4
|
+
* MCP tool: list, fetch, and search indexed documentation.
|
|
5
|
+
*/
|
|
6
|
+
import { listDocs, getDocByPath, listDocSections, searchDocSections, semanticSearchDocSections, } from '../db.js';
|
|
7
|
+
export const toolDef = {
|
|
8
|
+
name: 'lore_docs',
|
|
9
|
+
description: 'Query indexed documentation. ' +
|
|
10
|
+
'Use action="list" to list docs, action="get" to fetch a document and optional sections, ' +
|
|
11
|
+
'or action="search" to search section/chunk content. ' +
|
|
12
|
+
'For action="search", mode="text" uses LIKE matching, mode="semantic" uses embedding similarity, ' +
|
|
13
|
+
'and mode="fused" combines both.',
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: {
|
|
17
|
+
action: {
|
|
18
|
+
type: 'string',
|
|
19
|
+
enum: ['list', 'get', 'search'],
|
|
20
|
+
description: 'Operation to execute.',
|
|
21
|
+
},
|
|
22
|
+
path: {
|
|
23
|
+
type: 'string',
|
|
24
|
+
description: 'Optional doc path filter. Required for precise get/path-scoped search.',
|
|
25
|
+
},
|
|
26
|
+
query: {
|
|
27
|
+
type: 'string',
|
|
28
|
+
description: 'Search query text (used by action="search").',
|
|
29
|
+
},
|
|
30
|
+
mode: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
enum: ['text', 'semantic', 'fused'],
|
|
33
|
+
description: 'Search mode for action="search" (default: "text").',
|
|
34
|
+
},
|
|
35
|
+
kind: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
description: 'Optional single doc kind filter.',
|
|
38
|
+
},
|
|
39
|
+
kinds: {
|
|
40
|
+
type: 'array',
|
|
41
|
+
items: { type: 'string' },
|
|
42
|
+
description: 'Optional list of doc kinds to include.',
|
|
43
|
+
},
|
|
44
|
+
include_sections: {
|
|
45
|
+
type: 'boolean',
|
|
46
|
+
description: 'When action="get", include section/chunk rows (default true).',
|
|
47
|
+
},
|
|
48
|
+
section_index: {
|
|
49
|
+
type: 'number',
|
|
50
|
+
description: 'Optional section index filter for get/search results.',
|
|
51
|
+
},
|
|
52
|
+
limit: {
|
|
53
|
+
type: 'number',
|
|
54
|
+
description: 'Maximum number of rows to return.',
|
|
55
|
+
},
|
|
56
|
+
branch: {
|
|
57
|
+
type: 'string',
|
|
58
|
+
description: 'Optional branch filter.',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
required: ['action'],
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
function hasVirtualTable(db, name) {
|
|
65
|
+
const row = db
|
|
66
|
+
.prepare("SELECT 1 AS present FROM sqlite_master WHERE type IN ('table', 'virtual table') AND name = ? LIMIT 1")
|
|
67
|
+
.get(name);
|
|
68
|
+
return row?.present === 1;
|
|
69
|
+
}
|
|
70
|
+
function filterSectionIndex(rows, sectionIndex) {
|
|
71
|
+
if (sectionIndex === undefined) {
|
|
72
|
+
return rows;
|
|
73
|
+
}
|
|
74
|
+
return rows.filter((row) => row.section_index === sectionIndex);
|
|
75
|
+
}
|
|
76
|
+
function docSectionKey(row) {
|
|
77
|
+
return `${row.doc_id}:${row.section_index}:${row.id}`;
|
|
78
|
+
}
|
|
79
|
+
function fuseDocSections(textResults, semanticResults, limit) {
|
|
80
|
+
const k = 60;
|
|
81
|
+
const scored = new Map();
|
|
82
|
+
const addList = (rows) => {
|
|
83
|
+
rows.forEach((row, idx) => {
|
|
84
|
+
const key = docSectionKey(row);
|
|
85
|
+
const contribution = 1 / (k + idx + 1);
|
|
86
|
+
const existing = scored.get(key);
|
|
87
|
+
if (existing) {
|
|
88
|
+
existing.score += contribution;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
scored.set(key, { row, score: contribution });
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
addList(textResults);
|
|
96
|
+
addList(semanticResults);
|
|
97
|
+
return Array.from(scored.values())
|
|
98
|
+
.sort((a, b) => b.score - a.score
|
|
99
|
+
|| a.row.doc_path.localeCompare(b.row.doc_path)
|
|
100
|
+
|| a.row.doc_branch.localeCompare(b.row.doc_branch)
|
|
101
|
+
|| a.row.section_index - b.row.section_index
|
|
102
|
+
|| a.row.id - b.row.id)
|
|
103
|
+
.slice(0, limit)
|
|
104
|
+
.map(({ row }) => row);
|
|
105
|
+
}
|
|
106
|
+
async function semanticDocSearch(db, args, query, limit, embedder) {
|
|
107
|
+
if (!hasVirtualTable(db, 'doc_section_embeddings')) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const [queryVector] = await embedder.embed([query]);
|
|
112
|
+
if (!queryVector || queryVector.length === 0) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
return semanticSearchDocSections(db, {
|
|
116
|
+
queryVector,
|
|
117
|
+
path: args.path,
|
|
118
|
+
branch: args.branch,
|
|
119
|
+
kind: args.kind,
|
|
120
|
+
kinds: args.kinds,
|
|
121
|
+
limit,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export async function handler(db, args, embedder) {
|
|
129
|
+
if (args.action === 'list') {
|
|
130
|
+
const docs = listDocs(db, {
|
|
131
|
+
branch: args.branch,
|
|
132
|
+
kind: args.kind,
|
|
133
|
+
kinds: args.kinds,
|
|
134
|
+
limit: args.limit ?? 100,
|
|
135
|
+
});
|
|
136
|
+
return {
|
|
137
|
+
action: 'list',
|
|
138
|
+
docs,
|
|
139
|
+
count: docs.length,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
if (args.action === 'get') {
|
|
143
|
+
const path = args.path?.trim();
|
|
144
|
+
if (!path) {
|
|
145
|
+
return {
|
|
146
|
+
action: 'get',
|
|
147
|
+
doc: null,
|
|
148
|
+
sections: [],
|
|
149
|
+
count: 0,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
const doc = getDocByPath(db, path, args.branch);
|
|
153
|
+
if (!doc) {
|
|
154
|
+
return {
|
|
155
|
+
action: 'get',
|
|
156
|
+
doc: null,
|
|
157
|
+
sections: [],
|
|
158
|
+
count: 0,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const includeSections = args.include_sections ?? true;
|
|
162
|
+
let sections = [];
|
|
163
|
+
if (includeSections) {
|
|
164
|
+
sections = listDocSections(db, {
|
|
165
|
+
path: doc.path,
|
|
166
|
+
branch: doc.branch,
|
|
167
|
+
kind: args.kind,
|
|
168
|
+
kinds: args.kinds,
|
|
169
|
+
limit: args.limit ?? 200,
|
|
170
|
+
});
|
|
171
|
+
if (args.section_index !== undefined) {
|
|
172
|
+
sections = sections.filter((section) => section.section_index === args.section_index);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
action: 'get',
|
|
177
|
+
doc,
|
|
178
|
+
sections,
|
|
179
|
+
count: includeSections ? sections.length : 1,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
const query = args.query?.trim() ?? '';
|
|
183
|
+
const mode = args.mode ?? 'text';
|
|
184
|
+
const limit = args.limit ?? 20;
|
|
185
|
+
if (!query) {
|
|
186
|
+
return {
|
|
187
|
+
action: 'search',
|
|
188
|
+
results: [],
|
|
189
|
+
count: 0,
|
|
190
|
+
mode_used: mode,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
const textResults = filterSectionIndex(searchDocSections(db, {
|
|
194
|
+
query,
|
|
195
|
+
path: args.path,
|
|
196
|
+
branch: args.branch,
|
|
197
|
+
kind: args.kind,
|
|
198
|
+
kinds: args.kinds,
|
|
199
|
+
limit,
|
|
200
|
+
}), args.section_index);
|
|
201
|
+
if (mode === 'text') {
|
|
202
|
+
return {
|
|
203
|
+
action: 'search',
|
|
204
|
+
results: textResults,
|
|
205
|
+
count: textResults.length,
|
|
206
|
+
mode_used: 'text',
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
if (!embedder) {
|
|
210
|
+
return {
|
|
211
|
+
action: 'search',
|
|
212
|
+
results: textResults,
|
|
213
|
+
count: textResults.length,
|
|
214
|
+
mode_used: 'text (fallback: no query-time embedder)',
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
const semanticResults = await semanticDocSearch(db, args, query, limit, embedder);
|
|
218
|
+
if (!semanticResults) {
|
|
219
|
+
return {
|
|
220
|
+
action: 'search',
|
|
221
|
+
results: textResults,
|
|
222
|
+
count: textResults.length,
|
|
223
|
+
mode_used: 'text (fallback: no embeddings)',
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
const filteredSemantic = filterSectionIndex(semanticResults, args.section_index);
|
|
227
|
+
if (mode === 'semantic') {
|
|
228
|
+
return {
|
|
229
|
+
action: 'search',
|
|
230
|
+
results: filteredSemantic,
|
|
231
|
+
count: filteredSemantic.length,
|
|
232
|
+
mode_used: 'semantic',
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
const fusedResults = fuseDocSections(textResults, filteredSemantic, limit);
|
|
236
|
+
return {
|
|
237
|
+
action: 'search',
|
|
238
|
+
results: fusedResults,
|
|
239
|
+
count: fusedResults.length,
|
|
240
|
+
mode_used: 'fused',
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/lore-server/tools/docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module
|
|
2
|
+
* @module lore-server/tools/graph
|
|
3
3
|
*
|
|
4
4
|
* MCP tool: query the call graph and import graph.
|
|
5
5
|
*
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { Database } from '../db.js';
|
|
10
10
|
export declare const toolDef: {
|
|
11
|
-
readonly name: "
|
|
11
|
+
readonly name: "lore_graph";
|
|
12
12
|
readonly description: string;
|
|
13
13
|
readonly inputSchema: {
|
|
14
14
|
readonly type: "object";
|
|
@@ -30,15 +30,40 @@ export declare const toolDef: {
|
|
|
30
30
|
readonly type: "string";
|
|
31
31
|
readonly description: "Optional branch name to filter edges by source branch.";
|
|
32
32
|
};
|
|
33
|
+
readonly mode: {
|
|
34
|
+
readonly type: "string";
|
|
35
|
+
readonly enum: readonly ["structural", "semantic"];
|
|
36
|
+
readonly description: "Query mode. \"structural\" (default) returns edges only; \"semantic\" also returns related nodes.";
|
|
37
|
+
};
|
|
38
|
+
readonly query_vector: {
|
|
39
|
+
readonly type: "array";
|
|
40
|
+
readonly items: {
|
|
41
|
+
readonly type: "number";
|
|
42
|
+
};
|
|
43
|
+
readonly description: "Embedding vector used by semantic mode to find related nodes.";
|
|
44
|
+
};
|
|
45
|
+
readonly semantic_limit: {
|
|
46
|
+
readonly type: "number";
|
|
47
|
+
readonly description: "Maximum semantic related nodes to evaluate (default min(limit, 20)).";
|
|
48
|
+
};
|
|
49
|
+
readonly semantic_max_distance: {
|
|
50
|
+
readonly type: "number";
|
|
51
|
+
readonly description: "Optional maximum embedding distance threshold for semantic matches.";
|
|
52
|
+
};
|
|
33
53
|
};
|
|
34
54
|
readonly required: readonly ["kind"];
|
|
35
55
|
};
|
|
36
56
|
};
|
|
57
|
+
type GraphKind = 'call' | 'import' | 'module' | 'inheritance';
|
|
37
58
|
export interface GraphArgs {
|
|
38
|
-
kind:
|
|
59
|
+
kind: GraphKind;
|
|
39
60
|
source_id?: number;
|
|
40
61
|
limit?: number;
|
|
41
62
|
branch?: string;
|
|
63
|
+
mode?: 'structural' | 'semantic';
|
|
64
|
+
query_vector?: number[];
|
|
65
|
+
semantic_limit?: number;
|
|
66
|
+
semantic_max_distance?: number;
|
|
42
67
|
}
|
|
43
68
|
export interface GraphEdge {
|
|
44
69
|
source_id: number;
|
|
@@ -50,7 +75,19 @@ export interface GraphEdge {
|
|
|
50
75
|
}
|
|
51
76
|
export interface GraphResult {
|
|
52
77
|
edges: GraphEdge[];
|
|
78
|
+
mode_used: string;
|
|
79
|
+
semantic_nodes?: GraphSemanticNode[];
|
|
80
|
+
}
|
|
81
|
+
export interface GraphSemanticNode {
|
|
82
|
+
node_type: 'symbol' | 'module';
|
|
83
|
+
id: number;
|
|
84
|
+
name: string;
|
|
85
|
+
branch: string;
|
|
86
|
+
score: number;
|
|
87
|
+
kind: string;
|
|
88
|
+
file_path?: string;
|
|
53
89
|
}
|
|
54
90
|
/** Return adjacency-list edges from the call graph or import graph. */
|
|
55
91
|
export declare function handler(db: Database.Database, args: GraphArgs): GraphResult;
|
|
92
|
+
export {};
|
|
56
93
|
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/lore-server/tools/graph.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKzC,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDV,CAAC;AAIX,KAAK,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,aAAa,CAAC;AAE9D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAwMD,uEAAuE;AACvE,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,GAAG,WAAW,CAgF3E"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module
|
|
2
|
+
* @module lore-server/tools/graph
|
|
3
3
|
*
|
|
4
4
|
* MCP tool: query the call graph and import graph.
|
|
5
5
|
*
|
|
6
6
|
* Both queries return adjacency lists so callers can build their own
|
|
7
7
|
* traversals without additional round-trips.
|
|
8
8
|
*/
|
|
9
|
-
import { getCoveragePercentBySymbolIds } from '../db.js';
|
|
9
|
+
import { getCoveragePercentBySymbolIds, semanticSearchSymbols } from '../db.js';
|
|
10
10
|
// ─── Tool definition ──────────────────────────────────────────────────────────
|
|
11
11
|
export const toolDef = {
|
|
12
|
-
name: '
|
|
12
|
+
name: 'lore_graph',
|
|
13
13
|
description: 'Query call, import, module, or inheritance graph edges stored in the knowledge-base index. ' +
|
|
14
14
|
'Set `kind` to "call", "import", "module", or "inheritance". ' +
|
|
15
|
-
'Optionally
|
|
15
|
+
'Optionally set mode="semantic" with query_vector to retrieve semantically related symbol/module nodes alongside edges.',
|
|
16
16
|
inputSchema: {
|
|
17
17
|
type: 'object',
|
|
18
18
|
properties: {
|
|
@@ -34,13 +34,35 @@ export const toolDef = {
|
|
|
34
34
|
type: 'string',
|
|
35
35
|
description: 'Optional branch name to filter edges by source branch.',
|
|
36
36
|
},
|
|
37
|
+
mode: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
enum: ['structural', 'semantic'],
|
|
40
|
+
description: 'Query mode. "structural" (default) returns edges only; "semantic" also returns related nodes.',
|
|
41
|
+
},
|
|
42
|
+
query_vector: {
|
|
43
|
+
type: 'array',
|
|
44
|
+
items: { type: 'number' },
|
|
45
|
+
description: 'Embedding vector used by semantic mode to find related nodes.',
|
|
46
|
+
},
|
|
47
|
+
semantic_limit: {
|
|
48
|
+
type: 'number',
|
|
49
|
+
description: 'Maximum semantic related nodes to evaluate (default min(limit, 20)).',
|
|
50
|
+
},
|
|
51
|
+
semantic_max_distance: {
|
|
52
|
+
type: 'number',
|
|
53
|
+
description: 'Optional maximum embedding distance threshold for semantic matches.',
|
|
54
|
+
},
|
|
37
55
|
},
|
|
38
56
|
required: ['kind'],
|
|
39
57
|
},
|
|
40
58
|
};
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
59
|
+
function hasVirtualTable(db, name) {
|
|
60
|
+
const row = db
|
|
61
|
+
.prepare("SELECT 1 AS present FROM sqlite_master WHERE type IN ('table', 'virtual table') AND name = ? LIMIT 1")
|
|
62
|
+
.get(name);
|
|
63
|
+
return row?.present === 1;
|
|
64
|
+
}
|
|
65
|
+
function getStructuralEdges(db, args, limit) {
|
|
44
66
|
if (args.kind === 'call') {
|
|
45
67
|
// Symbol-level: symbol_refs rows
|
|
46
68
|
const hasFilter = args.source_id !== undefined;
|
|
@@ -76,7 +98,7 @@ export function handler(db, args) {
|
|
|
76
98
|
...edge,
|
|
77
99
|
callee_coverage_percent: edge.target_id !== null ? (coverageBySymbolId.get(edge.target_id) ?? null) : null,
|
|
78
100
|
}));
|
|
79
|
-
return
|
|
101
|
+
return edgesWithCoverage;
|
|
80
102
|
}
|
|
81
103
|
else if (args.kind === 'import') {
|
|
82
104
|
// File-level: file_imports rows
|
|
@@ -107,7 +129,7 @@ export function handler(db, args) {
|
|
|
107
129
|
? (args.branch !== undefined ? [args.source_id, args.branch, limit] : [args.source_id, limit])
|
|
108
130
|
: (args.branch !== undefined ? [args.branch, limit] : [limit]);
|
|
109
131
|
const edges = db.prepare(sql).all(...edgeParams);
|
|
110
|
-
return
|
|
132
|
+
return edges;
|
|
111
133
|
}
|
|
112
134
|
else if (args.kind === 'module') {
|
|
113
135
|
// Module-level: inferred from file_imports + file_modules
|
|
@@ -148,7 +170,7 @@ export function handler(db, args) {
|
|
|
148
170
|
? (args.branch !== undefined ? [args.source_id, args.branch, limit] : [args.source_id, limit])
|
|
149
171
|
: (args.branch !== undefined ? [args.branch, limit] : [limit]);
|
|
150
172
|
const edges = db.prepare(sql).all(...edgeParams);
|
|
151
|
-
return
|
|
173
|
+
return edges;
|
|
152
174
|
}
|
|
153
175
|
else {
|
|
154
176
|
// Symbol-level inheritance edges (e.g., class extends)
|
|
@@ -182,7 +204,96 @@ export function handler(db, args) {
|
|
|
182
204
|
? (args.branch !== undefined ? [args.source_id, args.branch, limit] : [args.source_id, limit])
|
|
183
205
|
: (args.branch !== undefined ? [args.branch, limit] : [limit]);
|
|
184
206
|
const edges = db.prepare(sql).all(...edgeParams);
|
|
185
|
-
return
|
|
207
|
+
return edges;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function getSemanticModuleMappings(db, symbolIds) {
|
|
211
|
+
if (symbolIds.length === 0) {
|
|
212
|
+
return [];
|
|
213
|
+
}
|
|
214
|
+
const placeholders = symbolIds.map(() => '?').join(', ');
|
|
215
|
+
return db.prepare(`SELECT s.id AS symbol_id,
|
|
216
|
+
m.id AS module_id,
|
|
217
|
+
m.name AS module_name,
|
|
218
|
+
m.kind AS module_kind,
|
|
219
|
+
f.branch AS source_branch
|
|
220
|
+
FROM symbols s
|
|
221
|
+
JOIN files f ON f.id = s.file_id
|
|
222
|
+
JOIN file_modules fm ON fm.file_id = f.id
|
|
223
|
+
JOIN modules m ON m.id = fm.module_id
|
|
224
|
+
WHERE s.id IN (${placeholders})`).all(...symbolIds);
|
|
225
|
+
}
|
|
226
|
+
/** Return adjacency-list edges from the call graph or import graph. */
|
|
227
|
+
export function handler(db, args) {
|
|
228
|
+
const limit = args.limit ?? 200;
|
|
229
|
+
const edges = getStructuralEdges(db, args, limit);
|
|
230
|
+
const mode = args.mode ?? 'structural';
|
|
231
|
+
if (mode !== 'semantic') {
|
|
232
|
+
return { edges, mode_used: 'structural' };
|
|
233
|
+
}
|
|
234
|
+
const queryVector = args.query_vector;
|
|
235
|
+
if (!queryVector || queryVector.length === 0) {
|
|
236
|
+
return {
|
|
237
|
+
edges,
|
|
238
|
+
semantic_nodes: [],
|
|
239
|
+
mode_used: 'structural (fallback: missing query_vector)',
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
if (!hasVirtualTable(db, 'symbol_embeddings')) {
|
|
243
|
+
return {
|
|
244
|
+
edges,
|
|
245
|
+
semantic_nodes: [],
|
|
246
|
+
mode_used: 'structural (fallback: no embeddings)',
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
const semanticLimit = Math.max(1, Math.floor(args.semantic_limit ?? Math.min(limit, 20)));
|
|
250
|
+
const maxDistance = args.semantic_max_distance;
|
|
251
|
+
const symbolRows = semanticSearchSymbols(db, {
|
|
252
|
+
queryVector,
|
|
253
|
+
branch: args.branch,
|
|
254
|
+
limit: semanticLimit,
|
|
255
|
+
});
|
|
256
|
+
const filteredSymbols = maxDistance === undefined
|
|
257
|
+
? symbolRows
|
|
258
|
+
: symbolRows.filter((row) => row.score <= maxDistance);
|
|
259
|
+
const symbolNodes = filteredSymbols.map((row) => ({
|
|
260
|
+
node_type: 'symbol',
|
|
261
|
+
id: row.id,
|
|
262
|
+
name: row.name,
|
|
263
|
+
branch: row.file_branch,
|
|
264
|
+
score: row.score,
|
|
265
|
+
kind: row.kind,
|
|
266
|
+
file_path: row.file_path,
|
|
267
|
+
}));
|
|
268
|
+
const scoreBySymbolId = new Map(filteredSymbols.map((row) => [row.id, row.score]));
|
|
269
|
+
const moduleNodesByKey = new Map();
|
|
270
|
+
const moduleMappings = getSemanticModuleMappings(db, Array.from(scoreBySymbolId.keys()));
|
|
271
|
+
for (const mapping of moduleMappings) {
|
|
272
|
+
const symbolScore = scoreBySymbolId.get(mapping.symbol_id);
|
|
273
|
+
if (symbolScore === undefined) {
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
const moduleKey = `${mapping.module_id}:${mapping.source_branch}`;
|
|
277
|
+
const existing = moduleNodesByKey.get(moduleKey);
|
|
278
|
+
if (!existing || symbolScore < existing.score) {
|
|
279
|
+
moduleNodesByKey.set(moduleKey, {
|
|
280
|
+
node_type: 'module',
|
|
281
|
+
id: mapping.module_id,
|
|
282
|
+
name: mapping.module_name,
|
|
283
|
+
branch: mapping.source_branch,
|
|
284
|
+
score: symbolScore,
|
|
285
|
+
kind: mapping.module_kind,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
186
288
|
}
|
|
289
|
+
const moduleNodes = Array.from(moduleNodesByKey.values()).sort((a, b) => a.score - b.score
|
|
290
|
+
|| a.branch.localeCompare(b.branch)
|
|
291
|
+
|| a.name.localeCompare(b.name)
|
|
292
|
+
|| a.id - b.id);
|
|
293
|
+
return {
|
|
294
|
+
edges,
|
|
295
|
+
semantic_nodes: [...symbolNodes, ...moduleNodes],
|
|
296
|
+
mode_used: 'semantic',
|
|
297
|
+
};
|
|
187
298
|
}
|
|
188
299
|
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/lore-server/tools/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module
|
|
2
|
+
* @module lore-server/tools/history
|
|
3
3
|
*
|
|
4
4
|
* MCP tool: query commit history by file, commit SHA, author, or recency.
|
|
5
5
|
*/
|
|
6
6
|
import type { Database } from '../db.js';
|
|
7
7
|
import { type CommitRow, type CommitFileRow, type CommitRefRow } from '../db.js';
|
|
8
|
+
import type { EmbeddingProvider } from '../../indexer/embedder.js';
|
|
8
9
|
export declare const toolDef: {
|
|
9
|
-
readonly name: "
|
|
10
|
+
readonly name: "lore_history";
|
|
10
11
|
readonly description: string;
|
|
11
12
|
readonly inputSchema: {
|
|
12
13
|
readonly type: "object";
|
|
13
14
|
readonly properties: {
|
|
14
15
|
readonly mode: {
|
|
15
16
|
readonly type: "string";
|
|
16
|
-
readonly enum: readonly ["file", "commit", "author", "ref", "recent"];
|
|
17
|
+
readonly enum: readonly ["file", "commit", "author", "ref", "semantic", "recent"];
|
|
17
18
|
readonly description: "Query mode.";
|
|
18
19
|
};
|
|
19
20
|
readonly query: {
|
|
@@ -29,7 +30,7 @@ export declare const toolDef: {
|
|
|
29
30
|
};
|
|
30
31
|
};
|
|
31
32
|
export interface HistoryArgs {
|
|
32
|
-
mode: 'file' | 'commit' | 'author' | 'ref' | 'recent';
|
|
33
|
+
mode: 'file' | 'commit' | 'author' | 'ref' | 'semantic' | 'recent';
|
|
33
34
|
query?: string;
|
|
34
35
|
limit?: number;
|
|
35
36
|
}
|
|
@@ -37,11 +38,17 @@ export interface CommitWithFiles extends CommitRow {
|
|
|
37
38
|
files?: CommitFileRow[];
|
|
38
39
|
refs?: CommitRefRow[];
|
|
39
40
|
}
|
|
41
|
+
export interface CommitEnrichmentOptions {
|
|
42
|
+
includeFiles?: boolean;
|
|
43
|
+
includeRefs?: boolean;
|
|
44
|
+
}
|
|
40
45
|
export interface HistoryResult {
|
|
41
46
|
mode: string;
|
|
42
47
|
results: CommitWithFiles[];
|
|
43
48
|
count: number;
|
|
44
49
|
}
|
|
45
|
-
/**
|
|
46
|
-
export declare function
|
|
50
|
+
/** Enrich commit rows with touched files and refs metadata. */
|
|
51
|
+
export declare function enrichCommitsWithContext(db: Database.Database, commits: CommitRow[], options?: CommitEnrichmentOptions): CommitWithFiles[];
|
|
52
|
+
/** Handle a lore_history tool invocation against the open read-only database. */
|
|
53
|
+
export declare function handler(db: Database.Database, args: HistoryArgs, embedder?: EmbeddingProvider): Promise<HistoryResult>;
|
|
47
54
|
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/lore-server/tools/history.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAUL,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAInE,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;CAoCV,CAAC;AAIX,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf;AAUD,+DAA+D;AAC/D,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,SAAS,EAAE,EACpB,OAAO,GAAE,uBAA4B,GACpC,eAAe,EAAE,CASnB;AAED,iFAAiF;AACjF,wBAAsB,OAAO,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,WAAW,EACjB,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAmExB"}
|