obsidian-mcp-pro 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +198 -0
- package/build/config.d.ts +4 -0
- package/build/config.d.ts.map +1 -0
- package/build/config.js +147 -0
- package/build/config.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +135 -0
- package/build/index.js.map +1 -0
- package/build/lib/markdown.d.ts +43 -0
- package/build/lib/markdown.d.ts.map +1 -0
- package/build/lib/markdown.js +206 -0
- package/build/lib/markdown.js.map +1 -0
- package/build/lib/vault.d.ts +22 -0
- package/build/lib/vault.d.ts.map +1 -0
- package/build/lib/vault.js +182 -0
- package/build/lib/vault.js.map +1 -0
- package/build/tools/canvas.d.ts +3 -0
- package/build/tools/canvas.d.ts.map +1 -0
- package/build/tools/canvas.js +172 -0
- package/build/tools/canvas.js.map +1 -0
- package/build/tools/links.d.ts +3 -0
- package/build/tools/links.d.ts.map +1 -0
- package/build/tools/links.js +550 -0
- package/build/tools/links.js.map +1 -0
- package/build/tools/read.d.ts +3 -0
- package/build/tools/read.d.ts.map +1 -0
- package/build/tools/read.js +302 -0
- package/build/tools/read.js.map +1 -0
- package/build/tools/tags.d.ts +3 -0
- package/build/tools/tags.d.ts.map +1 -0
- package/build/tools/tags.js +146 -0
- package/build/tools/tags.js.map +1 -0
- package/build/tools/write.d.ts +3 -0
- package/build/tools/write.d.ts.map +1 -0
- package/build/tools/write.js +241 -0
- package/build/tools/write.js.map +1 -0
- package/build/types.d.ts +84 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import matter from "gray-matter";
|
|
2
|
+
import path from "path";
|
|
3
|
+
/**
|
|
4
|
+
* Parse YAML frontmatter from markdown content.
|
|
5
|
+
*/
|
|
6
|
+
export function parseFrontmatter(content) {
|
|
7
|
+
const result = matter(content);
|
|
8
|
+
return {
|
|
9
|
+
data: result.data,
|
|
10
|
+
content: result.content,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Parse existing frontmatter, merge with updates, and return full content
|
|
15
|
+
* with updated frontmatter. Creates frontmatter if none exists.
|
|
16
|
+
*/
|
|
17
|
+
export function updateFrontmatter(content, updates) {
|
|
18
|
+
const parsed = matter(content);
|
|
19
|
+
const merged = { ...parsed.data, ...updates };
|
|
20
|
+
return matter.stringify(parsed.content, merged);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Track whether a line is inside a fenced code block.
|
|
24
|
+
* Returns a function that, given a line, returns true if the line
|
|
25
|
+
* is inside a code block (should be skipped).
|
|
26
|
+
*/
|
|
27
|
+
function createCodeBlockTracker() {
|
|
28
|
+
let insideCodeBlock = false;
|
|
29
|
+
return (line) => {
|
|
30
|
+
const trimmed = line.trimStart();
|
|
31
|
+
if (trimmed.startsWith("```")) {
|
|
32
|
+
insideCodeBlock = !insideCodeBlock;
|
|
33
|
+
return true; // skip the fence line itself
|
|
34
|
+
}
|
|
35
|
+
return insideCodeBlock;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Strip inline code spans from a line so patterns inside them are ignored.
|
|
40
|
+
*/
|
|
41
|
+
function stripInlineCode(line) {
|
|
42
|
+
return line.replace(/`[^`]*`/g, "");
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Extract all wikilinks and embeds from markdown content.
|
|
46
|
+
* Ignores links inside code blocks and inline code.
|
|
47
|
+
*/
|
|
48
|
+
export function extractWikilinks(content) {
|
|
49
|
+
const links = [];
|
|
50
|
+
const lines = content.split("\n");
|
|
51
|
+
const isInsideCodeBlock = createCodeBlockTracker();
|
|
52
|
+
// Match both ![[...]] embeds and [[...]] links
|
|
53
|
+
const wikilinkRegex = /(!)?\[\[([^\]]+?)\]\]/g;
|
|
54
|
+
for (const line of lines) {
|
|
55
|
+
if (isInsideCodeBlock(line))
|
|
56
|
+
continue;
|
|
57
|
+
const cleaned = stripInlineCode(line);
|
|
58
|
+
let match;
|
|
59
|
+
// Reset lastIndex for each line
|
|
60
|
+
wikilinkRegex.lastIndex = 0;
|
|
61
|
+
while ((match = wikilinkRegex.exec(cleaned)) !== null) {
|
|
62
|
+
const isEmbed = match[1] === "!";
|
|
63
|
+
const inner = match[2];
|
|
64
|
+
// Split on first pipe for display text
|
|
65
|
+
const pipeIndex = inner.indexOf("|");
|
|
66
|
+
const target = pipeIndex >= 0 ? inner.slice(0, pipeIndex) : inner;
|
|
67
|
+
const displayText = pipeIndex >= 0 ? inner.slice(pipeIndex + 1) : undefined;
|
|
68
|
+
links.push({
|
|
69
|
+
source: "", // caller fills in
|
|
70
|
+
target: target.trim(),
|
|
71
|
+
displayText: displayText?.trim(),
|
|
72
|
+
isEmbed,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return links;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Extract inline tags and frontmatter tags from markdown content.
|
|
80
|
+
* Returns deduplicated tags without the `#` prefix.
|
|
81
|
+
* Ignores tags inside code blocks and inline code.
|
|
82
|
+
*/
|
|
83
|
+
export function extractTags(content) {
|
|
84
|
+
const tagSet = new Set();
|
|
85
|
+
// Extract frontmatter tags
|
|
86
|
+
const { data, content: body } = parseFrontmatter(content);
|
|
87
|
+
if (data.tags) {
|
|
88
|
+
if (Array.isArray(data.tags)) {
|
|
89
|
+
for (const tag of data.tags) {
|
|
90
|
+
const t = String(tag).trim();
|
|
91
|
+
if (t)
|
|
92
|
+
tagSet.add(t);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else if (typeof data.tags === "string") {
|
|
96
|
+
for (const tag of data.tags.split(",")) {
|
|
97
|
+
const t = tag.trim();
|
|
98
|
+
if (t)
|
|
99
|
+
tagSet.add(t);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Extract inline tags from body
|
|
104
|
+
const lines = body.split("\n");
|
|
105
|
+
const isInsideCodeBlock = createCodeBlockTracker();
|
|
106
|
+
const tagRegex = /(?:^|\s)#([a-zA-Z0-9_/-]+)/g;
|
|
107
|
+
for (const line of lines) {
|
|
108
|
+
if (isInsideCodeBlock(line))
|
|
109
|
+
continue;
|
|
110
|
+
const cleaned = stripInlineCode(line);
|
|
111
|
+
let match;
|
|
112
|
+
tagRegex.lastIndex = 0;
|
|
113
|
+
while ((match = tagRegex.exec(cleaned)) !== null) {
|
|
114
|
+
tagSet.add(match[1]);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return [...tagSet];
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Extract aliases from frontmatter `aliases` field.
|
|
121
|
+
*/
|
|
122
|
+
export function extractAliases(content) {
|
|
123
|
+
const { data } = parseFrontmatter(content);
|
|
124
|
+
if (!data.aliases)
|
|
125
|
+
return [];
|
|
126
|
+
if (Array.isArray(data.aliases)) {
|
|
127
|
+
return data.aliases.map((a) => String(a).trim()).filter(Boolean);
|
|
128
|
+
}
|
|
129
|
+
if (typeof data.aliases === "string") {
|
|
130
|
+
return data.aliases
|
|
131
|
+
.split(",")
|
|
132
|
+
.map((a) => a.trim())
|
|
133
|
+
.filter(Boolean);
|
|
134
|
+
}
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Build a complete NoteMetadata object from a note's content and file stats.
|
|
139
|
+
*/
|
|
140
|
+
export function buildNoteMetadata(vaultPath, relativePath, content, stats) {
|
|
141
|
+
const { data } = parseFrontmatter(content);
|
|
142
|
+
const tags = extractTags(content);
|
|
143
|
+
const aliases = extractAliases(content);
|
|
144
|
+
// Title: frontmatter title or filename without extension
|
|
145
|
+
const title = typeof data.title === "string" && data.title.trim()
|
|
146
|
+
? data.title.trim()
|
|
147
|
+
: path.basename(relativePath, path.extname(relativePath));
|
|
148
|
+
return {
|
|
149
|
+
title,
|
|
150
|
+
path: path.join(vaultPath, relativePath),
|
|
151
|
+
relativePath,
|
|
152
|
+
created: stats.created,
|
|
153
|
+
modified: stats.modified,
|
|
154
|
+
size: stats.size,
|
|
155
|
+
tags,
|
|
156
|
+
frontmatter: data,
|
|
157
|
+
aliases,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Resolve a wikilink target to an actual file path using Obsidian's
|
|
162
|
+
* shortest-path matching strategy.
|
|
163
|
+
* Returns null if no match is found.
|
|
164
|
+
*/
|
|
165
|
+
export function resolveWikilink(link, _currentNotePath, allNotePaths) {
|
|
166
|
+
// Normalize: strip .md if present, we'll compare basenames
|
|
167
|
+
const normalizedLink = link.replace(/\.md$/i, "");
|
|
168
|
+
// Exact relative path match (with or without extension)
|
|
169
|
+
for (const notePath of allNotePaths) {
|
|
170
|
+
const withoutExt = notePath.replace(/\.md$/i, "");
|
|
171
|
+
if (withoutExt === normalizedLink)
|
|
172
|
+
return notePath;
|
|
173
|
+
}
|
|
174
|
+
// Match by path suffix — handles [[folder/note]] style links
|
|
175
|
+
if (normalizedLink.includes("/")) {
|
|
176
|
+
for (const notePath of allNotePaths) {
|
|
177
|
+
const withoutExt = notePath.replace(/\.md$/i, "");
|
|
178
|
+
if (withoutExt.endsWith(normalizedLink)) {
|
|
179
|
+
// Ensure the match is at a path boundary
|
|
180
|
+
const prefix = withoutExt.slice(0, withoutExt.length - normalizedLink.length);
|
|
181
|
+
if (prefix === "" || prefix.endsWith("/"))
|
|
182
|
+
return notePath;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Shortest-path: match by basename only
|
|
187
|
+
const linkBasename = path.basename(normalizedLink).toLowerCase();
|
|
188
|
+
const candidates = [];
|
|
189
|
+
for (const notePath of allNotePaths) {
|
|
190
|
+
const noteBasename = path
|
|
191
|
+
.basename(notePath, path.extname(notePath))
|
|
192
|
+
.toLowerCase();
|
|
193
|
+
if (noteBasename === linkBasename) {
|
|
194
|
+
candidates.push(notePath);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (candidates.length === 0)
|
|
198
|
+
return null;
|
|
199
|
+
if (candidates.length === 1)
|
|
200
|
+
return candidates[0];
|
|
201
|
+
// Multiple matches: pick the one closest to the current note
|
|
202
|
+
// Obsidian prefers the shortest path from the vault root
|
|
203
|
+
candidates.sort((a, b) => a.length - b.length);
|
|
204
|
+
return candidates[0];
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/lib/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAI9C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAA+B;QAC5C,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,OAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;IAC9C,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB;IAC7B,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,OAAO,CAAC,IAAY,EAAW,EAAE;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACjC,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,eAAe,GAAG,CAAC,eAAe,CAAC;YACnC,OAAO,IAAI,CAAC,CAAC,6BAA6B;QAC5C,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,iBAAiB,GAAG,sBAAsB,EAAE,CAAC;IAEnD,+CAA+C;IAC/C,MAAM,aAAa,GAAG,wBAAwB,CAAC;IAE/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,iBAAiB,CAAC,IAAI,CAAC;YAAE,SAAS;QAEtC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,KAA6B,CAAC;QAElC,gCAAgC;QAChC,aAAa,CAAC,SAAS,GAAG,CAAC,CAAC;QAE5B,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACtD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;YACjC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEvB,uCAAuC;YACvC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAClE,MAAM,WAAW,GACf,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAE1D,KAAK,CAAC,IAAI,CAAC;gBACT,MAAM,EAAE,EAAE,EAAE,kBAAkB;gBAC9B,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;gBACrB,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE;gBAChC,OAAO;aACR,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,2BAA2B;IAC3B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,iBAAiB,GAAG,sBAAsB,EAAE,CAAC;IACnD,MAAM,QAAQ,GAAG,6BAA6B,CAAC;IAE/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,iBAAiB,CAAC,IAAI,CAAC;YAAE,SAAS;QAEtC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,KAA6B,CAAC;QAClC,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC;QAEvB,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACjD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,MAAM,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAE7B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC,OAAO;aAChB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAC5B,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,YAAoB,EACpB,OAAe,EACf,KAAoE;IAEpE,MAAM,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAExC,yDAAyD;IACzD,MAAM,KAAK,GACT,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QACjD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QACnB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAE9D,OAAO;QACL,KAAK;QACL,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;QACxC,YAAY;QACZ,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI;QACJ,WAAW,EAAE,IAAI;QACjB,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,gBAAwB,EACxB,YAAsB;IAEtB,2DAA2D;IAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAElD,wDAAwD;IACxD,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,UAAU,KAAK,cAAc;YAAE,OAAO,QAAQ,CAAC;IACrD,CAAC;IAED,6DAA6D;IAC7D,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAClD,IAAI,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACxC,yCAAyC;gBACzC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAC7B,CAAC,EACD,UAAU,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAC1C,CAAC;gBACF,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,OAAO,QAAQ,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;IACjE,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,IAAI;aACtB,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;aAC1C,WAAW,EAAE,CAAC;QACjB,IAAI,YAAY,KAAK,YAAY,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IAElD,6DAA6D;IAC7D,yDAAyD;IACzD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAC/C,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { SearchResult, CanvasData } from "../types.js";
|
|
2
|
+
export declare function listNotes(vaultPath: string, folder?: string): Promise<string[]>;
|
|
3
|
+
export declare function readNote(vaultPath: string, relativePath: string): Promise<string>;
|
|
4
|
+
export declare function writeNote(vaultPath: string, relativePath: string, content: string): Promise<void>;
|
|
5
|
+
export declare function appendToNote(vaultPath: string, relativePath: string, content: string): Promise<void>;
|
|
6
|
+
export declare function prependToNote(vaultPath: string, relativePath: string, content: string): Promise<void>;
|
|
7
|
+
export declare function deleteNote(vaultPath: string, relativePath: string, useTrash?: boolean): Promise<void>;
|
|
8
|
+
export declare function moveNote(vaultPath: string, oldPath: string, newPath: string): Promise<void>;
|
|
9
|
+
export declare function searchNotes(vaultPath: string, query: string, options?: {
|
|
10
|
+
caseSensitive?: boolean;
|
|
11
|
+
maxResults?: number;
|
|
12
|
+
folder?: string;
|
|
13
|
+
}): Promise<SearchResult[]>;
|
|
14
|
+
export declare function getNoteStats(vaultPath: string, relativePath: string): Promise<{
|
|
15
|
+
size: number;
|
|
16
|
+
created: Date | null;
|
|
17
|
+
modified: Date | null;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function listCanvasFiles(vaultPath: string): Promise<string[]>;
|
|
20
|
+
export declare function readCanvasFile(vaultPath: string, relativePath: string): Promise<CanvasData>;
|
|
21
|
+
export declare function writeCanvasFile(vaultPath: string, relativePath: string, data: CanvasData): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=vault.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/lib/vault.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAe,UAAU,EAAE,MAAM,aAAa,CAAC;AAoBzE,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BnB;AAED,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,UAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IACR,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,YAAY,EAAE,CAAC,CAuDzB;AAED,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAA;CAAE,CAAC,CASxE;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,EAAE,CAAC,CAYnB;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,UAAU,CAAC,CAIrB;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import fs from "fs/promises";
|
|
2
|
+
import path from "path";
|
|
3
|
+
const EXCLUDED_DIRS = [".obsidian", ".trash"];
|
|
4
|
+
function isExcluded(relativePath) {
|
|
5
|
+
const normalized = relativePath.replace(/\\/g, "/");
|
|
6
|
+
return EXCLUDED_DIRS.some((dir) => normalized.startsWith(`${dir}/`) || normalized === dir);
|
|
7
|
+
}
|
|
8
|
+
function resolveVaultPath(vaultPath, relativePath) {
|
|
9
|
+
const resolved = path.resolve(vaultPath, relativePath);
|
|
10
|
+
// Prevent path traversal outside vault
|
|
11
|
+
if (!resolved.startsWith(path.resolve(vaultPath))) {
|
|
12
|
+
throw new Error(`Path traversal detected: ${relativePath}`);
|
|
13
|
+
}
|
|
14
|
+
return resolved;
|
|
15
|
+
}
|
|
16
|
+
export async function listNotes(vaultPath, folder) {
|
|
17
|
+
const baseDir = folder
|
|
18
|
+
? resolveVaultPath(vaultPath, folder)
|
|
19
|
+
: path.resolve(vaultPath);
|
|
20
|
+
let entries;
|
|
21
|
+
try {
|
|
22
|
+
entries = await fs.readdir(baseDir, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
if (err.code === "ENOENT") {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
throw err;
|
|
29
|
+
}
|
|
30
|
+
const notes = [];
|
|
31
|
+
for (const entry of entries) {
|
|
32
|
+
const normalized = entry.replace(/\\/g, "/");
|
|
33
|
+
if (!normalized.endsWith(".md"))
|
|
34
|
+
continue;
|
|
35
|
+
const relativeFromVault = folder
|
|
36
|
+
? `${folder}/${normalized}`.replace(/\\/g, "/")
|
|
37
|
+
: normalized;
|
|
38
|
+
if (isExcluded(relativeFromVault))
|
|
39
|
+
continue;
|
|
40
|
+
notes.push(relativeFromVault);
|
|
41
|
+
}
|
|
42
|
+
return notes.sort();
|
|
43
|
+
}
|
|
44
|
+
export async function readNote(vaultPath, relativePath) {
|
|
45
|
+
const fullPath = resolveVaultPath(vaultPath, relativePath);
|
|
46
|
+
try {
|
|
47
|
+
return await fs.readFile(fullPath, "utf-8");
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
if (err.code === "ENOENT") {
|
|
51
|
+
throw new Error(`Note not found: ${relativePath}`);
|
|
52
|
+
}
|
|
53
|
+
throw err;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export async function writeNote(vaultPath, relativePath, content) {
|
|
57
|
+
const fullPath = resolveVaultPath(vaultPath, relativePath);
|
|
58
|
+
await fs.mkdir(path.dirname(fullPath), { recursive: true });
|
|
59
|
+
await fs.writeFile(fullPath, content, "utf-8");
|
|
60
|
+
}
|
|
61
|
+
export async function appendToNote(vaultPath, relativePath, content) {
|
|
62
|
+
const fullPath = resolveVaultPath(vaultPath, relativePath);
|
|
63
|
+
const existing = await fs.readFile(fullPath, "utf-8");
|
|
64
|
+
const separator = existing.endsWith("\n") ? "" : "\n";
|
|
65
|
+
await fs.writeFile(fullPath, existing + separator + content, "utf-8");
|
|
66
|
+
}
|
|
67
|
+
export async function prependToNote(vaultPath, relativePath, content) {
|
|
68
|
+
const fullPath = resolveVaultPath(vaultPath, relativePath);
|
|
69
|
+
const existing = await fs.readFile(fullPath, "utf-8");
|
|
70
|
+
// Detect frontmatter block (starts with --- on first line)
|
|
71
|
+
const frontmatterMatch = existing.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);
|
|
72
|
+
let result;
|
|
73
|
+
if (frontmatterMatch) {
|
|
74
|
+
const frontmatter = frontmatterMatch[0];
|
|
75
|
+
const rest = existing.slice(frontmatter.length);
|
|
76
|
+
const separator = frontmatter.endsWith("\n") ? "" : "\n";
|
|
77
|
+
result = frontmatter + separator + content + "\n" + rest;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
result = content + "\n" + existing;
|
|
81
|
+
}
|
|
82
|
+
await fs.writeFile(fullPath, result, "utf-8");
|
|
83
|
+
}
|
|
84
|
+
export async function deleteNote(vaultPath, relativePath, useTrash = true) {
|
|
85
|
+
const fullPath = resolveVaultPath(vaultPath, relativePath);
|
|
86
|
+
if (useTrash) {
|
|
87
|
+
const trashDir = path.join(vaultPath, ".trash");
|
|
88
|
+
const trashPath = path.join(trashDir, relativePath);
|
|
89
|
+
await fs.mkdir(path.dirname(trashPath), { recursive: true });
|
|
90
|
+
await fs.rename(fullPath, trashPath);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
await fs.unlink(fullPath);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export async function moveNote(vaultPath, oldPath, newPath) {
|
|
97
|
+
const fullOldPath = resolveVaultPath(vaultPath, oldPath);
|
|
98
|
+
const fullNewPath = resolveVaultPath(vaultPath, newPath);
|
|
99
|
+
await fs.mkdir(path.dirname(fullNewPath), { recursive: true });
|
|
100
|
+
await fs.rename(fullOldPath, fullNewPath);
|
|
101
|
+
}
|
|
102
|
+
export async function searchNotes(vaultPath, query, options) {
|
|
103
|
+
const caseSensitive = options?.caseSensitive ?? false;
|
|
104
|
+
const maxResults = options?.maxResults ?? 100;
|
|
105
|
+
const notes = await listNotes(vaultPath, options?.folder);
|
|
106
|
+
const results = [];
|
|
107
|
+
const searchQuery = caseSensitive ? query : query.toLowerCase();
|
|
108
|
+
for (const notePath of notes) {
|
|
109
|
+
if (results.length >= maxResults)
|
|
110
|
+
break;
|
|
111
|
+
let content;
|
|
112
|
+
try {
|
|
113
|
+
content = await readNote(vaultPath, notePath);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
console.error(`Failed to read note during search: ${notePath}`);
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
const lines = content.split("\n");
|
|
120
|
+
const matches = [];
|
|
121
|
+
for (let i = 0; i < lines.length; i++) {
|
|
122
|
+
const line = lines[i];
|
|
123
|
+
const compareLine = caseSensitive ? line : line.toLowerCase();
|
|
124
|
+
let startIndex = 0;
|
|
125
|
+
while (true) {
|
|
126
|
+
const col = compareLine.indexOf(searchQuery, startIndex);
|
|
127
|
+
if (col === -1)
|
|
128
|
+
break;
|
|
129
|
+
matches.push({
|
|
130
|
+
line: i + 1,
|
|
131
|
+
content: line.trim(),
|
|
132
|
+
column: col,
|
|
133
|
+
});
|
|
134
|
+
startIndex = col + searchQuery.length;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (matches.length > 0) {
|
|
138
|
+
results.push({
|
|
139
|
+
path: resolveVaultPath(vaultPath, notePath),
|
|
140
|
+
relativePath: notePath,
|
|
141
|
+
matches,
|
|
142
|
+
score: matches.length,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Sort by score descending
|
|
147
|
+
results.sort((a, b) => b.score - a.score);
|
|
148
|
+
return results.slice(0, maxResults);
|
|
149
|
+
}
|
|
150
|
+
export async function getNoteStats(vaultPath, relativePath) {
|
|
151
|
+
const fullPath = resolveVaultPath(vaultPath, relativePath);
|
|
152
|
+
const stats = await fs.stat(fullPath);
|
|
153
|
+
return {
|
|
154
|
+
size: stats.size,
|
|
155
|
+
created: stats.birthtime ?? null,
|
|
156
|
+
modified: stats.mtime ?? null,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
export async function listCanvasFiles(vaultPath) {
|
|
160
|
+
const entries = await fs.readdir(vaultPath, { recursive: true });
|
|
161
|
+
const canvasFiles = [];
|
|
162
|
+
for (const entry of entries) {
|
|
163
|
+
const normalized = entry.replace(/\\/g, "/");
|
|
164
|
+
if (!normalized.endsWith(".canvas"))
|
|
165
|
+
continue;
|
|
166
|
+
if (isExcluded(normalized))
|
|
167
|
+
continue;
|
|
168
|
+
canvasFiles.push(normalized);
|
|
169
|
+
}
|
|
170
|
+
return canvasFiles.sort();
|
|
171
|
+
}
|
|
172
|
+
export async function readCanvasFile(vaultPath, relativePath) {
|
|
173
|
+
const fullPath = resolveVaultPath(vaultPath, relativePath);
|
|
174
|
+
const content = await fs.readFile(fullPath, "utf-8");
|
|
175
|
+
return JSON.parse(content);
|
|
176
|
+
}
|
|
177
|
+
export async function writeCanvasFile(vaultPath, relativePath, data) {
|
|
178
|
+
const fullPath = resolveVaultPath(vaultPath, relativePath);
|
|
179
|
+
await fs.mkdir(path.dirname(fullPath), { recursive: true });
|
|
180
|
+
await fs.writeFile(fullPath, JSON.stringify(data, null, 2), "utf-8");
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/lib/vault.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../../src/tools/canvas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAsM9E"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { listCanvasFiles, readCanvasFile, writeCanvasFile } from "../lib/vault.js";
|
|
3
|
+
import { randomUUID } from "crypto";
|
|
4
|
+
export function registerCanvasTools(server, vaultPath) {
|
|
5
|
+
server.tool("list_canvases", "List all canvas files in the vault", {}, async () => {
|
|
6
|
+
try {
|
|
7
|
+
const files = await listCanvasFiles(vaultPath);
|
|
8
|
+
if (files.length === 0) {
|
|
9
|
+
return { content: [{ type: "text", text: "No canvas files found in the vault." }] };
|
|
10
|
+
}
|
|
11
|
+
const formatted = files.map((f, i) => `${i + 1}. ${f}`).join("\n");
|
|
12
|
+
return {
|
|
13
|
+
content: [{ type: "text", text: `Found ${files.length} canvas file(s):\n\n${formatted}` }],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
console.error("Failed to list canvas files:", err);
|
|
18
|
+
return {
|
|
19
|
+
content: [{ type: "text", text: `Error listing canvas files: ${err.message}` }],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
server.tool("read_canvas", "Read and display the contents of an Obsidian canvas file", { path: z.string().describe("Relative path to the .canvas file") }, async ({ path: canvasPath }) => {
|
|
24
|
+
try {
|
|
25
|
+
const data = await readCanvasFile(vaultPath, canvasPath);
|
|
26
|
+
const lines = [];
|
|
27
|
+
lines.push(`Canvas: ${canvasPath}`);
|
|
28
|
+
lines.push(`Nodes: ${data.nodes.length} | Edges: ${data.edges.length}`);
|
|
29
|
+
lines.push("");
|
|
30
|
+
if (data.nodes.length > 0) {
|
|
31
|
+
lines.push("--- Nodes ---");
|
|
32
|
+
for (const node of data.nodes) {
|
|
33
|
+
const pos = `(${node.x}, ${node.y})`;
|
|
34
|
+
const size = `${node.width}x${node.height}`;
|
|
35
|
+
let preview = "";
|
|
36
|
+
if (node.type === "text" && node.text) {
|
|
37
|
+
preview = node.text.length > 100
|
|
38
|
+
? node.text.slice(0, 100) + "..."
|
|
39
|
+
: node.text;
|
|
40
|
+
}
|
|
41
|
+
else if (node.type === "file" && node.file) {
|
|
42
|
+
preview = node.file;
|
|
43
|
+
}
|
|
44
|
+
else if (node.type === "link" && node.url) {
|
|
45
|
+
preview = node.url;
|
|
46
|
+
}
|
|
47
|
+
lines.push(` [${node.id}] type=${node.type} pos=${pos} size=${size}`);
|
|
48
|
+
if (preview) {
|
|
49
|
+
lines.push(` content: ${preview}`);
|
|
50
|
+
}
|
|
51
|
+
if (node.color) {
|
|
52
|
+
lines.push(` color: ${node.color}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
lines.push("");
|
|
56
|
+
}
|
|
57
|
+
if (data.edges.length > 0) {
|
|
58
|
+
lines.push("--- Edges ---");
|
|
59
|
+
for (const edge of data.edges) {
|
|
60
|
+
const label = edge.label ? ` [${edge.label}]` : "";
|
|
61
|
+
const sides = [
|
|
62
|
+
edge.fromSide ? `from-side=${edge.fromSide}` : "",
|
|
63
|
+
edge.toSide ? `to-side=${edge.toSide}` : "",
|
|
64
|
+
].filter(Boolean).join(" ");
|
|
65
|
+
const sideInfo = sides ? ` (${sides})` : "";
|
|
66
|
+
lines.push(` ${edge.fromNode} -> ${edge.toNode}${label}${sideInfo}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
console.error("Failed to read canvas:", err);
|
|
73
|
+
return {
|
|
74
|
+
content: [{ type: "text", text: `Error reading canvas: ${err.message}` }],
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
server.tool("add_canvas_node", "Add a new node to an Obsidian canvas", {
|
|
79
|
+
canvasPath: z.string().describe("Relative path to the .canvas file"),
|
|
80
|
+
type: z.enum(["text", "file", "link"]).describe("Node type"),
|
|
81
|
+
content: z.string().describe("Text content, file path, or URL depending on type"),
|
|
82
|
+
x: z.number().optional().default(0).describe("X position"),
|
|
83
|
+
y: z.number().optional().default(0).describe("Y position"),
|
|
84
|
+
width: z.number().optional().default(250).describe("Node width"),
|
|
85
|
+
height: z.number().optional().default(60).describe("Node height"),
|
|
86
|
+
color: z.string().optional().describe("Color: '1'-'6' for Obsidian palette, or hex"),
|
|
87
|
+
}, async ({ canvasPath, type, content, x, y, width, height, color }) => {
|
|
88
|
+
try {
|
|
89
|
+
const data = await readCanvasFile(vaultPath, canvasPath);
|
|
90
|
+
const id = randomUUID();
|
|
91
|
+
const node = {
|
|
92
|
+
id,
|
|
93
|
+
type,
|
|
94
|
+
x,
|
|
95
|
+
y,
|
|
96
|
+
width,
|
|
97
|
+
height,
|
|
98
|
+
};
|
|
99
|
+
if (type === "text") {
|
|
100
|
+
node.text = content;
|
|
101
|
+
}
|
|
102
|
+
else if (type === "file") {
|
|
103
|
+
node.file = content;
|
|
104
|
+
}
|
|
105
|
+
else if (type === "link") {
|
|
106
|
+
node.url = content;
|
|
107
|
+
}
|
|
108
|
+
if (color) {
|
|
109
|
+
node.color = color;
|
|
110
|
+
}
|
|
111
|
+
data.nodes.push(node);
|
|
112
|
+
await writeCanvasFile(vaultPath, canvasPath, data);
|
|
113
|
+
return {
|
|
114
|
+
content: [{ type: "text", text: `Node added successfully.\nID: ${id}\nType: ${type}\nPosition: (${x}, ${y})` }],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
console.error("Failed to add canvas node:", err);
|
|
119
|
+
return {
|
|
120
|
+
content: [{ type: "text", text: `Error adding node: ${err.message}` }],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
server.tool("add_canvas_edge", "Add an edge (connection) between two nodes in a canvas", {
|
|
125
|
+
canvasPath: z.string().describe("Relative path to the .canvas file"),
|
|
126
|
+
fromNode: z.string().describe("Source node ID"),
|
|
127
|
+
toNode: z.string().describe("Target node ID"),
|
|
128
|
+
label: z.string().optional().describe("Edge label"),
|
|
129
|
+
fromSide: z.enum(["top", "right", "bottom", "left"]).optional().describe("Side of source node"),
|
|
130
|
+
toSide: z.enum(["top", "right", "bottom", "left"]).optional().describe("Side of target node"),
|
|
131
|
+
}, async ({ canvasPath, fromNode, toNode, label, fromSide, toSide }) => {
|
|
132
|
+
try {
|
|
133
|
+
const data = await readCanvasFile(vaultPath, canvasPath);
|
|
134
|
+
const fromExists = data.nodes.some((n) => n.id === fromNode);
|
|
135
|
+
const toExists = data.nodes.some((n) => n.id === toNode);
|
|
136
|
+
if (!fromExists) {
|
|
137
|
+
return {
|
|
138
|
+
content: [{ type: "text", text: `Error: source node '${fromNode}' not found in canvas.` }],
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (!toExists) {
|
|
142
|
+
return {
|
|
143
|
+
content: [{ type: "text", text: `Error: target node '${toNode}' not found in canvas.` }],
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const id = randomUUID();
|
|
147
|
+
const edge = {
|
|
148
|
+
id,
|
|
149
|
+
fromNode,
|
|
150
|
+
toNode,
|
|
151
|
+
};
|
|
152
|
+
if (label)
|
|
153
|
+
edge.label = label;
|
|
154
|
+
if (fromSide)
|
|
155
|
+
edge.fromSide = fromSide;
|
|
156
|
+
if (toSide)
|
|
157
|
+
edge.toSide = toSide;
|
|
158
|
+
data.edges.push(edge);
|
|
159
|
+
await writeCanvasFile(vaultPath, canvasPath, data);
|
|
160
|
+
return {
|
|
161
|
+
content: [{ type: "text", text: `Edge added successfully.\nID: ${id}\nFrom: ${fromNode} -> To: ${toNode}${label ? `\nLabel: ${label}` : ""}` }],
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
console.error("Failed to add canvas edge:", err);
|
|
166
|
+
return {
|
|
167
|
+
content: [{ type: "text", text: `Error adding edge: ${err.message}` }],
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=canvas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../src/tools/canvas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/tools/links.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiGpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAqiB5E"}
|