@abhishekmcp/notes 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -40
- package/dist/config.d.ts +41 -0
- package/dist/config.js +67 -0
- package/dist/config.js.map +1 -0
- package/dist/embed.d.ts +9 -0
- package/dist/embed.js +134 -0
- package/dist/embed.js.map +1 -0
- package/dist/fsutil.d.ts +23 -0
- package/dist/fsutil.js +113 -0
- package/dist/fsutil.js.map +1 -0
- package/dist/graph.d.ts +38 -0
- package/dist/graph.js +160 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.js +240 -100
- package/dist/index.js.map +1 -1
- package/dist/parse.d.ts +55 -0
- package/dist/parse.js +202 -0
- package/dist/parse.js.map +1 -0
- package/dist/semantic.d.ts +14 -0
- package/dist/semantic.js +142 -0
- package/dist/semantic.js.map +1 -0
- package/dist/store.d.ts +102 -0
- package/dist/store.js +410 -0
- package/dist/store.js.map +1 -0
- package/dist/tokenizer.d.ts +30 -0
- package/dist/tokenizer.js +140 -0
- package/dist/tokenizer.js.map +1 -0
- package/package.json +4 -2
- package/dist/notes.d.ts +0 -36
- package/dist/notes.js +0 -138
- package/dist/notes.js.map +0 -1
package/dist/graph.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge-graph queries over the wiki-link + tag structure captured in the
|
|
3
|
+
* store's per-note metadata. Everything here is read-only and returns compact
|
|
4
|
+
* node references (name + title), never full note bodies, to stay token-cheap.
|
|
5
|
+
*/
|
|
6
|
+
import { normalizeLinkTarget } from "./parse.js";
|
|
7
|
+
import { getAllMeta, getMeta, noteExists } from "./store.js";
|
|
8
|
+
const ref = (name, meta) => ({ name, title: meta?.title ?? name });
|
|
9
|
+
/** out: name -> existing targets it links to; in: name -> notes linking to it. */
|
|
10
|
+
function adjacency() {
|
|
11
|
+
const out = new Map();
|
|
12
|
+
const inc = new Map();
|
|
13
|
+
const meta = getAllMeta();
|
|
14
|
+
for (const name of meta.keys()) {
|
|
15
|
+
out.set(name, new Set());
|
|
16
|
+
inc.set(name, new Set());
|
|
17
|
+
}
|
|
18
|
+
for (const [name, m] of meta) {
|
|
19
|
+
for (const link of m.outLinks) {
|
|
20
|
+
const target = normalizeLinkTarget(link);
|
|
21
|
+
if (!meta.has(target) || target === name)
|
|
22
|
+
continue; // skip broken + self
|
|
23
|
+
out.get(name).add(target);
|
|
24
|
+
inc.get(target).add(name);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return { out, inc };
|
|
28
|
+
}
|
|
29
|
+
/** Notes that link to `name` via [[wiki-link]]. */
|
|
30
|
+
export function getBacklinks(name) {
|
|
31
|
+
const target = normalizeLinkTarget(name);
|
|
32
|
+
const out = [];
|
|
33
|
+
for (const [n, m] of getAllMeta()) {
|
|
34
|
+
if (n === target)
|
|
35
|
+
continue;
|
|
36
|
+
if (m.outLinks.some((l) => normalizeLinkTarget(l) === target))
|
|
37
|
+
out.push(ref(n, m));
|
|
38
|
+
}
|
|
39
|
+
return out.sort((a, b) => a.name.localeCompare(b.name));
|
|
40
|
+
}
|
|
41
|
+
/** BFS over the undirected link graph up to `depth`, capped at `limit` nodes. */
|
|
42
|
+
export function getNeighbors(name, depth = 1, limit = 50) {
|
|
43
|
+
const start = normalizeLinkTarget(name);
|
|
44
|
+
if (!noteExists(start))
|
|
45
|
+
return [];
|
|
46
|
+
const { out, inc } = adjacency();
|
|
47
|
+
const seen = new Set([start]);
|
|
48
|
+
const result = [];
|
|
49
|
+
let frontier = [start];
|
|
50
|
+
for (let d = 1; d <= depth && frontier.length; d++) {
|
|
51
|
+
const next = [];
|
|
52
|
+
for (const node of frontier) {
|
|
53
|
+
const around = new Set([...(out.get(node) ?? []), ...(inc.get(node) ?? [])]);
|
|
54
|
+
for (const nb of around) {
|
|
55
|
+
if (seen.has(nb))
|
|
56
|
+
continue;
|
|
57
|
+
seen.add(nb);
|
|
58
|
+
result.push({ ...ref(nb, getMeta(nb)), distance: d });
|
|
59
|
+
next.push(nb);
|
|
60
|
+
if (result.length >= limit)
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
frontier = next;
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
/** Shortest wiki-link chain between two notes (BFS, undirected). Null if none. */
|
|
69
|
+
export function findPath(a, b) {
|
|
70
|
+
const from = normalizeLinkTarget(a);
|
|
71
|
+
const to = normalizeLinkTarget(b);
|
|
72
|
+
if (!noteExists(from) || !noteExists(to))
|
|
73
|
+
return null;
|
|
74
|
+
if (from === to)
|
|
75
|
+
return [ref(from, getMeta(from))];
|
|
76
|
+
const { out, inc } = adjacency();
|
|
77
|
+
const prev = new Map();
|
|
78
|
+
const seen = new Set([from]);
|
|
79
|
+
const queue = [from];
|
|
80
|
+
while (queue.length) {
|
|
81
|
+
const node = queue.shift();
|
|
82
|
+
const around = new Set([...(out.get(node) ?? []), ...(inc.get(node) ?? [])]);
|
|
83
|
+
for (const nb of around) {
|
|
84
|
+
if (seen.has(nb))
|
|
85
|
+
continue;
|
|
86
|
+
seen.add(nb);
|
|
87
|
+
prev.set(nb, node);
|
|
88
|
+
if (nb === to) {
|
|
89
|
+
const chain = [to];
|
|
90
|
+
let cur = to;
|
|
91
|
+
while (cur !== from) {
|
|
92
|
+
cur = prev.get(cur);
|
|
93
|
+
chain.unshift(cur);
|
|
94
|
+
}
|
|
95
|
+
return chain.map((n) => ref(n, getMeta(n)));
|
|
96
|
+
}
|
|
97
|
+
queue.push(nb);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
/** Rank other notes by shared out-links + shared tags with `name`. */
|
|
103
|
+
export function relatedNotes(name, limit = 10) {
|
|
104
|
+
const target = normalizeLinkTarget(name);
|
|
105
|
+
const self = getMeta(target);
|
|
106
|
+
if (!self)
|
|
107
|
+
return [];
|
|
108
|
+
const myLinks = new Set(self.outLinks.map(normalizeLinkTarget));
|
|
109
|
+
const myTags = new Set(self.tags.map((t) => t.toLowerCase()));
|
|
110
|
+
const scored = [];
|
|
111
|
+
for (const [n, m] of getAllMeta()) {
|
|
112
|
+
if (n === target)
|
|
113
|
+
continue;
|
|
114
|
+
const sharedLinks = m.outLinks.filter((l) => myLinks.has(normalizeLinkTarget(l))).length;
|
|
115
|
+
const sharedTags = m.tags.filter((t) => myTags.has(t.toLowerCase())).length;
|
|
116
|
+
const score = sharedLinks + sharedTags;
|
|
117
|
+
if (score > 0)
|
|
118
|
+
scored.push({ ...ref(n, m), score, sharedLinks, sharedTags });
|
|
119
|
+
}
|
|
120
|
+
return scored.sort((a, b) => b.score - a.score || a.name.localeCompare(b.name)).slice(0, limit);
|
|
121
|
+
}
|
|
122
|
+
/** Aggregate graph health: counts, top hubs, orphans. */
|
|
123
|
+
export function graphOverview(hubLimit = 10, orphanLimit = 25) {
|
|
124
|
+
const { out, inc } = adjacency();
|
|
125
|
+
const meta = getAllMeta();
|
|
126
|
+
let links = 0;
|
|
127
|
+
const tags = new Set();
|
|
128
|
+
const hubs = [];
|
|
129
|
+
const orphans = [];
|
|
130
|
+
for (const [name, m] of meta) {
|
|
131
|
+
for (const t of m.tags)
|
|
132
|
+
tags.add(t.toLowerCase());
|
|
133
|
+
const degree = (out.get(name)?.size ?? 0) + (inc.get(name)?.size ?? 0);
|
|
134
|
+
links += out.get(name)?.size ?? 0;
|
|
135
|
+
if (degree === 0)
|
|
136
|
+
orphans.push(ref(name, m));
|
|
137
|
+
hubs.push({ ...ref(name, m), degree });
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
notes: meta.size,
|
|
141
|
+
links,
|
|
142
|
+
tags: tags.size,
|
|
143
|
+
brokenLinks: brokenLinks().length,
|
|
144
|
+
orphans: orphans.slice(0, orphanLimit),
|
|
145
|
+
hubs: hubs.filter((h) => h.degree > 0).sort((a, b) => b.degree - a.degree).slice(0, hubLimit),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/** Wiki-links that point at notes which don't exist. */
|
|
149
|
+
export function brokenLinks() {
|
|
150
|
+
const out = [];
|
|
151
|
+
for (const [name, m] of getAllMeta()) {
|
|
152
|
+
for (const link of m.outLinks) {
|
|
153
|
+
const target = normalizeLinkTarget(link);
|
|
154
|
+
if (target && !noteExists(target))
|
|
155
|
+
out.push({ from: name, target });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return out.sort((a, b) => a.from.localeCompare(b.from) || a.target.localeCompare(b.target));
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,144 +1,284 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @abhishekmcp/notes — MCP server for local markdown notes.
|
|
4
|
+
* v0.2: ranked full-text search (MiniSearch), tags + todos, a wiki-link
|
|
5
|
+
* knowledge graph, a persisted index with incremental sync, and FS hardening.
|
|
6
|
+
* Tool registration only — all logic lives in store.ts / graph.ts.
|
|
7
|
+
*/
|
|
2
8
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
9
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
10
|
import { z } from "zod";
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
});
|
|
14
|
-
// --- Tools ---------------------------------------------------------------
|
|
11
|
+
import { isReadOnly } from "./config.js";
|
|
12
|
+
import { appendNote, buildIndex, createNote, deleteNote, getOutline, listNotes, listTags, listTodos, moveNote, notesDir, readNote, searchNotes, } from "./store.js";
|
|
13
|
+
import { brokenLinks, findPath, getBacklinks, getNeighbors, graphOverview, relatedNotes, } from "./graph.js";
|
|
14
|
+
import { semanticSearch } from "./semantic.js";
|
|
15
|
+
const server = new McpServer({ name: "mcp-notes-server", version: "0.3.0" });
|
|
16
|
+
const text = (value) => ({ content: [{ type: "text", text: value }] });
|
|
17
|
+
const fail = (err) => text(`Error: ${err.message}`);
|
|
18
|
+
// --- Read & discovery tools (always registered) --------------------------
|
|
15
19
|
server.registerTool("list_notes", {
|
|
16
20
|
title: "List notes",
|
|
17
|
-
description: "List
|
|
18
|
-
"Returns
|
|
19
|
-
inputSchema: {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
description: "List notes (newest first) with pagination and an optional tag filter. " +
|
|
22
|
+
"Returns name, title, size, tags, and whether more results remain.",
|
|
23
|
+
inputSchema: {
|
|
24
|
+
offset: z.number().int().min(0).optional().describe("Start index (default 0)"),
|
|
25
|
+
limit: z.number().int().positive().max(500).optional().describe("Max results (default 50)"),
|
|
26
|
+
tag: z.string().optional().describe("Only notes carrying this tag"),
|
|
27
|
+
},
|
|
28
|
+
}, async ({ offset, limit, tag }) => {
|
|
29
|
+
const r = listNotes(offset ?? 0, limit ?? 50, tag);
|
|
30
|
+
if (r.items.length === 0)
|
|
31
|
+
return text(tag ? `No notes tagged "${tag}".` : "No notes found.");
|
|
32
|
+
const lines = r.items.map((n) => `- ${n.name} — ${n.title}${n.tags.length ? ` [${n.tags.join(", ")}]` : ""}`);
|
|
33
|
+
return text(`${r.total} note(s)${r.hasMore ? " (more available)" : ""}:\n${lines.join("\n")}`);
|
|
26
34
|
});
|
|
27
35
|
server.registerTool("read_note", {
|
|
28
36
|
title: "Read a note",
|
|
29
|
-
description: "Read
|
|
37
|
+
description: "Read a note by name. Optionally read just one heading's `section`, or a " +
|
|
38
|
+
"character window via `offset`/`limit` (sets a truncated flag when cut).",
|
|
30
39
|
inputSchema: {
|
|
31
40
|
name: z.string().describe("Note name, e.g. 'ideas' or 'projects/mcp'"),
|
|
41
|
+
section: z.string().optional().describe("Read only the content under this heading"),
|
|
42
|
+
offset: z.number().int().min(0).optional().describe("Character offset to start from"),
|
|
43
|
+
limit: z.number().int().positive().optional().describe("Max characters to return"),
|
|
32
44
|
},
|
|
33
|
-
}, async ({ name }) => {
|
|
45
|
+
}, async ({ name, section, offset, limit }) => {
|
|
34
46
|
try {
|
|
35
|
-
|
|
47
|
+
const r = await readNote(name, { section, offset, limit });
|
|
48
|
+
return text(r.truncated ? `${r.text}\n\n[truncated]` : r.text);
|
|
36
49
|
}
|
|
37
|
-
catch {
|
|
38
|
-
return
|
|
50
|
+
catch (err) {
|
|
51
|
+
return fail(err);
|
|
39
52
|
}
|
|
40
53
|
});
|
|
41
|
-
server.registerTool("
|
|
42
|
-
title: "
|
|
43
|
-
description: "
|
|
44
|
-
inputSchema: {
|
|
45
|
-
|
|
46
|
-
content: z.string().describe("Markdown content of the note"),
|
|
47
|
-
overwrite: z
|
|
48
|
-
.boolean()
|
|
49
|
-
.optional()
|
|
50
|
-
.describe("Overwrite an existing note (default false)"),
|
|
51
|
-
},
|
|
52
|
-
}, async ({ name, content, overwrite }) => {
|
|
54
|
+
server.registerTool("get_outline", {
|
|
55
|
+
title: "Get note outline",
|
|
56
|
+
description: "Return just the heading tree of a note — grasp a big note in a few tokens.",
|
|
57
|
+
inputSchema: { name: z.string().describe("Note name") },
|
|
58
|
+
}, async ({ name }) => {
|
|
53
59
|
try {
|
|
54
|
-
|
|
55
|
-
return text(`Created note at ${file}`);
|
|
60
|
+
return text(await getOutline(name));
|
|
56
61
|
}
|
|
57
62
|
catch (err) {
|
|
58
|
-
return
|
|
63
|
+
return fail(err);
|
|
59
64
|
}
|
|
60
65
|
});
|
|
61
|
-
server.registerTool("
|
|
62
|
-
title: "
|
|
63
|
-
description: "
|
|
64
|
-
"
|
|
66
|
+
server.registerTool("search_notes", {
|
|
67
|
+
title: "Search notes",
|
|
68
|
+
description: "Ranked full-text search. Supports `fuzzy`, `prefix`, and a `field` filter " +
|
|
69
|
+
"(title/tag/body, or 'path' to match the note name). Returns ranked snippets.",
|
|
65
70
|
inputSchema: {
|
|
66
|
-
|
|
67
|
-
|
|
71
|
+
query: z.string().describe("Search query"),
|
|
72
|
+
fuzzy: z.boolean().optional().describe("Enable fuzzy matching (typo-tolerant)"),
|
|
73
|
+
prefix: z.boolean().optional().describe("Match term prefixes (default true)"),
|
|
74
|
+
field: z.enum(["title", "tag", "body", "path"]).optional().describe("Restrict search to one field"),
|
|
75
|
+
offset: z.number().int().min(0).optional().describe("Start index (default 0)"),
|
|
76
|
+
limit: z.number().int().positive().max(100).optional().describe("Max results (default 10)"),
|
|
68
77
|
},
|
|
69
|
-
}, async ({
|
|
70
|
-
const
|
|
71
|
-
|
|
78
|
+
}, async ({ query, fuzzy, prefix, field, offset, limit }) => {
|
|
79
|
+
const r = await searchNotes(query, { fuzzy, prefix, field, offset, limit });
|
|
80
|
+
if (r.hits.length === 0)
|
|
81
|
+
return text(`No matches for "${query}".`);
|
|
82
|
+
const lines = r.hits.map((h) => `- ${h.name} (score ${h.score.toFixed(2)})${h.snippet ? `\n ${h.snippet}` : ""}`);
|
|
83
|
+
return text(`${r.total} match(es)${r.hasMore ? " (more available)" : ""}:\n${lines.join("\n")}`);
|
|
84
|
+
});
|
|
85
|
+
server.registerTool("list_tags", {
|
|
86
|
+
title: "List tags",
|
|
87
|
+
description: "List every tag across the vault with note counts.",
|
|
88
|
+
inputSchema: {},
|
|
89
|
+
}, async () => {
|
|
90
|
+
const tags = listTags();
|
|
91
|
+
if (tags.length === 0)
|
|
92
|
+
return text("No tags found.");
|
|
93
|
+
return text(tags.map((t) => `- ${t.tag} (${t.count})`).join("\n"));
|
|
72
94
|
});
|
|
73
|
-
server.registerTool("
|
|
74
|
-
title: "
|
|
75
|
-
description: "
|
|
95
|
+
server.registerTool("list_todos", {
|
|
96
|
+
title: "List todos",
|
|
97
|
+
description: "Aggregate `- [ ]` checkbox todos across all notes. Open items only unless includeDone.",
|
|
76
98
|
inputSchema: {
|
|
77
|
-
|
|
99
|
+
includeDone: z.boolean().optional().describe("Include completed `- [x]` items (default false)"),
|
|
78
100
|
},
|
|
79
|
-
|
|
101
|
+
}, async ({ includeDone }) => {
|
|
102
|
+
const todos = await listTodos(includeDone ?? false);
|
|
103
|
+
if (todos.length === 0)
|
|
104
|
+
return text("No todos found.");
|
|
105
|
+
const lines = todos.map((t) => `- [${t.done ? "x" : " "}] ${t.text} (${t.note}:${t.line})`);
|
|
106
|
+
return text(`${todos.length} todo(s):\n${lines.join("\n")}`);
|
|
107
|
+
});
|
|
108
|
+
server.registerTool("get_backlinks", {
|
|
109
|
+
title: "Get backlinks",
|
|
110
|
+
description: "Find all notes that link to the given note via [[wiki-link]] syntax.",
|
|
111
|
+
inputSchema: { name: z.string().describe("The note to find backlinks for") },
|
|
80
112
|
}, async ({ name }) => {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return text(`
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
return text(`Could not delete note "${name}". Does it exist?`);
|
|
87
|
-
}
|
|
113
|
+
const links = getBacklinks(name);
|
|
114
|
+
if (links.length === 0)
|
|
115
|
+
return text(`No notes link to "${name}".`);
|
|
116
|
+
return text(`${links.length} backlink(s):\n${links.map((l) => `- ${l.name} — ${l.title}`).join("\n")}`);
|
|
88
117
|
});
|
|
89
|
-
server.registerTool("
|
|
90
|
-
title: "
|
|
91
|
-
description: "
|
|
92
|
-
"Returns matching lines with their note name and line number.",
|
|
118
|
+
server.registerTool("get_neighbors", {
|
|
119
|
+
title: "Get neighbors",
|
|
120
|
+
description: "Notes within N hops of a note over the (undirected) wiki-link graph, depth/limit capped.",
|
|
93
121
|
inputSchema: {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
.int()
|
|
98
|
-
.positive()
|
|
99
|
-
.optional()
|
|
100
|
-
.describe("Max number of matches (default 50)"),
|
|
122
|
+
name: z.string().describe("Center note"),
|
|
123
|
+
depth: z.number().int().positive().max(5).optional().describe("Hops to traverse (default 1)"),
|
|
124
|
+
limit: z.number().int().positive().max(200).optional().describe("Max neighbors (default 50)"),
|
|
101
125
|
},
|
|
102
|
-
}, async ({
|
|
103
|
-
const
|
|
104
|
-
if (
|
|
105
|
-
return text(`
|
|
106
|
-
|
|
107
|
-
return text(`${hits.length} match(es):\n${lines.join("\n")}`);
|
|
126
|
+
}, async ({ name, depth, limit }) => {
|
|
127
|
+
const nb = getNeighbors(name, depth ?? 1, limit ?? 50);
|
|
128
|
+
if (nb.length === 0)
|
|
129
|
+
return text(`"${name}" has no neighbors (or doesn't exist).`);
|
|
130
|
+
return text(nb.map((n) => `- [${n.distance}] ${n.name} — ${n.title}`).join("\n"));
|
|
108
131
|
});
|
|
109
|
-
server.registerTool("
|
|
110
|
-
title: "
|
|
111
|
-
description: "
|
|
132
|
+
server.registerTool("find_path", {
|
|
133
|
+
title: "Find path",
|
|
134
|
+
description: "Shortest wiki-link chain between two notes (BFS). Reports if none exists.",
|
|
112
135
|
inputSchema: {
|
|
113
|
-
|
|
136
|
+
from: z.string().describe("Start note"),
|
|
137
|
+
to: z.string().describe("End note"),
|
|
114
138
|
},
|
|
115
|
-
}, async ({
|
|
116
|
-
const
|
|
117
|
-
if (
|
|
118
|
-
return text(`No
|
|
119
|
-
|
|
120
|
-
|
|
139
|
+
}, async ({ from, to }) => {
|
|
140
|
+
const path = findPath(from, to);
|
|
141
|
+
if (!path)
|
|
142
|
+
return text(`No path between "${from}" and "${to}".`);
|
|
143
|
+
return text(path.map((n) => n.name).join(" → "));
|
|
144
|
+
});
|
|
145
|
+
server.registerTool("related_notes", {
|
|
146
|
+
title: "Related notes",
|
|
147
|
+
description: "Rank other notes by shared wiki-links and shared tags with the given note.",
|
|
148
|
+
inputSchema: {
|
|
149
|
+
name: z.string().describe("Note to find relations for"),
|
|
150
|
+
limit: z.number().int().positive().max(50).optional().describe("Max results (default 10)"),
|
|
151
|
+
},
|
|
152
|
+
}, async ({ name, limit }) => {
|
|
153
|
+
const rel = relatedNotes(name, limit ?? 10);
|
|
154
|
+
if (rel.length === 0)
|
|
155
|
+
return text(`No related notes for "${name}".`);
|
|
156
|
+
return text(rel
|
|
157
|
+
.map((r) => `- ${r.name} — ${r.title} (score ${r.score}: ${r.sharedLinks} links, ${r.sharedTags} tags)`)
|
|
158
|
+
.join("\n"));
|
|
159
|
+
});
|
|
160
|
+
server.registerTool("graph_overview", {
|
|
161
|
+
title: "Graph overview",
|
|
162
|
+
description: "Aggregate graph health: note/link/tag counts, top hubs, orphans, broken-link count.",
|
|
163
|
+
inputSchema: {},
|
|
164
|
+
}, async () => {
|
|
165
|
+
const g = graphOverview();
|
|
166
|
+
const hubs = g.hubs.map((h) => `${h.name} (${h.degree})`).join(", ") || "none";
|
|
167
|
+
const orphans = g.orphans.map((o) => o.name).join(", ") || "none";
|
|
168
|
+
return text(`Notes: ${g.notes}\nLinks: ${g.links}\nTags: ${g.tags}\nBroken links: ${g.brokenLinks}\n` +
|
|
169
|
+
`Hubs: ${hubs}\nOrphans: ${orphans}`);
|
|
170
|
+
});
|
|
171
|
+
server.registerTool("broken_links", {
|
|
172
|
+
title: "Broken links",
|
|
173
|
+
description: "List wiki-links that point at notes which don't exist.",
|
|
174
|
+
inputSchema: {},
|
|
175
|
+
}, async () => {
|
|
176
|
+
const broken = brokenLinks();
|
|
177
|
+
if (broken.length === 0)
|
|
178
|
+
return text("No broken links. 🎉");
|
|
179
|
+
return text(`${broken.length} broken link(s):\n${broken.map((b) => `- ${b.from} → [[${b.target}]]`).join("\n")}`);
|
|
180
|
+
});
|
|
181
|
+
server.registerTool("semantic_search", {
|
|
182
|
+
title: "Semantic search",
|
|
183
|
+
description: "Search notes by meaning using local embeddings (all-MiniLM-L6-v2, runs " +
|
|
184
|
+
"offline after a one-time model download). Finds related notes even with no " +
|
|
185
|
+
"shared keywords. `hybrid` fuses this with keyword search for best results.",
|
|
186
|
+
inputSchema: {
|
|
187
|
+
query: z.string().describe("Natural-language query"),
|
|
188
|
+
limit: z.number().int().positive().max(100).optional().describe("Max results (default 10)"),
|
|
189
|
+
hybrid: z.boolean().optional().describe("Fuse semantic + keyword ranking (default false)"),
|
|
190
|
+
},
|
|
191
|
+
}, async ({ query, limit, hybrid }) => {
|
|
192
|
+
try {
|
|
193
|
+
const r = await semanticSearch(query, { limit, hybrid });
|
|
194
|
+
if (r.hits.length === 0)
|
|
195
|
+
return text(`No semantic matches for "${query}".`);
|
|
196
|
+
const lines = r.hits.map((h) => `- ${h.name} (score ${h.score.toFixed(3)})${h.snippet ? `\n ${h.snippet}` : ""}`);
|
|
197
|
+
return text(`${r.total} result(s)${r.hasMore ? " (more available)" : ""}:\n${lines.join("\n")}`);
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
return fail(err);
|
|
201
|
+
}
|
|
121
202
|
});
|
|
203
|
+
// --- Mutating tools (omitted entirely when NOTES_READONLY=1) --------------
|
|
204
|
+
if (!isReadOnly()) {
|
|
205
|
+
server.registerTool("create_note", {
|
|
206
|
+
title: "Create a note",
|
|
207
|
+
description: "Create a new markdown note. Fails if it exists unless overwrite is true.",
|
|
208
|
+
inputSchema: {
|
|
209
|
+
name: z.string().describe("Note name, e.g. 'ideas' or 'projects/mcp'"),
|
|
210
|
+
content: z.string().describe("Markdown content"),
|
|
211
|
+
overwrite: z.boolean().optional().describe("Overwrite if it already exists (default false)"),
|
|
212
|
+
},
|
|
213
|
+
}, async ({ name, content, overwrite }) => {
|
|
214
|
+
try {
|
|
215
|
+
const n = await createNote(name, content, overwrite ?? false);
|
|
216
|
+
return text(`Created note "${n}".`);
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
return fail(err);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
server.registerTool("append_note", {
|
|
223
|
+
title: "Append to a note",
|
|
224
|
+
description: "Append content to a note (creating it if missing). Good for journals and logs.",
|
|
225
|
+
inputSchema: {
|
|
226
|
+
name: z.string().describe("Note name"),
|
|
227
|
+
content: z.string().describe("Markdown content to append"),
|
|
228
|
+
},
|
|
229
|
+
}, async ({ name, content }) => {
|
|
230
|
+
try {
|
|
231
|
+
const n = await appendNote(name, content);
|
|
232
|
+
return text(`Appended to "${n}".`);
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
return fail(err);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
server.registerTool("delete_note", {
|
|
239
|
+
title: "Delete a note",
|
|
240
|
+
description: "Permanently delete a note by name.",
|
|
241
|
+
inputSchema: { name: z.string().describe("Note name to delete") },
|
|
242
|
+
annotations: { destructiveHint: true },
|
|
243
|
+
}, async ({ name }) => {
|
|
244
|
+
try {
|
|
245
|
+
await deleteNote(name);
|
|
246
|
+
return text(`Deleted note "${name}".`);
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
return fail(err);
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
server.registerTool("move_note", {
|
|
253
|
+
title: "Move/rename a note",
|
|
254
|
+
description: "Rename or move a note and rewrite every [[wiki-link]] pointing at it across the vault.",
|
|
255
|
+
inputSchema: {
|
|
256
|
+
from: z.string().describe("Current note name"),
|
|
257
|
+
to: z.string().describe("New note name/path"),
|
|
258
|
+
},
|
|
259
|
+
}, async ({ from, to }) => {
|
|
260
|
+
try {
|
|
261
|
+
const r = await moveNote(from, to);
|
|
262
|
+
const rw = r.rewritten.length ? ` Rewrote backlinks in: ${r.rewritten.join(", ")}.` : "";
|
|
263
|
+
return text(`Moved "${r.from}" → "${r.to}".${rw}`);
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
return fail(err);
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
}
|
|
122
270
|
// --- Resources -----------------------------------------------------------
|
|
123
|
-
|
|
124
|
-
server.registerResource("note", "notes://{name}", {
|
|
125
|
-
title: "Note",
|
|
126
|
-
description: "A markdown note, addressable by name.",
|
|
127
|
-
mimeType: "text/markdown",
|
|
128
|
-
}, async (uri) => {
|
|
271
|
+
server.registerResource("note", "notes://{name}", { title: "Note", description: "A markdown note, addressable by name.", mimeType: "text/markdown" }, async (uri) => {
|
|
129
272
|
const name = decodeURIComponent(uri.pathname.replace(/^\/+/, "") || uri.href.replace("notes://", ""));
|
|
130
|
-
const content = await readNote(name);
|
|
131
|
-
return {
|
|
132
|
-
contents: [{ uri: uri.href, mimeType: "text/markdown", text: content }],
|
|
133
|
-
};
|
|
273
|
+
const { text: content } = await readNote(name);
|
|
274
|
+
return { contents: [{ uri: uri.href, mimeType: "text/markdown", text: content }] };
|
|
134
275
|
});
|
|
135
276
|
// --- Startup -------------------------------------------------------------
|
|
136
277
|
async function main() {
|
|
137
|
-
await
|
|
278
|
+
await buildIndex(); // load/sync the index before serving any request
|
|
138
279
|
const transport = new StdioServerTransport();
|
|
139
280
|
await server.connect(transport);
|
|
140
|
-
|
|
141
|
-
console.error(`mcp-notes-server running. Notes dir: ${getNotesDir()}`);
|
|
281
|
+
console.error(`mcp-notes-server v0.3.0 running${isReadOnly() ? " (read-only)" : ""}. Notes dir: ${notesDir()}`);
|
|
142
282
|
}
|
|
143
283
|
main().catch((err) => {
|
|
144
284
|
console.error("Fatal error starting mcp-notes-server:", err);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,SAAS,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AAE7E,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACxF,MAAM,IAAI,GAAG,CAAC,GAAY,EAAE,EAAE,CAAC,IAAI,CAAC,UAAW,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;AAExE,4EAA4E;AAE5E,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;IACE,KAAK,EAAE,YAAY;IACnB,WAAW,EACT,wEAAwE;QACxE,mEAAmE;IACrE,WAAW,EAAE;QACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC9E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QAC3F,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;KACpE;CACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;IAC/B,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IACnD,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC7F,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9G,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjG,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;IACE,KAAK,EAAE,aAAa;IACpB,WAAW,EACT,0EAA0E;QAC1E,yEAAyE;IAC3E,WAAW,EAAE;QACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACtE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;QACnF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QACrF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KACnF;CACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;IACzC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;IACE,KAAK,EAAE,kBAAkB;IACzB,WAAW,EAAE,4EAA4E;IACzF,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;CACxD,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IACjB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;IACE,KAAK,EAAE,cAAc;IACrB,WAAW,EACT,4EAA4E;QAC5E,8EAA8E;IAChF,WAAW,EAAE;QACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC1C,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QAC/E,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QAC7E,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACnG,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC9E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KAC5F;CACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;IACvD,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5E,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,mBAAmB,KAAK,IAAI,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CACtB,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3F,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnG,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;IACE,KAAK,EAAE,WAAW;IAClB,WAAW,EAAE,mDAAmD;IAChE,WAAW,EAAE,EAAE;CAChB,EACD,KAAK,IAAI,EAAE;IACT,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACrE,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;IACE,KAAK,EAAE,YAAY;IACnB,WAAW,EAAE,wFAAwF;IACrG,WAAW,EAAE;QACX,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;KAChG;CACF,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;IACxB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC;IACpD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IAC7F,OAAO,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,cAAc,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/D,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;IACE,KAAK,EAAE,eAAe;IACtB,WAAW,EAAE,sEAAsE;IACnF,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE;CAC7E,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IACjB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,kBAAkB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1G,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;IACE,KAAK,EAAE,eAAe;IACtB,WAAW,EAAE,0FAA0F;IACvG,WAAW,EAAE;QACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC7F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;KAC9F;CACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IAC/B,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IACvD,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,IAAI,wCAAwC,CAAC,CAAC;IACnF,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACpF,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;IACE,KAAK,EAAE,WAAW;IAClB,WAAW,EAAE,2EAA2E;IACxF,WAAW,EAAE;QACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;KACpC;CACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;IACrB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC,oBAAoB,IAAI,UAAU,EAAE,IAAI,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;IACE,KAAK,EAAE,eAAe;IACtB,WAAW,EAAE,4EAA4E;IACzF,WAAW,EAAE;QACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACvD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KAC3F;CACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;IACxB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,yBAAyB,IAAI,IAAI,CAAC,CAAC;IACrE,OAAO,IAAI,CACT,GAAG;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,WAAW,WAAW,CAAC,CAAC,UAAU,QAAQ,CAAC;SACvG,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;IACE,KAAK,EAAE,gBAAgB;IACvB,WAAW,EAAE,qFAAqF;IAClG,WAAW,EAAE,EAAE;CAChB,EACD,KAAK,IAAI,EAAE;IACT,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;IAC/E,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;IAClE,OAAO,IAAI,CACT,UAAU,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC,WAAW,IAAI;QACvF,SAAS,IAAI,cAAc,OAAO,EAAE,CACvC,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;IACE,KAAK,EAAE,cAAc;IACrB,WAAW,EAAE,wDAAwD;IACrE,WAAW,EAAE,EAAE;CAChB,EACD,KAAK,IAAI,EAAE;IACT,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,qBAAqB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpH,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;IACE,KAAK,EAAE,iBAAiB;IACxB,WAAW,EACT,yEAAyE;QACzE,6EAA6E;QAC7E,4EAA4E;IAC9E,WAAW,EAAE;QACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACpD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QAC3F,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;KAC3F;CACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;IACjC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,4BAA4B,KAAK,IAAI,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CACtB,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3F,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CACF,CAAC;AAEF,6EAA6E;AAE7E,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;IAClB,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,0EAA0E;QACvF,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;YACtE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YAChD,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;SAC7F;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,IAAI,KAAK,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,gFAAgF;QAC7F,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;YACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;SAC3D;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,oCAAoC;QACjD,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE;QACjE,WAAW,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;KACvC,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,wFAAwF;QAC1F,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAC9C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;SAC9C;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnC,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACzF,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,4EAA4E;AAE5E,MAAM,CAAC,gBAAgB,CACrB,MAAM,EACN,gBAAgB,EAChB,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,uCAAuC,EAAE,QAAQ,EAAE,eAAe,EAAE,EAClG,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,IAAI,GAAG,kBAAkB,CAC7B,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CACrE,CAAC;IACF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AACrF,CAAC,CACF,CAAC;AAEF,4EAA4E;AAE5E,KAAK,UAAU,IAAI;IACjB,MAAM,UAAU,EAAE,CAAC,CAAC,iDAAiD;IACrE,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CACX,kCAAkC,UAAU,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,gBAAgB,QAAQ,EAAE,EAAE,CACjG,CAAC;AACJ,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|