ocean-brain 0.6.3 → 0.7.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/dist/mcp.js +79 -24
- package/package.json +2 -1
- package/server/client/dist/assets/{Calendar-DbPut8EU.js → Calendar-B2_OJcHD.js} +1 -1
- package/server/client/dist/assets/{Callout-DfX-gIUB.js → Callout-BvXAlA5k.js} +1 -1
- package/server/client/dist/assets/{Graph-yHE9m5fy.js → Graph-DO35UCPM.js} +1 -1
- package/server/client/dist/assets/{Image.es-CtMc7BW4.js → Image.es-DLqLiGdW.js} +1 -1
- package/server/client/dist/assets/Note-AaTlS352.js +22 -0
- package/server/client/dist/assets/{Plus.es-BGVIIQtM.js → Plus.es-I7xuoJ9B.js} +1 -1
- package/server/client/dist/assets/{Reminders-CvEJf0eQ.js → Reminders-B0LJeSlu.js} +1 -1
- package/server/client/dist/assets/{Search-CKZhztuV.js → Search-xbDSlNOT.js} +1 -1
- package/server/client/dist/assets/{SurfaceCard-Bnfo5EOl.js → SurfaceCard-Brd1cMxi.js} +1 -1
- package/server/client/dist/assets/{Tag-C4oAwjs0.js → Tag-2PlhkjwY.js} +1 -1
- package/server/client/dist/assets/{TagNotes-Rl1ZSJP6.js → TagNotes-1yUBLqhX.js} +1 -1
- package/server/client/dist/assets/{Trash.es-BcwUz2yM.js → Trash.es-B-7U25B6.js} +1 -1
- package/server/client/dist/assets/{ViewNotes-B9Yc0A87.js → ViewNotes-D4X-MCTk.js} +1 -1
- package/server/client/dist/assets/{ViewSectionTableRenderer-C5yJBO7C.js → ViewSectionTableRenderer-FuqBpQts.js} +1 -1
- package/server/client/dist/assets/{Views-Bqq0pUEE.js → Views-CBEimWY8.js} +1 -1
- package/server/client/dist/assets/{image.api-CuGTgzyQ.js → image.api-BtadKO98.js} +1 -1
- package/server/client/dist/assets/{index-CDjYEIVf.css → index-BFkZTZ6v.css} +1 -1
- package/server/client/dist/assets/{index-B43ulIPo.js → index-BgnmVjeF.js} +45 -11
- package/server/client/dist/assets/{index-BQDR6hIA.js → index-sGhvnErO.js} +1 -1
- package/server/client/dist/assets/{manage-image-Bs4Kmevx.js → manage-image-B4UZ-ZQx.js} +1 -1
- package/server/client/dist/assets/{manage-image-detail-WARala-v.js → manage-image-detail-ejAh3nCL.js} +1 -1
- package/server/client/dist/assets/{mcp-C0Z3vKBa.js → mcp-aIwuouT9.js} +1 -1
- package/server/client/dist/assets/{placeholder-D080guzn.js → placeholder-B_9Hnm7h.js} +4 -4
- package/server/client/dist/assets/{properties-DbnmfbT5.js → properties-D8oLyTCD.js} +1 -1
- package/server/client/dist/assets/{trash-D5ZiZfTk.js → trash-w7Hhxckg.js} +1 -1
- package/server/client/dist/assets/{useReminderMutate-h7d_S_X2.js → useReminderMutate--RlAj_Gg.js} +1 -1
- package/server/client/dist/index.html +2 -2
- package/server/dist/features/note/graphql/note.query.resolver.js +88 -47
- package/server/dist/features/note/graphql/note.query.resolver.js.map +1 -1
- package/server/dist/features/note/graphql/note.type-defs.js +32 -0
- package/server/dist/features/note/graphql/note.type-defs.js.map +1 -1
- package/server/dist/features/note/http/mcp.js +32 -0
- package/server/dist/features/note/http/mcp.js.map +1 -1
- package/server/dist/features/note/services/markdown-intent-write.js +3 -3
- package/server/dist/features/note/services/markdown-intent-write.js.map +1 -1
- package/server/dist/features/note/services/markdown-patch.js +34 -4
- package/server/dist/features/note/services/markdown-patch.js.map +1 -1
- package/server/dist/features/note/services/snapshot.js +159 -0
- package/server/dist/features/note/services/snapshot.js.map +1 -1
- package/server/dist/modules/blocknote.js +171 -17
- package/server/dist/modules/blocknote.js.map +1 -1
- package/server/dist/routes/mcp.js +5 -0
- package/server/dist/routes/mcp.js.map +1 -1
- package/server/client/dist/assets/Note-BECn-AoI.js +0 -21
|
@@ -4,6 +4,8 @@ import models from "../models.js";
|
|
|
4
4
|
const UNSUPPORTED_MARKDOWN_BLOCK_TYPES = /* @__PURE__ */ new Set(["tableOfContents"]);
|
|
5
5
|
const TAG_PLACEHOLDER_PREFIX = "OCEAN_BRAIN_TAG_";
|
|
6
6
|
const TAG_PLACEHOLDER_SUFFIX = "_TOKEN";
|
|
7
|
+
const REFERENCE_PLACEHOLDER_PREFIX = "OCEAN_BRAIN_REFERENCE_";
|
|
8
|
+
const REFERENCE_PLACEHOLDER_SUFFIX = "_TOKEN";
|
|
7
9
|
const defaultMarkdownImportDeps = {
|
|
8
10
|
ensureTag: async (name) => ensureTagByName(name),
|
|
9
11
|
findNotesByTitle: async (title) => {
|
|
@@ -20,6 +22,23 @@ const defaultMarkdownImportDeps = {
|
|
|
20
22
|
id: String(note.id),
|
|
21
23
|
title: note.title
|
|
22
24
|
}));
|
|
25
|
+
},
|
|
26
|
+
findNoteById: async (id) => {
|
|
27
|
+
if (!isValidNoteIdString(id)) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const numericId = Number(id);
|
|
31
|
+
const note = await models.note.findUnique({
|
|
32
|
+
select: {
|
|
33
|
+
id: true,
|
|
34
|
+
title: true
|
|
35
|
+
},
|
|
36
|
+
where: { id: numericId }
|
|
37
|
+
});
|
|
38
|
+
return note ? {
|
|
39
|
+
id: String(note.id),
|
|
40
|
+
title: note.title
|
|
41
|
+
} : null;
|
|
23
42
|
}
|
|
24
43
|
};
|
|
25
44
|
function stripUnsupportedMarkdownBlocks(blocks) {
|
|
@@ -46,6 +65,16 @@ function visitBlocks(blocks, visit) {
|
|
|
46
65
|
function createTagPlaceholder(index) {
|
|
47
66
|
return `${TAG_PLACEHOLDER_PREFIX}${index}${TAG_PLACEHOLDER_SUFFIX}`;
|
|
48
67
|
}
|
|
68
|
+
function createReferencePlaceholder(index) {
|
|
69
|
+
return `${REFERENCE_PLACEHOLDER_PREFIX}${index}${REFERENCE_PLACEHOLDER_SUFFIX}`;
|
|
70
|
+
}
|
|
71
|
+
function isValidNoteIdString(id) {
|
|
72
|
+
if (!/^[1-9]\d*$/.test(id)) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
const numericId = Number(id);
|
|
76
|
+
return Number.isSafeInteger(numericId) && numericId <= MAX_SQLITE_INT_ID;
|
|
77
|
+
}
|
|
49
78
|
function isTableContent(content) {
|
|
50
79
|
return !Array.isArray(content) && content?.type === "tableContent";
|
|
51
80
|
}
|
|
@@ -114,23 +143,16 @@ function mapBlocks(blocks, mapContent) {
|
|
|
114
143
|
children: block.children?.length ? mapBlocks(block.children, mapContent) : []
|
|
115
144
|
}));
|
|
116
145
|
}
|
|
117
|
-
async function mapBlocksAsync(blocks, mapContent) {
|
|
118
|
-
return Promise.all(
|
|
119
|
-
blocks.map(async (block) => ({
|
|
120
|
-
...block,
|
|
121
|
-
content: await mapContent(block.content),
|
|
122
|
-
children: block.children?.length ? await mapBlocksAsync(block.children, mapContent) : []
|
|
123
|
-
}))
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
146
|
function preprocessCustomInlineContent(blocks, placeholderToTag, nextPlaceholderIndex) {
|
|
127
147
|
return mapBlocks(
|
|
128
148
|
blocks,
|
|
129
149
|
(content) => mapBlockContent(content, (inline) => {
|
|
130
150
|
if (inline.type === "reference") {
|
|
151
|
+
const id = String(inline.props?.id || "");
|
|
152
|
+
const title = String(inline.props?.title || inline.props?.id || "");
|
|
131
153
|
return {
|
|
132
154
|
type: "text",
|
|
133
|
-
text: `[[${
|
|
155
|
+
text: isValidNoteIdString(id) ? `[[${title}]](note:${id})` : `[[${title}]]`,
|
|
134
156
|
styles: {}
|
|
135
157
|
};
|
|
136
158
|
}
|
|
@@ -168,6 +190,57 @@ function preprocessMarkdownExplicitTags(markdown) {
|
|
|
168
190
|
placeholderToTag
|
|
169
191
|
};
|
|
170
192
|
}
|
|
193
|
+
function preprocessMarkdownExplicitReferences(markdown) {
|
|
194
|
+
const placeholderToReference = /* @__PURE__ */ new Map();
|
|
195
|
+
let activeFence = null;
|
|
196
|
+
const preprocessedLines = markdown.split(/(?<=\n)/).map((line) => {
|
|
197
|
+
const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);
|
|
198
|
+
const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);
|
|
199
|
+
if (activeFence) {
|
|
200
|
+
if (isClosingFenceLine(lineBody, activeFence)) {
|
|
201
|
+
activeFence = null;
|
|
202
|
+
}
|
|
203
|
+
return line;
|
|
204
|
+
}
|
|
205
|
+
if (fenceMatch?.[1]) {
|
|
206
|
+
activeFence = {
|
|
207
|
+
marker: fenceMatch[1][0],
|
|
208
|
+
length: fenceMatch[1].length
|
|
209
|
+
};
|
|
210
|
+
return line;
|
|
211
|
+
}
|
|
212
|
+
if (/^(?: {4,}|\t)/.test(lineBody)) {
|
|
213
|
+
return line;
|
|
214
|
+
}
|
|
215
|
+
return `${replaceMarkdownLineExplicitReferences(lineBody, placeholderToReference)}${lineEnding}`;
|
|
216
|
+
});
|
|
217
|
+
return {
|
|
218
|
+
markdown: preprocessedLines.join(""),
|
|
219
|
+
placeholderToReference
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
function replaceMarkdownLineExplicitReferences(line, placeholderToReference) {
|
|
223
|
+
let result = "";
|
|
224
|
+
let cursor = 0;
|
|
225
|
+
while (cursor < line.length) {
|
|
226
|
+
const codeSpan = findNextInlineCodeSpan(line, cursor);
|
|
227
|
+
if (!codeSpan) {
|
|
228
|
+
result += replaceExplicitReferenceTokens(line.slice(cursor), placeholderToReference);
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
result += replaceExplicitReferenceTokens(line.slice(cursor, codeSpan.start), placeholderToReference);
|
|
232
|
+
result += line.slice(codeSpan.start, codeSpan.end);
|
|
233
|
+
cursor = codeSpan.end;
|
|
234
|
+
}
|
|
235
|
+
return result;
|
|
236
|
+
}
|
|
237
|
+
function replaceExplicitReferenceTokens(text, placeholderToReference) {
|
|
238
|
+
return text.replace(/\[\[([^\]\n]+)\]\]\(note:([^)\s]+)\)/g, (token, title, id) => {
|
|
239
|
+
const placeholder = createReferencePlaceholder(placeholderToReference.size);
|
|
240
|
+
placeholderToReference.set(placeholder, { id, title, token });
|
|
241
|
+
return placeholder;
|
|
242
|
+
});
|
|
243
|
+
}
|
|
171
244
|
const MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN = /<([^<>\n]+)>/g;
|
|
172
245
|
const MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN = /(\d)~(?=\d)/g;
|
|
173
246
|
const MARKDOWN_FENCED_CODE_PATTERN = /^ {0,3}(`{3,}|~{3,})/;
|
|
@@ -177,6 +250,7 @@ const NUMERIC_TILDE_RANGE_PLACEHOLDER_PREFIX = "\uE000OBTILDE";
|
|
|
177
250
|
const NUMERIC_TILDE_RANGE_PLACEHOLDER_SUFFIX = "\uE001";
|
|
178
251
|
const HARD_BREAK_PLACEHOLDER_PREFIX = "\uE000OBHARDBREAK";
|
|
179
252
|
const HARD_BREAK_PLACEHOLDER_SUFFIX = "\uE001";
|
|
253
|
+
const MAX_SQLITE_INT_ID = 2147483647;
|
|
180
254
|
function isMarkdownAutolinkAngleBracketText(innerText) {
|
|
181
255
|
if (innerText !== innerText.trim()) {
|
|
182
256
|
return false;
|
|
@@ -522,6 +596,17 @@ function findTagPlaceholderAtCursor(text, cursor, placeholderToTag) {
|
|
|
522
596
|
}
|
|
523
597
|
return null;
|
|
524
598
|
}
|
|
599
|
+
function findReferencePlaceholderAtCursor(text, cursor, placeholderToReference) {
|
|
600
|
+
for (const [placeholder, reference] of placeholderToReference.entries()) {
|
|
601
|
+
if (text.startsWith(placeholder, cursor)) {
|
|
602
|
+
return {
|
|
603
|
+
placeholder,
|
|
604
|
+
reference
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
return null;
|
|
609
|
+
}
|
|
525
610
|
function restoreRemainingTagPlaceholders(blocks, placeholderToTag) {
|
|
526
611
|
return mapBlocks(
|
|
527
612
|
blocks,
|
|
@@ -588,9 +673,10 @@ function appendInline(target, inline) {
|
|
|
588
673
|
}
|
|
589
674
|
target.push(inline);
|
|
590
675
|
}
|
|
591
|
-
async function restoreCustomInlineContent(blocks, deps, placeholderToTag) {
|
|
676
|
+
async function restoreCustomInlineContent(blocks, deps, placeholderToTag, placeholderToReference = /* @__PURE__ */ new Map()) {
|
|
592
677
|
const tagCache = /* @__PURE__ */ new Map();
|
|
593
678
|
const noteCache = /* @__PURE__ */ new Map();
|
|
679
|
+
const noteByIdCache = /* @__PURE__ */ new Map();
|
|
594
680
|
const getTag = (token) => {
|
|
595
681
|
const normalizedToken = token.startsWith("#") ? `@${token.slice(1)}` : token;
|
|
596
682
|
let existing = tagCache.get(normalizedToken);
|
|
@@ -611,6 +697,14 @@ async function restoreCustomInlineContent(blocks, deps, placeholderToTag) {
|
|
|
611
697
|
}
|
|
612
698
|
return existing;
|
|
613
699
|
};
|
|
700
|
+
const getNoteById = (id) => {
|
|
701
|
+
let existing = noteByIdCache.get(id);
|
|
702
|
+
if (!existing) {
|
|
703
|
+
existing = deps.findNoteById ? deps.findNoteById(id) : Promise.resolve(null);
|
|
704
|
+
noteByIdCache.set(id, existing);
|
|
705
|
+
}
|
|
706
|
+
return existing;
|
|
707
|
+
};
|
|
614
708
|
const restoreTextInline = async (inline) => {
|
|
615
709
|
if (inline.type !== "text" || typeof inline.text !== "string" || !inline.text || inline.styles?.code === true) {
|
|
616
710
|
return [inline];
|
|
@@ -619,6 +713,32 @@ async function restoreCustomInlineContent(blocks, deps, placeholderToTag) {
|
|
|
619
713
|
const styles = inline.styles ?? {};
|
|
620
714
|
let cursor = 0;
|
|
621
715
|
while (cursor < inline.text.length) {
|
|
716
|
+
const referencePlaceholderMatch = findReferencePlaceholderAtCursor(
|
|
717
|
+
inline.text,
|
|
718
|
+
cursor,
|
|
719
|
+
placeholderToReference
|
|
720
|
+
);
|
|
721
|
+
if (referencePlaceholderMatch) {
|
|
722
|
+
if (!isValidNoteIdString(referencePlaceholderMatch.reference.id)) {
|
|
723
|
+
appendInline(restored, createTextInline(referencePlaceholderMatch.reference.token, styles));
|
|
724
|
+
cursor += referencePlaceholderMatch.placeholder.length;
|
|
725
|
+
continue;
|
|
726
|
+
}
|
|
727
|
+
const note = await getNoteById(referencePlaceholderMatch.reference.id);
|
|
728
|
+
if (note) {
|
|
729
|
+
appendInline(restored, {
|
|
730
|
+
type: "reference",
|
|
731
|
+
props: {
|
|
732
|
+
id: note.id,
|
|
733
|
+
title: note.title
|
|
734
|
+
}
|
|
735
|
+
});
|
|
736
|
+
} else {
|
|
737
|
+
appendInline(restored, createTextInline(referencePlaceholderMatch.reference.token, styles));
|
|
738
|
+
}
|
|
739
|
+
cursor += referencePlaceholderMatch.placeholder.length;
|
|
740
|
+
continue;
|
|
741
|
+
}
|
|
622
742
|
if (inline.text.startsWith("[[", cursor)) {
|
|
623
743
|
const closeIndex = inline.text.indexOf("]]", cursor + 2);
|
|
624
744
|
if (closeIndex !== -1) {
|
|
@@ -658,12 +778,35 @@ async function restoreCustomInlineContent(blocks, deps, placeholderToTag) {
|
|
|
658
778
|
nextCursor = Math.min(nextCursor, nextPlaceholderCursor);
|
|
659
779
|
}
|
|
660
780
|
}
|
|
781
|
+
for (const placeholder of placeholderToReference.keys()) {
|
|
782
|
+
const nextPlaceholderCursor = inline.text.indexOf(placeholder, cursor + 1);
|
|
783
|
+
if (nextPlaceholderCursor !== -1) {
|
|
784
|
+
nextCursor = Math.min(nextCursor, nextPlaceholderCursor);
|
|
785
|
+
}
|
|
786
|
+
}
|
|
661
787
|
appendInline(restored, createTextInline(inline.text.slice(cursor, nextCursor), styles));
|
|
662
788
|
cursor = nextCursor;
|
|
663
789
|
}
|
|
664
790
|
return restored;
|
|
665
791
|
};
|
|
666
|
-
|
|
792
|
+
const restoreBlocks = async (items) => {
|
|
793
|
+
return Promise.all(
|
|
794
|
+
items.map(async (block) => {
|
|
795
|
+
if (block.type === "codeBlock") {
|
|
796
|
+
return {
|
|
797
|
+
...block,
|
|
798
|
+
children: block.children?.length ? await restoreBlocks(block.children) : []
|
|
799
|
+
};
|
|
800
|
+
}
|
|
801
|
+
return {
|
|
802
|
+
...block,
|
|
803
|
+
content: await mapBlockContentAsync(block.content, restoreTextInline),
|
|
804
|
+
children: block.children?.length ? await restoreBlocks(block.children) : []
|
|
805
|
+
};
|
|
806
|
+
})
|
|
807
|
+
);
|
|
808
|
+
};
|
|
809
|
+
return restoreBlocks(blocks);
|
|
667
810
|
}
|
|
668
811
|
function collectTagIds(blocks) {
|
|
669
812
|
const tagIds = /* @__PURE__ */ new Set();
|
|
@@ -707,7 +850,8 @@ async function blocksToMarkdown(contentJson) {
|
|
|
707
850
|
async function markdownToBlocksJson(markdown, deps = defaultMarkdownImportDeps) {
|
|
708
851
|
const editor = getEditor();
|
|
709
852
|
const preprocessedMarkdown = preprocessMarkdownExplicitTags(markdown);
|
|
710
|
-
const
|
|
853
|
+
const preprocessedReferenceMarkdown = preprocessMarkdownExplicitReferences(preprocessedMarkdown.markdown);
|
|
854
|
+
const tildeProtectedMarkdown = protectMarkdownNumericTildeRanges(preprocessedReferenceMarkdown.markdown);
|
|
711
855
|
const hardBreakProtectedMarkdown = protectMarkdownLineEndHardBreakMarkers(tildeProtectedMarkdown.markdown);
|
|
712
856
|
const basePlaceholderToToken = new Map([
|
|
713
857
|
...tildeProtectedMarkdown.placeholderToToken,
|
|
@@ -718,12 +862,16 @@ async function markdownToBlocksJson(markdown, deps = defaultMarkdownImportDeps)
|
|
|
718
862
|
hardBreakProtectedMarkdown.markdown,
|
|
719
863
|
deps,
|
|
720
864
|
preprocessedMarkdown.placeholderToTag,
|
|
865
|
+
preprocessedReferenceMarkdown.placeholderToReference,
|
|
721
866
|
basePlaceholderToToken
|
|
722
867
|
);
|
|
723
|
-
if (extractLiteralAngleBracketTextTokens(
|
|
868
|
+
if (extractLiteralAngleBracketTextTokens(preprocessedReferenceMarkdown.markdown).length === 0) {
|
|
724
869
|
return contentJson;
|
|
725
870
|
}
|
|
726
|
-
if (!hasLiteralAngleBracketTextTokenLoss(
|
|
871
|
+
if (!hasLiteralAngleBracketTextTokenLoss(
|
|
872
|
+
preprocessedReferenceMarkdown.markdown,
|
|
873
|
+
await blocksToMarkdown(contentJson)
|
|
874
|
+
)) {
|
|
727
875
|
return contentJson;
|
|
728
876
|
}
|
|
729
877
|
const protectedMarkdown = protectMarkdownTextAngleBrackets(hardBreakProtectedMarkdown.markdown);
|
|
@@ -733,12 +881,18 @@ async function markdownToBlocksJson(markdown, deps = defaultMarkdownImportDeps)
|
|
|
733
881
|
protectedMarkdown.markdown,
|
|
734
882
|
deps,
|
|
735
883
|
preprocessedMarkdown.placeholderToTag,
|
|
884
|
+
preprocessedReferenceMarkdown.placeholderToReference,
|
|
736
885
|
placeholderToToken
|
|
737
886
|
);
|
|
738
887
|
}
|
|
739
|
-
async function parseMarkdownToContentJson(editor, markdown, deps, placeholderToTag, placeholderToProtectedTextToken = /* @__PURE__ */ new Map()) {
|
|
888
|
+
async function parseMarkdownToContentJson(editor, markdown, deps, placeholderToTag, placeholderToReference = /* @__PURE__ */ new Map(), placeholderToProtectedTextToken = /* @__PURE__ */ new Map()) {
|
|
740
889
|
const blocks = await editor.tryParseMarkdownToBlocks(markdown);
|
|
741
|
-
const restoredBlocks = await restoreCustomInlineContent(
|
|
890
|
+
const restoredBlocks = await restoreCustomInlineContent(
|
|
891
|
+
blocks,
|
|
892
|
+
deps,
|
|
893
|
+
placeholderToTag,
|
|
894
|
+
placeholderToReference
|
|
895
|
+
);
|
|
742
896
|
const restoredTagBlocks = restoreRemainingTagPlaceholders(restoredBlocks, placeholderToTag);
|
|
743
897
|
const restoredProtectedTextBlocks = restoreProtectedTextPlaceholders(
|
|
744
898
|
restoredTagBlocks,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/blocknote.ts"],"sourcesContent":["import { ServerBlockNoteEditor } from '@blocknote/server-util';\nimport { ensureTagByName } from '~/features/tag/services/organization.js';\nimport models from '~/models.js';\n\ninterface BlockNote {\n id?: string;\n type: string;\n props?: Record<string, unknown>;\n content?: BlockNoteContent;\n children?: BlockNote[];\n text?: string;\n styles?: Record<string, unknown>;\n}\n\ninterface BlockNoteInline {\n type: string;\n props?: Record<string, unknown>;\n text?: string;\n styles?: Record<string, unknown>;\n}\n\ninterface BlockNoteTableCell {\n type: 'tableCell';\n props?: Record<string, unknown>;\n content?: BlockNoteInline[];\n}\n\ninterface BlockNoteTableRow {\n cells?: BlockNoteTableCell[];\n}\n\ninterface BlockNoteTableContent {\n type: 'tableContent';\n columnWidths?: Array<number | null>;\n headerRows?: number;\n rows?: BlockNoteTableRow[];\n}\n\ntype BlockNoteContent = BlockNoteInline[] | BlockNoteTableContent;\n\ninterface MarkdownImportDeps {\n ensureTag: (name: string) => Promise<\n | {\n id: string;\n name: string;\n }\n | {\n tag: {\n id: string;\n name: string;\n };\n }\n >;\n findNotesByTitle: (title: string) => Promise<\n Array<{\n id: string;\n title: string;\n }>\n >;\n}\n\nconst UNSUPPORTED_MARKDOWN_BLOCK_TYPES = new Set(['tableOfContents']);\nconst TAG_PLACEHOLDER_PREFIX = 'OCEAN_BRAIN_TAG_';\nconst TAG_PLACEHOLDER_SUFFIX = '_TOKEN';\n\nconst defaultMarkdownImportDeps: MarkdownImportDeps = {\n ensureTag: async (name) => ensureTagByName(name),\n findNotesByTitle: async (title) => {\n const notes = await models.note.findMany({\n select: {\n id: true,\n title: true,\n },\n where: { title },\n orderBy: { createdAt: 'asc' },\n take: 2,\n });\n\n return notes.map((note) => ({\n id: String(note.id),\n title: note.title,\n }));\n },\n};\n\nfunction stripUnsupportedMarkdownBlocks(blocks: BlockNote[]): BlockNote[] {\n return blocks\n .filter((block) => !UNSUPPORTED_MARKDOWN_BLOCK_TYPES.has(block.type))\n .map((block) => ({\n ...block,\n children: block.children?.length ? stripUnsupportedMarkdownBlocks(block.children) : [],\n }));\n}\n\nfunction parseBlockNoteContent(contentJson: string): BlockNote[] {\n const parsed = JSON.parse(contentJson);\n\n if (!Array.isArray(parsed)) {\n throw new Error('INVALID_BLOCKNOTE_CONTENT');\n }\n\n return parsed;\n}\n\nfunction visitBlocks(blocks: BlockNote[], visit: (block: BlockNote) => void) {\n for (const block of blocks) {\n visit(block);\n\n if (block.children?.length) {\n visitBlocks(block.children, visit);\n }\n }\n}\n\nfunction createTagPlaceholder(index: number) {\n return `${TAG_PLACEHOLDER_PREFIX}${index}${TAG_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction isTableContent(content: BlockNoteContent | undefined): content is BlockNoteTableContent {\n return !Array.isArray(content) && content?.type === 'tableContent';\n}\n\nfunction mapBlockContent(\n content: BlockNoteContent | undefined,\n mapInline: (inline: BlockNoteInline) => BlockNoteInline,\n): BlockNoteContent | undefined {\n if (Array.isArray(content)) {\n return content.map(mapInline);\n }\n\n if (!isTableContent(content)) {\n return content;\n }\n\n return {\n ...content,\n rows: content.rows?.map((row) => ({\n ...row,\n cells: row.cells?.map((cell) => ({\n ...cell,\n content: cell.content?.map(mapInline),\n })),\n })),\n };\n}\n\nasync function mapBlockContentAsync(\n content: BlockNoteContent | undefined,\n mapInline: (inline: BlockNoteInline) => Promise<BlockNoteInline[]>,\n): Promise<BlockNoteContent | undefined> {\n if (Array.isArray(content)) {\n return (await Promise.all(content.map(mapInline))).flat();\n }\n\n if (!isTableContent(content)) {\n return content;\n }\n\n return {\n ...content,\n rows: await Promise.all(\n (content.rows ?? []).map(async (row) => ({\n ...row,\n cells: await Promise.all(\n (row.cells ?? []).map(async (cell) => ({\n ...cell,\n content: cell.content ? (await Promise.all(cell.content.map(mapInline))).flat() : cell.content,\n })),\n ),\n })),\n ),\n };\n}\n\nfunction visitBlockContent(content: BlockNoteContent | undefined, visitInline: (inline: BlockNoteInline) => void) {\n if (Array.isArray(content)) {\n for (const inline of content) {\n visitInline(inline);\n }\n return;\n }\n\n if (!isTableContent(content)) {\n return;\n }\n\n for (const row of content.rows ?? []) {\n for (const cell of row.cells ?? []) {\n for (const inline of cell.content ?? []) {\n visitInline(inline);\n }\n }\n }\n}\n\nfunction mapBlocks(\n blocks: BlockNote[],\n mapContent: (content: BlockNoteContent | undefined) => BlockNoteContent | undefined,\n): BlockNote[] {\n return blocks.map((block) => ({\n ...block,\n content: mapContent(block.content),\n children: block.children?.length ? mapBlocks(block.children, mapContent) : [],\n }));\n}\n\nasync function mapBlocksAsync(\n blocks: BlockNote[],\n mapContent: (content: BlockNoteContent | undefined) => Promise<BlockNoteContent | undefined>,\n): Promise<BlockNote[]> {\n return Promise.all(\n blocks.map(async (block) => ({\n ...block,\n content: await mapContent(block.content),\n children: block.children?.length ? await mapBlocksAsync(block.children, mapContent) : [],\n })),\n );\n}\n\nfunction preprocessCustomInlineContent(\n blocks: BlockNote[],\n placeholderToTag: Map<string, string>,\n nextPlaceholderIndex: { value: number },\n): BlockNote[] {\n return mapBlocks(blocks, (content) =>\n mapBlockContent(content, (inline) => {\n if (inline.type === 'reference') {\n return {\n type: 'text',\n text: `[[${inline.props?.title || inline.props?.id || ''}]]`,\n styles: {},\n };\n }\n if (inline.type === 'tag') {\n const tag = (inline.props?.tag as string) || '';\n const placeholder = createTagPlaceholder(nextPlaceholderIndex.value++);\n placeholderToTag.set(placeholder, tag);\n return {\n type: 'text',\n text: placeholder,\n styles: {},\n };\n }\n return inline;\n }),\n );\n}\n\nfunction restoreTagPlaceholdersInMarkdown(markdown: string, placeholderToTag: Map<string, string>) {\n let restoredMarkdown = markdown;\n\n for (const [placeholder, tag] of placeholderToTag.entries()) {\n restoredMarkdown = restoredMarkdown.split(placeholder).join(`[${tag}]`);\n }\n\n return restoredMarkdown;\n}\n\nfunction preprocessMarkdownExplicitTags(markdown: string) {\n const placeholderToTag = new Map<string, string>();\n let nextPlaceholderIndex = 0;\n const preprocessedMarkdown = markdown.replace(/\\[([@#][^\\s[\\]]+)\\]/g, (_match, tagToken: string) => {\n const placeholder = createTagPlaceholder(nextPlaceholderIndex++);\n placeholderToTag.set(placeholder, tagToken);\n return placeholder;\n });\n\n return {\n markdown: preprocessedMarkdown,\n placeholderToTag,\n };\n}\n\nconst MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN = /<([^<>\\n]+)>/g;\nconst MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN = /(\\d)~(?=\\d)/g;\nconst MARKDOWN_FENCED_CODE_PATTERN = /^ {0,3}(`{3,}|~{3,})/;\nconst ANGLE_BRACKET_PLACEHOLDER_PREFIX = '\\uE000OBANGLE';\nconst ANGLE_BRACKET_PLACEHOLDER_SUFFIX = '\\uE001';\nconst NUMERIC_TILDE_RANGE_PLACEHOLDER_PREFIX = '\\uE000OBTILDE';\nconst NUMERIC_TILDE_RANGE_PLACEHOLDER_SUFFIX = '\\uE001';\nconst HARD_BREAK_PLACEHOLDER_PREFIX = '\\uE000OBHARDBREAK';\nconst HARD_BREAK_PLACEHOLDER_SUFFIX = '\\uE001';\n\nfunction isMarkdownAutolinkAngleBracketText(innerText: string) {\n if (innerText !== innerText.trim()) {\n return false;\n }\n\n return /^[a-z][a-z0-9.+-]{1,31}:[^\\s<>]*$/i.test(innerText) || /^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$/.test(innerText);\n}\n\nfunction countLiteralAngleBracketTextTokens(markdown: string) {\n const tokenCounts = new Map<string, number>();\n\n for (const match of markdown.matchAll(MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN)) {\n const token = match[0];\n const innerText = match[1] ?? '';\n\n if (!token || isMarkdownAutolinkAngleBracketText(innerText)) {\n continue;\n }\n\n tokenCounts.set(token, (tokenCounts.get(token) ?? 0) + 1);\n }\n\n return tokenCounts;\n}\n\nexport function extractLiteralAngleBracketTextTokens(markdown: string) {\n return [...countLiteralAngleBracketTextTokens(markdown).keys()];\n}\n\nexport function hasLiteralAngleBracketTextTokenLoss(sourceMarkdown: string, renderedMarkdown: string) {\n const sourceCounts = countLiteralAngleBracketTextTokens(sourceMarkdown);\n\n if (sourceCounts.size === 0) {\n return false;\n }\n\n const renderedCounts = countLiteralAngleBracketTextTokens(renderedMarkdown);\n\n for (const [token, sourceCount] of sourceCounts) {\n if ((renderedCounts.get(token) ?? 0) < sourceCount) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction countNumericTildeRangeMarkers(markdown: string) {\n return [...markdown.matchAll(MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN)].length;\n}\n\nexport function hasNumericTildeRangeMarkers(markdown: string) {\n return countNumericTildeRangeMarkers(markdown) > 0;\n}\n\nexport function hasNumericTildeRangeMarkerLoss(sourceMarkdown: string, renderedMarkdown: string) {\n const sourceCount = countNumericTildeRangeMarkers(sourceMarkdown);\n\n return sourceCount > 0 && countNumericTildeRangeMarkers(renderedMarkdown) < sourceCount;\n}\n\nfunction protectMarkdownNumericTildeRanges(markdown: string) {\n const protectedLines: string[] = [];\n const placeholderToToken = new Map<string, string>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n\n for (const line of markdown.split(/(?<=\\n)/)) {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n protectedLines.push(line);\n\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n continue;\n }\n\n if (fenceMatch?.[1]) {\n const marker = fenceMatch[1][0] as '`' | '~';\n activeFence = {\n marker,\n length: fenceMatch[1].length,\n };\n protectedLines.push(line);\n continue;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n protectedLines.push(line);\n continue;\n }\n\n protectedLines.push(`${protectMarkdownLineNumericTildeRanges(lineBody, placeholderToToken)}${lineEnding}`);\n }\n\n return {\n markdown: protectedLines.join(''),\n placeholderToToken,\n };\n}\n\nfunction protectMarkdownLineEndHardBreakMarkers(markdown: string) {\n const protectedLines: string[] = [];\n const placeholderToToken = new Map<string, string>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n const lines = markdown.split(/(?<=\\n)/);\n\n for (const [index, line] of lines.entries()) {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n protectedLines.push(line);\n\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n continue;\n }\n\n if (fenceMatch?.[1]) {\n const marker = fenceMatch[1][0] as '`' | '~';\n activeFence = {\n marker,\n length: fenceMatch[1].length,\n };\n protectedLines.push(line);\n continue;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n protectedLines.push(line);\n continue;\n }\n\n const nextLineBody = splitMarkdownLineEnding(lines[index + 1] ?? '').body;\n protectedLines.push(\n `${protectMarkdownLineEndHardBreakMarker(\n lineBody,\n lineEnding,\n isMarkdownHardBreakContinuationLine(nextLineBody),\n placeholderToToken,\n )}${lineEnding}`,\n );\n }\n\n return {\n markdown: protectedLines.join(''),\n placeholderToToken,\n };\n}\n\nfunction protectMarkdownTextAngleBrackets(markdown: string) {\n const protectedLines: string[] = [];\n const placeholderToToken = new Map<string, string>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n\n for (const line of markdown.split(/(?<=\\n)/)) {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n protectedLines.push(line);\n\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n continue;\n }\n\n if (fenceMatch?.[1]) {\n const marker = fenceMatch[1][0] as '`' | '~';\n activeFence = {\n marker,\n length: fenceMatch[1].length,\n };\n protectedLines.push(line);\n continue;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n protectedLines.push(line);\n continue;\n }\n\n protectedLines.push(`${protectMarkdownLineTextAngleBrackets(lineBody, placeholderToToken)}${lineEnding}`);\n }\n\n return {\n markdown: protectedLines.join(''),\n placeholderToToken,\n };\n}\n\nfunction splitMarkdownLineEnding(line: string) {\n if (line.endsWith('\\r\\n')) {\n return {\n body: line.slice(0, -2),\n lineEnding: '\\r\\n',\n };\n }\n\n if (line.endsWith('\\n')) {\n return {\n body: line.slice(0, -1),\n lineEnding: '\\n',\n };\n }\n\n return {\n body: line,\n lineEnding: '',\n };\n}\n\nfunction isClosingFenceLine(line: string, fence: { marker: '`' | '~'; length: number }) {\n const escapedMarker = fence.marker === '`' ? '`' : '~';\n return new RegExp(`^ {0,3}${escapedMarker}{${fence.length},} *$`).test(line);\n}\n\nfunction protectMarkdownLineTextAngleBrackets(line: string, placeholderToToken: Map<string, string>) {\n let result = '';\n let cursor = 0;\n\n while (cursor < line.length) {\n const codeStart = line.indexOf('`', cursor);\n\n if (codeStart === -1) {\n result += replaceLiteralAngleBracketTextTokens(line.slice(cursor), placeholderToToken);\n break;\n }\n\n result += replaceLiteralAngleBracketTextTokens(line.slice(cursor, codeStart), placeholderToToken);\n\n const delimiterLength = countRepeatedCharacter(line, codeStart, '`');\n const codeEnd = line.indexOf('`'.repeat(delimiterLength), codeStart + delimiterLength);\n\n if (codeEnd === -1) {\n result += replaceLiteralAngleBracketTextTokens(line.slice(codeStart), placeholderToToken);\n break;\n }\n\n const codeEndExclusive = codeEnd + delimiterLength;\n result += line.slice(codeStart, codeEndExclusive);\n cursor = codeEndExclusive;\n }\n\n return result;\n}\n\nfunction protectMarkdownLineNumericTildeRanges(line: string, placeholderToToken: Map<string, string>) {\n let result = '';\n let cursor = 0;\n\n while (cursor < line.length) {\n const protectedSpan = findNextMarkdownProtectedSpan(line, cursor);\n\n if (!protectedSpan) {\n result += replaceNumericTildeRangeMarkers(line.slice(cursor), placeholderToToken);\n break;\n }\n\n result += replaceNumericTildeRangeMarkers(line.slice(cursor, protectedSpan.start), placeholderToToken);\n result += line.slice(protectedSpan.start, protectedSpan.end);\n cursor = protectedSpan.end;\n }\n\n return result;\n}\n\nfunction findNextMarkdownProtectedSpan(line: string, cursor: number) {\n const codeSpan = findNextInlineCodeSpan(line, cursor);\n const linkDestinationSpan = findNextMarkdownLinkDestinationSpan(line, cursor);\n\n if (!codeSpan) {\n return linkDestinationSpan;\n }\n\n if (!linkDestinationSpan) {\n return codeSpan;\n }\n\n return codeSpan.start <= linkDestinationSpan.start ? codeSpan : linkDestinationSpan;\n}\n\nfunction findNextInlineCodeSpan(line: string, cursor: number) {\n const codeStart = line.indexOf('`', cursor);\n\n if (codeStart === -1) {\n return null;\n }\n\n const delimiterLength = countRepeatedCharacter(line, codeStart, '`');\n const codeEnd = line.indexOf('`'.repeat(delimiterLength), codeStart + delimiterLength);\n\n if (codeEnd === -1) {\n return null;\n }\n\n return {\n start: codeStart,\n end: codeEnd + delimiterLength,\n };\n}\n\nfunction findNextMarkdownLinkDestinationSpan(line: string, cursor: number) {\n const linkDestinationPrefix = line.indexOf('](', cursor);\n\n if (linkDestinationPrefix === -1) {\n return null;\n }\n\n const destinationStart = linkDestinationPrefix + 2;\n const destinationEnd = line.indexOf(')', destinationStart);\n\n if (destinationEnd === -1) {\n return null;\n }\n\n return {\n start: destinationStart,\n end: destinationEnd,\n };\n}\n\nfunction replaceLiteralAngleBracketTextTokens(text: string, placeholderToToken: Map<string, string>) {\n return text.replace(MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN, (match, innerText: string) => {\n if (isMarkdownAutolinkAngleBracketText(innerText)) {\n return match;\n }\n\n const placeholder = createAngleBracketPlaceholder(placeholderToToken.size);\n placeholderToToken.set(placeholder, match);\n\n return placeholder;\n });\n}\n\nfunction replaceNumericTildeRangeMarkers(text: string, placeholderToToken: Map<string, string>) {\n return text.replace(MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN, (match, leadingDigit: string) => {\n const placeholder = createNumericTildeRangePlaceholder(placeholderToToken.size);\n placeholderToToken.set(placeholder, '~');\n\n return `${leadingDigit}${placeholder}`;\n });\n}\n\nfunction protectMarkdownLineEndHardBreakMarker(\n line: string,\n lineEnding: string,\n hasContinuationLine: boolean,\n placeholderToToken: Map<string, string>,\n) {\n if (!lineEnding || !line.endsWith('\\\\')) {\n return line;\n }\n\n const placeholder = createHardBreakPlaceholder(placeholderToToken.size);\n const shouldPreserveAsHardBreak = hasContinuationLine && !hasUnclosedInlineCodeSpanAtLineEnd(line);\n placeholderToToken.set(placeholder, shouldPreserveAsHardBreak ? '' : '\\\\');\n\n return `${line.slice(0, -1)}${placeholder}`;\n}\n\nfunction isMarkdownHardBreakContinuationLine(line: string) {\n if (!line.trim()) {\n return false;\n }\n\n const trimmedLine = line.trimStart();\n\n if (trimmedLine.match(MARKDOWN_FENCED_CODE_PATTERN)) {\n return false;\n }\n\n if (/^(?:#{1,6})(?:\\s|$)/.test(trimmedLine)) {\n return false;\n }\n\n if (/^>/.test(trimmedLine)) {\n return false;\n }\n\n if (/^(?:[-+*])(?:\\s|$)/.test(trimmedLine) || /^\\d{1,9}[.)](?:\\s|$)/.test(trimmedLine)) {\n return false;\n }\n\n if (/^(?:-{3,}|\\*{3,}|_{3,})\\s*$/.test(trimmedLine)) {\n return false;\n }\n\n return true;\n}\n\nfunction hasUnclosedInlineCodeSpanAtLineEnd(line: string) {\n let cursor = 0;\n let openDelimiter: string | null = null;\n\n while (cursor < line.length) {\n const codeStart = line.indexOf('`', cursor);\n\n if (codeStart === -1) {\n break;\n }\n\n const delimiterLength = countRepeatedCharacter(line, codeStart, '`');\n const delimiter = '`'.repeat(delimiterLength);\n openDelimiter = openDelimiter === delimiter ? null : delimiter;\n cursor = codeStart + delimiterLength;\n }\n\n return openDelimiter !== null;\n}\n\nfunction createAngleBracketPlaceholder(index: number) {\n return `${ANGLE_BRACKET_PLACEHOLDER_PREFIX}${index}${ANGLE_BRACKET_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction createNumericTildeRangePlaceholder(index: number) {\n return `${NUMERIC_TILDE_RANGE_PLACEHOLDER_PREFIX}${index}${NUMERIC_TILDE_RANGE_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction createHardBreakPlaceholder(index: number) {\n return `${HARD_BREAK_PLACEHOLDER_PREFIX}${index}${HARD_BREAK_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction countRepeatedCharacter(value: string, start: number, character: string) {\n let cursor = start;\n\n while (value[cursor] === character) {\n cursor += 1;\n }\n\n return cursor - start;\n}\n\nfunction findTagPlaceholderAtCursor(text: string, cursor: number, placeholderToTag: Map<string, string>) {\n for (const [placeholder, tagToken] of placeholderToTag.entries()) {\n if (text.startsWith(placeholder, cursor)) {\n return {\n placeholder,\n tagToken,\n };\n }\n }\n\n return null;\n}\n\nfunction restoreRemainingTagPlaceholders(blocks: BlockNote[], placeholderToTag: Map<string, string>): BlockNote[] {\n return mapBlocks(blocks, (content) =>\n mapBlockContent(content, (inline) => {\n if (inline.type !== 'text' || typeof inline.text !== 'string') {\n return inline;\n }\n\n let text = inline.text;\n\n for (const [placeholder, tagToken] of placeholderToTag.entries()) {\n text = text.split(placeholder).join(`[${tagToken}]`);\n }\n\n return {\n ...inline,\n text,\n };\n }),\n );\n}\n\nfunction restoreProtectedTextPlaceholders(blocks: BlockNote[], placeholderToToken: Map<string, string>): BlockNote[] {\n if (placeholderToToken.size === 0) {\n return blocks;\n }\n\n return mapBlocks(blocks, (content) =>\n mapBlockContent(\n content,\n (inline) => restoreProtectedTextInValue(inline, placeholderToToken) as BlockNoteInline,\n ),\n );\n}\n\nfunction restoreProtectedTextInValue(value: unknown, placeholderToToken: Map<string, string>): unknown {\n if (typeof value === 'string') {\n return restoreProtectedText(value, placeholderToToken);\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => restoreProtectedTextInValue(item, placeholderToToken));\n }\n\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, restoreProtectedTextInValue(item, placeholderToToken)]),\n );\n }\n\n return value;\n}\n\nfunction restoreProtectedText(text: string, placeholderToToken: Map<string, string>) {\n let restoredText = text;\n\n for (const [placeholder, token] of placeholderToToken.entries()) {\n restoredText = restoredText.split(placeholder).join(token);\n }\n\n return restoredText;\n}\n\nfunction createTextInline(text: string, styles: Record<string, unknown> = {}): BlockNoteInline {\n return {\n type: 'text',\n text,\n styles,\n };\n}\n\nfunction appendInline(target: BlockNoteInline[], inline: BlockNoteInline) {\n const previous = target.at(-1);\n\n if (\n previous?.type === 'text' &&\n inline.type === 'text' &&\n previous.text !== undefined &&\n inline.text !== undefined &&\n JSON.stringify(previous.styles ?? {}) === JSON.stringify(inline.styles ?? {})\n ) {\n previous.text += inline.text;\n return;\n }\n\n target.push(inline);\n}\n\nasync function restoreCustomInlineContent(\n blocks: BlockNote[],\n deps: MarkdownImportDeps,\n placeholderToTag: Map<string, string>,\n): Promise<BlockNote[]> {\n const tagCache = new Map<string, Promise<{ id: string; tag: string }>>();\n const noteCache = new Map<string, Promise<Array<{ id: string; title: string }>>>();\n\n const getTag = (token: string) => {\n const normalizedToken = token.startsWith('#') ? `@${token.slice(1)}` : token;\n let existing = tagCache.get(normalizedToken);\n\n if (!existing) {\n existing = deps.ensureTag(normalizedToken.slice(1)).then((result) => ({\n id: 'tag' in result ? result.tag.id : result.id,\n tag: 'tag' in result ? result.tag.name : result.name,\n }));\n tagCache.set(normalizedToken, existing);\n }\n\n return existing;\n };\n\n const getNotesByTitle = (title: string) => {\n let existing = noteCache.get(title);\n\n if (!existing) {\n existing = deps.findNotesByTitle(title);\n noteCache.set(title, existing);\n }\n\n return existing;\n };\n\n const restoreTextInline = async (inline: BlockNoteInline): Promise<BlockNoteInline[]> => {\n if (inline.type !== 'text' || typeof inline.text !== 'string' || !inline.text || inline.styles?.code === true) {\n return [inline];\n }\n\n const restored: BlockNoteInline[] = [];\n const styles = inline.styles ?? {};\n let cursor = 0;\n\n while (cursor < inline.text.length) {\n if (inline.text.startsWith('[[', cursor)) {\n const closeIndex = inline.text.indexOf(']]', cursor + 2);\n\n if (closeIndex !== -1) {\n const title = inline.text.slice(cursor + 2, closeIndex);\n const matchingNotes = await getNotesByTitle(title);\n\n if (matchingNotes.length === 1) {\n appendInline(restored, {\n type: 'reference',\n props: {\n id: matchingNotes[0].id,\n title: matchingNotes[0].title,\n },\n });\n cursor = closeIndex + 2;\n continue;\n }\n }\n }\n\n const tagPlaceholderMatch = findTagPlaceholderAtCursor(inline.text, cursor, placeholderToTag);\n\n if (tagPlaceholderMatch) {\n const tag = await getTag(tagPlaceholderMatch.tagToken);\n appendInline(restored, {\n type: 'tag',\n props: tag,\n });\n cursor += tagPlaceholderMatch.placeholder.length;\n continue;\n }\n\n let nextCursor = inline.text.length;\n\n const nextReferenceCursor = inline.text.indexOf('[[', cursor + 1);\n\n if (nextReferenceCursor !== -1) {\n nextCursor = Math.min(nextCursor, nextReferenceCursor);\n }\n\n for (const placeholder of placeholderToTag.keys()) {\n const nextPlaceholderCursor = inline.text.indexOf(placeholder, cursor + 1);\n\n if (nextPlaceholderCursor !== -1) {\n nextCursor = Math.min(nextCursor, nextPlaceholderCursor);\n }\n }\n\n appendInline(restored, createTextInline(inline.text.slice(cursor, nextCursor), styles));\n cursor = nextCursor;\n }\n\n return restored;\n };\n\n return mapBlocksAsync(blocks, (content) => mapBlockContentAsync(content, restoreTextInline));\n}\n\nfunction collectTagIds(blocks: BlockNote[]): string[] {\n const tagIds = new Set<string>();\n\n const visit = (items: BlockNote[]) => {\n for (const block of items) {\n visitBlockContent(block.content, (inline) => {\n if (inline.type === 'tag' && typeof inline.props?.id === 'string') {\n tagIds.add(inline.props.id);\n }\n });\n\n if (block.children?.length) {\n visit(block.children);\n }\n }\n };\n\n visit(blocks);\n return [...tagIds];\n}\n\nlet editorInstance: ServerBlockNoteEditor | null = null;\n\nfunction getEditor(): ServerBlockNoteEditor {\n if (!editorInstance) {\n editorInstance = ServerBlockNoteEditor.create();\n }\n return editorInstance;\n}\n\nexport async function blocksToMarkdown(contentJson: string): Promise<string> {\n try {\n const blocks = parseBlockNoteContent(contentJson);\n const supportedBlocks = stripUnsupportedMarkdownBlocks(blocks);\n const placeholderToTag = new Map<string, string>();\n const processed = preprocessCustomInlineContent(supportedBlocks, placeholderToTag, { value: 0 });\n const editor = getEditor();\n const markdown = await editor.blocksToMarkdownLossy(\n processed as Parameters<typeof editor.blocksToMarkdownLossy>[0],\n );\n return restoreTagPlaceholdersInMarkdown(markdown, placeholderToTag);\n } catch {\n return '';\n }\n}\n\nexport async function markdownToBlocksJson(\n markdown: string,\n deps: MarkdownImportDeps = defaultMarkdownImportDeps,\n): Promise<string> {\n const editor = getEditor();\n const preprocessedMarkdown = preprocessMarkdownExplicitTags(markdown);\n const tildeProtectedMarkdown = protectMarkdownNumericTildeRanges(preprocessedMarkdown.markdown);\n const hardBreakProtectedMarkdown = protectMarkdownLineEndHardBreakMarkers(tildeProtectedMarkdown.markdown);\n const basePlaceholderToToken = new Map([\n ...tildeProtectedMarkdown.placeholderToToken,\n ...hardBreakProtectedMarkdown.placeholderToToken,\n ]);\n const contentJson = await parseMarkdownToContentJson(\n editor,\n hardBreakProtectedMarkdown.markdown,\n deps,\n preprocessedMarkdown.placeholderToTag,\n basePlaceholderToToken,\n );\n\n if (extractLiteralAngleBracketTextTokens(preprocessedMarkdown.markdown).length === 0) {\n return contentJson;\n }\n\n if (!hasLiteralAngleBracketTextTokenLoss(preprocessedMarkdown.markdown, await blocksToMarkdown(contentJson))) {\n return contentJson;\n }\n\n const protectedMarkdown = protectMarkdownTextAngleBrackets(hardBreakProtectedMarkdown.markdown);\n const placeholderToToken = new Map([...basePlaceholderToToken, ...protectedMarkdown.placeholderToToken]);\n\n return parseMarkdownToContentJson(\n editor,\n protectedMarkdown.markdown,\n deps,\n preprocessedMarkdown.placeholderToTag,\n placeholderToToken,\n );\n}\n\nasync function parseMarkdownToContentJson(\n editor: ServerBlockNoteEditor,\n markdown: string,\n deps: MarkdownImportDeps,\n placeholderToTag: Map<string, string>,\n placeholderToProtectedTextToken: Map<string, string> = new Map(),\n) {\n const blocks = await editor.tryParseMarkdownToBlocks(markdown);\n const restoredBlocks = await restoreCustomInlineContent(blocks as BlockNote[], deps, placeholderToTag);\n const restoredTagBlocks = restoreRemainingTagPlaceholders(restoredBlocks, placeholderToTag);\n const restoredProtectedTextBlocks = restoreProtectedTextPlaceholders(\n restoredTagBlocks,\n placeholderToProtectedTextToken,\n );\n\n return JSON.stringify(restoredProtectedTextBlocks);\n}\n\nexport function extractTagIdsFromContentJson(contentJson: string): string[] {\n const blocks = parseBlockNoteContent(contentJson);\n return collectTagIds(blocks);\n}\n\nexport function hasUnsupportedMarkdownBlocks(contentJson: string): boolean {\n try {\n let hasUnsupportedBlock = false;\n visitBlocks(parseBlockNoteContent(contentJson), (block) => {\n if (UNSUPPORTED_MARKDOWN_BLOCK_TYPES.has(block.type)) {\n hasUnsupportedBlock = true;\n }\n });\n\n return hasUnsupportedBlock;\n } catch {\n return false;\n }\n}\n\nexport function countReferenceInlinesFromContentJson(contentJson: string): number {\n try {\n let count = 0;\n visitBlocks(parseBlockNoteContent(contentJson), (block) => {\n visitBlockContent(block.content, (inline) => {\n if (inline.type === 'reference') {\n count += 1;\n }\n });\n });\n\n return count;\n } catch {\n return 0;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/modules/blocknote.ts"],"sourcesContent":["import { ServerBlockNoteEditor } from '@blocknote/server-util';\nimport { ensureTagByName } from '~/features/tag/services/organization.js';\nimport models from '~/models.js';\n\ninterface BlockNote {\n id?: string;\n type: string;\n props?: Record<string, unknown>;\n content?: BlockNoteContent;\n children?: BlockNote[];\n text?: string;\n styles?: Record<string, unknown>;\n}\n\ninterface BlockNoteInline {\n type: string;\n props?: Record<string, unknown>;\n text?: string;\n styles?: Record<string, unknown>;\n}\n\ninterface BlockNoteTableCell {\n type: 'tableCell';\n props?: Record<string, unknown>;\n content?: BlockNoteInline[];\n}\n\ninterface BlockNoteTableRow {\n cells?: BlockNoteTableCell[];\n}\n\ninterface BlockNoteTableContent {\n type: 'tableContent';\n columnWidths?: Array<number | null>;\n headerRows?: number;\n rows?: BlockNoteTableRow[];\n}\n\ntype BlockNoteContent = BlockNoteInline[] | BlockNoteTableContent;\n\ninterface MarkdownImportDeps {\n ensureTag: (name: string) => Promise<\n | {\n id: string;\n name: string;\n }\n | {\n tag: {\n id: string;\n name: string;\n };\n }\n >;\n findNotesByTitle: (title: string) => Promise<\n Array<{\n id: string;\n title: string;\n }>\n >;\n findNoteById?: (id: string) => Promise<{\n id: string;\n title: string;\n } | null>;\n}\n\nconst UNSUPPORTED_MARKDOWN_BLOCK_TYPES = new Set(['tableOfContents']);\nconst TAG_PLACEHOLDER_PREFIX = 'OCEAN_BRAIN_TAG_';\nconst TAG_PLACEHOLDER_SUFFIX = '_TOKEN';\nconst REFERENCE_PLACEHOLDER_PREFIX = 'OCEAN_BRAIN_REFERENCE_';\nconst REFERENCE_PLACEHOLDER_SUFFIX = '_TOKEN';\n\nconst defaultMarkdownImportDeps: MarkdownImportDeps = {\n ensureTag: async (name) => ensureTagByName(name),\n findNotesByTitle: async (title) => {\n const notes = await models.note.findMany({\n select: {\n id: true,\n title: true,\n },\n where: { title },\n orderBy: { createdAt: 'asc' },\n take: 2,\n });\n\n return notes.map((note) => ({\n id: String(note.id),\n title: note.title,\n }));\n },\n findNoteById: async (id) => {\n if (!isValidNoteIdString(id)) {\n return null;\n }\n\n const numericId = Number(id);\n\n const note = await models.note.findUnique({\n select: {\n id: true,\n title: true,\n },\n where: { id: numericId },\n });\n\n return note\n ? {\n id: String(note.id),\n title: note.title,\n }\n : null;\n },\n};\n\nfunction stripUnsupportedMarkdownBlocks(blocks: BlockNote[]): BlockNote[] {\n return blocks\n .filter((block) => !UNSUPPORTED_MARKDOWN_BLOCK_TYPES.has(block.type))\n .map((block) => ({\n ...block,\n children: block.children?.length ? stripUnsupportedMarkdownBlocks(block.children) : [],\n }));\n}\n\nfunction parseBlockNoteContent(contentJson: string): BlockNote[] {\n const parsed = JSON.parse(contentJson);\n\n if (!Array.isArray(parsed)) {\n throw new Error('INVALID_BLOCKNOTE_CONTENT');\n }\n\n return parsed;\n}\n\nfunction visitBlocks(blocks: BlockNote[], visit: (block: BlockNote) => void) {\n for (const block of blocks) {\n visit(block);\n\n if (block.children?.length) {\n visitBlocks(block.children, visit);\n }\n }\n}\n\nfunction createTagPlaceholder(index: number) {\n return `${TAG_PLACEHOLDER_PREFIX}${index}${TAG_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction createReferencePlaceholder(index: number) {\n return `${REFERENCE_PLACEHOLDER_PREFIX}${index}${REFERENCE_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction isValidNoteIdString(id: string) {\n if (!/^[1-9]\\d*$/.test(id)) {\n return false;\n }\n\n const numericId = Number(id);\n\n return Number.isSafeInteger(numericId) && numericId <= MAX_SQLITE_INT_ID;\n}\n\nfunction isTableContent(content: BlockNoteContent | undefined): content is BlockNoteTableContent {\n return !Array.isArray(content) && content?.type === 'tableContent';\n}\n\nfunction mapBlockContent(\n content: BlockNoteContent | undefined,\n mapInline: (inline: BlockNoteInline) => BlockNoteInline,\n): BlockNoteContent | undefined {\n if (Array.isArray(content)) {\n return content.map(mapInline);\n }\n\n if (!isTableContent(content)) {\n return content;\n }\n\n return {\n ...content,\n rows: content.rows?.map((row) => ({\n ...row,\n cells: row.cells?.map((cell) => ({\n ...cell,\n content: cell.content?.map(mapInline),\n })),\n })),\n };\n}\n\nasync function mapBlockContentAsync(\n content: BlockNoteContent | undefined,\n mapInline: (inline: BlockNoteInline) => Promise<BlockNoteInline[]>,\n): Promise<BlockNoteContent | undefined> {\n if (Array.isArray(content)) {\n return (await Promise.all(content.map(mapInline))).flat();\n }\n\n if (!isTableContent(content)) {\n return content;\n }\n\n return {\n ...content,\n rows: await Promise.all(\n (content.rows ?? []).map(async (row) => ({\n ...row,\n cells: await Promise.all(\n (row.cells ?? []).map(async (cell) => ({\n ...cell,\n content: cell.content ? (await Promise.all(cell.content.map(mapInline))).flat() : cell.content,\n })),\n ),\n })),\n ),\n };\n}\n\nfunction visitBlockContent(content: BlockNoteContent | undefined, visitInline: (inline: BlockNoteInline) => void) {\n if (Array.isArray(content)) {\n for (const inline of content) {\n visitInline(inline);\n }\n return;\n }\n\n if (!isTableContent(content)) {\n return;\n }\n\n for (const row of content.rows ?? []) {\n for (const cell of row.cells ?? []) {\n for (const inline of cell.content ?? []) {\n visitInline(inline);\n }\n }\n }\n}\n\nfunction mapBlocks(\n blocks: BlockNote[],\n mapContent: (content: BlockNoteContent | undefined) => BlockNoteContent | undefined,\n): BlockNote[] {\n return blocks.map((block) => ({\n ...block,\n content: mapContent(block.content),\n children: block.children?.length ? mapBlocks(block.children, mapContent) : [],\n }));\n}\n\nfunction preprocessCustomInlineContent(\n blocks: BlockNote[],\n placeholderToTag: Map<string, string>,\n nextPlaceholderIndex: { value: number },\n): BlockNote[] {\n return mapBlocks(blocks, (content) =>\n mapBlockContent(content, (inline) => {\n if (inline.type === 'reference') {\n const id = String(inline.props?.id || '');\n const title = String(inline.props?.title || inline.props?.id || '');\n\n return {\n type: 'text',\n text: isValidNoteIdString(id) ? `[[${title}]](note:${id})` : `[[${title}]]`,\n styles: {},\n };\n }\n if (inline.type === 'tag') {\n const tag = (inline.props?.tag as string) || '';\n const placeholder = createTagPlaceholder(nextPlaceholderIndex.value++);\n placeholderToTag.set(placeholder, tag);\n return {\n type: 'text',\n text: placeholder,\n styles: {},\n };\n }\n return inline;\n }),\n );\n}\n\nfunction restoreTagPlaceholdersInMarkdown(markdown: string, placeholderToTag: Map<string, string>) {\n let restoredMarkdown = markdown;\n\n for (const [placeholder, tag] of placeholderToTag.entries()) {\n restoredMarkdown = restoredMarkdown.split(placeholder).join(`[${tag}]`);\n }\n\n return restoredMarkdown;\n}\n\nfunction preprocessMarkdownExplicitTags(markdown: string) {\n const placeholderToTag = new Map<string, string>();\n let nextPlaceholderIndex = 0;\n const preprocessedMarkdown = markdown.replace(/\\[([@#][^\\s[\\]]+)\\]/g, (_match, tagToken: string) => {\n const placeholder = createTagPlaceholder(nextPlaceholderIndex++);\n placeholderToTag.set(placeholder, tagToken);\n return placeholder;\n });\n\n return {\n markdown: preprocessedMarkdown,\n placeholderToTag,\n };\n}\n\nfunction preprocessMarkdownExplicitReferences(markdown: string) {\n const placeholderToReference = new Map<string, { id: string; title: string; token: string }>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n\n const preprocessedLines = markdown.split(/(?<=\\n)/).map((line) => {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n return line;\n }\n\n if (fenceMatch?.[1]) {\n activeFence = {\n marker: fenceMatch[1][0] as '`' | '~',\n length: fenceMatch[1].length,\n };\n return line;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n return line;\n }\n\n return `${replaceMarkdownLineExplicitReferences(lineBody, placeholderToReference)}${lineEnding}`;\n });\n\n return {\n markdown: preprocessedLines.join(''),\n placeholderToReference,\n };\n}\n\nfunction replaceMarkdownLineExplicitReferences(\n line: string,\n placeholderToReference: Map<string, { id: string; title: string; token: string }>,\n) {\n let result = '';\n let cursor = 0;\n\n while (cursor < line.length) {\n const codeSpan = findNextInlineCodeSpan(line, cursor);\n\n if (!codeSpan) {\n result += replaceExplicitReferenceTokens(line.slice(cursor), placeholderToReference);\n break;\n }\n\n result += replaceExplicitReferenceTokens(line.slice(cursor, codeSpan.start), placeholderToReference);\n result += line.slice(codeSpan.start, codeSpan.end);\n cursor = codeSpan.end;\n }\n\n return result;\n}\n\nfunction replaceExplicitReferenceTokens(\n text: string,\n placeholderToReference: Map<string, { id: string; title: string; token: string }>,\n) {\n return text.replace(/\\[\\[([^\\]\\n]+)\\]\\]\\(note:([^)\\s]+)\\)/g, (token, title: string, id: string) => {\n const placeholder = createReferencePlaceholder(placeholderToReference.size);\n placeholderToReference.set(placeholder, { id, title, token });\n return placeholder;\n });\n}\n\nconst MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN = /<([^<>\\n]+)>/g;\nconst MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN = /(\\d)~(?=\\d)/g;\nconst MARKDOWN_FENCED_CODE_PATTERN = /^ {0,3}(`{3,}|~{3,})/;\nconst ANGLE_BRACKET_PLACEHOLDER_PREFIX = '\\uE000OBANGLE';\nconst ANGLE_BRACKET_PLACEHOLDER_SUFFIX = '\\uE001';\nconst NUMERIC_TILDE_RANGE_PLACEHOLDER_PREFIX = '\\uE000OBTILDE';\nconst NUMERIC_TILDE_RANGE_PLACEHOLDER_SUFFIX = '\\uE001';\nconst HARD_BREAK_PLACEHOLDER_PREFIX = '\\uE000OBHARDBREAK';\nconst HARD_BREAK_PLACEHOLDER_SUFFIX = '\\uE001';\nconst MAX_SQLITE_INT_ID = 2_147_483_647;\n\nfunction isMarkdownAutolinkAngleBracketText(innerText: string) {\n if (innerText !== innerText.trim()) {\n return false;\n }\n\n return /^[a-z][a-z0-9.+-]{1,31}:[^\\s<>]*$/i.test(innerText) || /^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$/.test(innerText);\n}\n\nfunction countLiteralAngleBracketTextTokens(markdown: string) {\n const tokenCounts = new Map<string, number>();\n\n for (const match of markdown.matchAll(MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN)) {\n const token = match[0];\n const innerText = match[1] ?? '';\n\n if (!token || isMarkdownAutolinkAngleBracketText(innerText)) {\n continue;\n }\n\n tokenCounts.set(token, (tokenCounts.get(token) ?? 0) + 1);\n }\n\n return tokenCounts;\n}\n\nexport function extractLiteralAngleBracketTextTokens(markdown: string) {\n return [...countLiteralAngleBracketTextTokens(markdown).keys()];\n}\n\nexport function hasLiteralAngleBracketTextTokenLoss(sourceMarkdown: string, renderedMarkdown: string) {\n const sourceCounts = countLiteralAngleBracketTextTokens(sourceMarkdown);\n\n if (sourceCounts.size === 0) {\n return false;\n }\n\n const renderedCounts = countLiteralAngleBracketTextTokens(renderedMarkdown);\n\n for (const [token, sourceCount] of sourceCounts) {\n if ((renderedCounts.get(token) ?? 0) < sourceCount) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction countNumericTildeRangeMarkers(markdown: string) {\n return [...markdown.matchAll(MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN)].length;\n}\n\nexport function hasNumericTildeRangeMarkers(markdown: string) {\n return countNumericTildeRangeMarkers(markdown) > 0;\n}\n\nexport function hasNumericTildeRangeMarkerLoss(sourceMarkdown: string, renderedMarkdown: string) {\n const sourceCount = countNumericTildeRangeMarkers(sourceMarkdown);\n\n return sourceCount > 0 && countNumericTildeRangeMarkers(renderedMarkdown) < sourceCount;\n}\n\nfunction protectMarkdownNumericTildeRanges(markdown: string) {\n const protectedLines: string[] = [];\n const placeholderToToken = new Map<string, string>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n\n for (const line of markdown.split(/(?<=\\n)/)) {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n protectedLines.push(line);\n\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n continue;\n }\n\n if (fenceMatch?.[1]) {\n const marker = fenceMatch[1][0] as '`' | '~';\n activeFence = {\n marker,\n length: fenceMatch[1].length,\n };\n protectedLines.push(line);\n continue;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n protectedLines.push(line);\n continue;\n }\n\n protectedLines.push(`${protectMarkdownLineNumericTildeRanges(lineBody, placeholderToToken)}${lineEnding}`);\n }\n\n return {\n markdown: protectedLines.join(''),\n placeholderToToken,\n };\n}\n\nfunction protectMarkdownLineEndHardBreakMarkers(markdown: string) {\n const protectedLines: string[] = [];\n const placeholderToToken = new Map<string, string>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n const lines = markdown.split(/(?<=\\n)/);\n\n for (const [index, line] of lines.entries()) {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n protectedLines.push(line);\n\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n continue;\n }\n\n if (fenceMatch?.[1]) {\n const marker = fenceMatch[1][0] as '`' | '~';\n activeFence = {\n marker,\n length: fenceMatch[1].length,\n };\n protectedLines.push(line);\n continue;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n protectedLines.push(line);\n continue;\n }\n\n const nextLineBody = splitMarkdownLineEnding(lines[index + 1] ?? '').body;\n protectedLines.push(\n `${protectMarkdownLineEndHardBreakMarker(\n lineBody,\n lineEnding,\n isMarkdownHardBreakContinuationLine(nextLineBody),\n placeholderToToken,\n )}${lineEnding}`,\n );\n }\n\n return {\n markdown: protectedLines.join(''),\n placeholderToToken,\n };\n}\n\nfunction protectMarkdownTextAngleBrackets(markdown: string) {\n const protectedLines: string[] = [];\n const placeholderToToken = new Map<string, string>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n\n for (const line of markdown.split(/(?<=\\n)/)) {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n protectedLines.push(line);\n\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n continue;\n }\n\n if (fenceMatch?.[1]) {\n const marker = fenceMatch[1][0] as '`' | '~';\n activeFence = {\n marker,\n length: fenceMatch[1].length,\n };\n protectedLines.push(line);\n continue;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n protectedLines.push(line);\n continue;\n }\n\n protectedLines.push(`${protectMarkdownLineTextAngleBrackets(lineBody, placeholderToToken)}${lineEnding}`);\n }\n\n return {\n markdown: protectedLines.join(''),\n placeholderToToken,\n };\n}\n\nfunction splitMarkdownLineEnding(line: string) {\n if (line.endsWith('\\r\\n')) {\n return {\n body: line.slice(0, -2),\n lineEnding: '\\r\\n',\n };\n }\n\n if (line.endsWith('\\n')) {\n return {\n body: line.slice(0, -1),\n lineEnding: '\\n',\n };\n }\n\n return {\n body: line,\n lineEnding: '',\n };\n}\n\nfunction isClosingFenceLine(line: string, fence: { marker: '`' | '~'; length: number }) {\n const escapedMarker = fence.marker === '`' ? '`' : '~';\n return new RegExp(`^ {0,3}${escapedMarker}{${fence.length},} *$`).test(line);\n}\n\nfunction protectMarkdownLineTextAngleBrackets(line: string, placeholderToToken: Map<string, string>) {\n let result = '';\n let cursor = 0;\n\n while (cursor < line.length) {\n const codeStart = line.indexOf('`', cursor);\n\n if (codeStart === -1) {\n result += replaceLiteralAngleBracketTextTokens(line.slice(cursor), placeholderToToken);\n break;\n }\n\n result += replaceLiteralAngleBracketTextTokens(line.slice(cursor, codeStart), placeholderToToken);\n\n const delimiterLength = countRepeatedCharacter(line, codeStart, '`');\n const codeEnd = line.indexOf('`'.repeat(delimiterLength), codeStart + delimiterLength);\n\n if (codeEnd === -1) {\n result += replaceLiteralAngleBracketTextTokens(line.slice(codeStart), placeholderToToken);\n break;\n }\n\n const codeEndExclusive = codeEnd + delimiterLength;\n result += line.slice(codeStart, codeEndExclusive);\n cursor = codeEndExclusive;\n }\n\n return result;\n}\n\nfunction protectMarkdownLineNumericTildeRanges(line: string, placeholderToToken: Map<string, string>) {\n let result = '';\n let cursor = 0;\n\n while (cursor < line.length) {\n const protectedSpan = findNextMarkdownProtectedSpan(line, cursor);\n\n if (!protectedSpan) {\n result += replaceNumericTildeRangeMarkers(line.slice(cursor), placeholderToToken);\n break;\n }\n\n result += replaceNumericTildeRangeMarkers(line.slice(cursor, protectedSpan.start), placeholderToToken);\n result += line.slice(protectedSpan.start, protectedSpan.end);\n cursor = protectedSpan.end;\n }\n\n return result;\n}\n\nfunction findNextMarkdownProtectedSpan(line: string, cursor: number) {\n const codeSpan = findNextInlineCodeSpan(line, cursor);\n const linkDestinationSpan = findNextMarkdownLinkDestinationSpan(line, cursor);\n\n if (!codeSpan) {\n return linkDestinationSpan;\n }\n\n if (!linkDestinationSpan) {\n return codeSpan;\n }\n\n return codeSpan.start <= linkDestinationSpan.start ? codeSpan : linkDestinationSpan;\n}\n\nfunction findNextInlineCodeSpan(line: string, cursor: number) {\n const codeStart = line.indexOf('`', cursor);\n\n if (codeStart === -1) {\n return null;\n }\n\n const delimiterLength = countRepeatedCharacter(line, codeStart, '`');\n const codeEnd = line.indexOf('`'.repeat(delimiterLength), codeStart + delimiterLength);\n\n if (codeEnd === -1) {\n return null;\n }\n\n return {\n start: codeStart,\n end: codeEnd + delimiterLength,\n };\n}\n\nfunction findNextMarkdownLinkDestinationSpan(line: string, cursor: number) {\n const linkDestinationPrefix = line.indexOf('](', cursor);\n\n if (linkDestinationPrefix === -1) {\n return null;\n }\n\n const destinationStart = linkDestinationPrefix + 2;\n const destinationEnd = line.indexOf(')', destinationStart);\n\n if (destinationEnd === -1) {\n return null;\n }\n\n return {\n start: destinationStart,\n end: destinationEnd,\n };\n}\n\nfunction replaceLiteralAngleBracketTextTokens(text: string, placeholderToToken: Map<string, string>) {\n return text.replace(MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN, (match, innerText: string) => {\n if (isMarkdownAutolinkAngleBracketText(innerText)) {\n return match;\n }\n\n const placeholder = createAngleBracketPlaceholder(placeholderToToken.size);\n placeholderToToken.set(placeholder, match);\n\n return placeholder;\n });\n}\n\nfunction replaceNumericTildeRangeMarkers(text: string, placeholderToToken: Map<string, string>) {\n return text.replace(MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN, (match, leadingDigit: string) => {\n const placeholder = createNumericTildeRangePlaceholder(placeholderToToken.size);\n placeholderToToken.set(placeholder, '~');\n\n return `${leadingDigit}${placeholder}`;\n });\n}\n\nfunction protectMarkdownLineEndHardBreakMarker(\n line: string,\n lineEnding: string,\n hasContinuationLine: boolean,\n placeholderToToken: Map<string, string>,\n) {\n if (!lineEnding || !line.endsWith('\\\\')) {\n return line;\n }\n\n const placeholder = createHardBreakPlaceholder(placeholderToToken.size);\n const shouldPreserveAsHardBreak = hasContinuationLine && !hasUnclosedInlineCodeSpanAtLineEnd(line);\n placeholderToToken.set(placeholder, shouldPreserveAsHardBreak ? '' : '\\\\');\n\n return `${line.slice(0, -1)}${placeholder}`;\n}\n\nfunction isMarkdownHardBreakContinuationLine(line: string) {\n if (!line.trim()) {\n return false;\n }\n\n const trimmedLine = line.trimStart();\n\n if (trimmedLine.match(MARKDOWN_FENCED_CODE_PATTERN)) {\n return false;\n }\n\n if (/^(?:#{1,6})(?:\\s|$)/.test(trimmedLine)) {\n return false;\n }\n\n if (/^>/.test(trimmedLine)) {\n return false;\n }\n\n if (/^(?:[-+*])(?:\\s|$)/.test(trimmedLine) || /^\\d{1,9}[.)](?:\\s|$)/.test(trimmedLine)) {\n return false;\n }\n\n if (/^(?:-{3,}|\\*{3,}|_{3,})\\s*$/.test(trimmedLine)) {\n return false;\n }\n\n return true;\n}\n\nfunction hasUnclosedInlineCodeSpanAtLineEnd(line: string) {\n let cursor = 0;\n let openDelimiter: string | null = null;\n\n while (cursor < line.length) {\n const codeStart = line.indexOf('`', cursor);\n\n if (codeStart === -1) {\n break;\n }\n\n const delimiterLength = countRepeatedCharacter(line, codeStart, '`');\n const delimiter = '`'.repeat(delimiterLength);\n openDelimiter = openDelimiter === delimiter ? null : delimiter;\n cursor = codeStart + delimiterLength;\n }\n\n return openDelimiter !== null;\n}\n\nfunction createAngleBracketPlaceholder(index: number) {\n return `${ANGLE_BRACKET_PLACEHOLDER_PREFIX}${index}${ANGLE_BRACKET_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction createNumericTildeRangePlaceholder(index: number) {\n return `${NUMERIC_TILDE_RANGE_PLACEHOLDER_PREFIX}${index}${NUMERIC_TILDE_RANGE_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction createHardBreakPlaceholder(index: number) {\n return `${HARD_BREAK_PLACEHOLDER_PREFIX}${index}${HARD_BREAK_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction countRepeatedCharacter(value: string, start: number, character: string) {\n let cursor = start;\n\n while (value[cursor] === character) {\n cursor += 1;\n }\n\n return cursor - start;\n}\n\nfunction findTagPlaceholderAtCursor(text: string, cursor: number, placeholderToTag: Map<string, string>) {\n for (const [placeholder, tagToken] of placeholderToTag.entries()) {\n if (text.startsWith(placeholder, cursor)) {\n return {\n placeholder,\n tagToken,\n };\n }\n }\n\n return null;\n}\n\nfunction findReferencePlaceholderAtCursor(\n text: string,\n cursor: number,\n placeholderToReference: Map<string, { id: string; title: string; token: string }>,\n) {\n for (const [placeholder, reference] of placeholderToReference.entries()) {\n if (text.startsWith(placeholder, cursor)) {\n return {\n placeholder,\n reference,\n };\n }\n }\n\n return null;\n}\n\nfunction restoreRemainingTagPlaceholders(blocks: BlockNote[], placeholderToTag: Map<string, string>): BlockNote[] {\n return mapBlocks(blocks, (content) =>\n mapBlockContent(content, (inline) => {\n if (inline.type !== 'text' || typeof inline.text !== 'string') {\n return inline;\n }\n\n let text = inline.text;\n\n for (const [placeholder, tagToken] of placeholderToTag.entries()) {\n text = text.split(placeholder).join(`[${tagToken}]`);\n }\n\n return {\n ...inline,\n text,\n };\n }),\n );\n}\n\nfunction restoreProtectedTextPlaceholders(blocks: BlockNote[], placeholderToToken: Map<string, string>): BlockNote[] {\n if (placeholderToToken.size === 0) {\n return blocks;\n }\n\n return mapBlocks(blocks, (content) =>\n mapBlockContent(\n content,\n (inline) => restoreProtectedTextInValue(inline, placeholderToToken) as BlockNoteInline,\n ),\n );\n}\n\nfunction restoreProtectedTextInValue(value: unknown, placeholderToToken: Map<string, string>): unknown {\n if (typeof value === 'string') {\n return restoreProtectedText(value, placeholderToToken);\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => restoreProtectedTextInValue(item, placeholderToToken));\n }\n\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, restoreProtectedTextInValue(item, placeholderToToken)]),\n );\n }\n\n return value;\n}\n\nfunction restoreProtectedText(text: string, placeholderToToken: Map<string, string>) {\n let restoredText = text;\n\n for (const [placeholder, token] of placeholderToToken.entries()) {\n restoredText = restoredText.split(placeholder).join(token);\n }\n\n return restoredText;\n}\n\nfunction createTextInline(text: string, styles: Record<string, unknown> = {}): BlockNoteInline {\n return {\n type: 'text',\n text,\n styles,\n };\n}\n\nfunction appendInline(target: BlockNoteInline[], inline: BlockNoteInline) {\n const previous = target.at(-1);\n\n if (\n previous?.type === 'text' &&\n inline.type === 'text' &&\n previous.text !== undefined &&\n inline.text !== undefined &&\n JSON.stringify(previous.styles ?? {}) === JSON.stringify(inline.styles ?? {})\n ) {\n previous.text += inline.text;\n return;\n }\n\n target.push(inline);\n}\n\nasync function restoreCustomInlineContent(\n blocks: BlockNote[],\n deps: MarkdownImportDeps,\n placeholderToTag: Map<string, string>,\n placeholderToReference: Map<string, { id: string; title: string; token: string }> = new Map(),\n): Promise<BlockNote[]> {\n const tagCache = new Map<string, Promise<{ id: string; tag: string }>>();\n const noteCache = new Map<string, Promise<Array<{ id: string; title: string }>>>();\n const noteByIdCache = new Map<string, Promise<{ id: string; title: string } | null>>();\n\n const getTag = (token: string) => {\n const normalizedToken = token.startsWith('#') ? `@${token.slice(1)}` : token;\n let existing = tagCache.get(normalizedToken);\n\n if (!existing) {\n existing = deps.ensureTag(normalizedToken.slice(1)).then((result) => ({\n id: 'tag' in result ? result.tag.id : result.id,\n tag: 'tag' in result ? result.tag.name : result.name,\n }));\n tagCache.set(normalizedToken, existing);\n }\n\n return existing;\n };\n\n const getNotesByTitle = (title: string) => {\n let existing = noteCache.get(title);\n\n if (!existing) {\n existing = deps.findNotesByTitle(title);\n noteCache.set(title, existing);\n }\n\n return existing;\n };\n\n const getNoteById = (id: string) => {\n let existing = noteByIdCache.get(id);\n\n if (!existing) {\n existing = deps.findNoteById ? deps.findNoteById(id) : Promise.resolve(null);\n noteByIdCache.set(id, existing);\n }\n\n return existing;\n };\n\n const restoreTextInline = async (inline: BlockNoteInline): Promise<BlockNoteInline[]> => {\n if (inline.type !== 'text' || typeof inline.text !== 'string' || !inline.text || inline.styles?.code === true) {\n return [inline];\n }\n\n const restored: BlockNoteInline[] = [];\n const styles = inline.styles ?? {};\n let cursor = 0;\n\n while (cursor < inline.text.length) {\n const referencePlaceholderMatch = findReferencePlaceholderAtCursor(\n inline.text,\n cursor,\n placeholderToReference,\n );\n\n if (referencePlaceholderMatch) {\n if (!isValidNoteIdString(referencePlaceholderMatch.reference.id)) {\n appendInline(restored, createTextInline(referencePlaceholderMatch.reference.token, styles));\n cursor += referencePlaceholderMatch.placeholder.length;\n continue;\n }\n\n const note = await getNoteById(referencePlaceholderMatch.reference.id);\n\n if (note) {\n appendInline(restored, {\n type: 'reference',\n props: {\n id: note.id,\n title: note.title,\n },\n });\n } else {\n appendInline(restored, createTextInline(referencePlaceholderMatch.reference.token, styles));\n }\n\n cursor += referencePlaceholderMatch.placeholder.length;\n continue;\n }\n\n if (inline.text.startsWith('[[', cursor)) {\n const closeIndex = inline.text.indexOf(']]', cursor + 2);\n\n if (closeIndex !== -1) {\n const title = inline.text.slice(cursor + 2, closeIndex);\n const matchingNotes = await getNotesByTitle(title);\n\n if (matchingNotes.length === 1) {\n appendInline(restored, {\n type: 'reference',\n props: {\n id: matchingNotes[0].id,\n title: matchingNotes[0].title,\n },\n });\n cursor = closeIndex + 2;\n continue;\n }\n }\n }\n\n const tagPlaceholderMatch = findTagPlaceholderAtCursor(inline.text, cursor, placeholderToTag);\n\n if (tagPlaceholderMatch) {\n const tag = await getTag(tagPlaceholderMatch.tagToken);\n appendInline(restored, {\n type: 'tag',\n props: tag,\n });\n cursor += tagPlaceholderMatch.placeholder.length;\n continue;\n }\n\n let nextCursor = inline.text.length;\n\n const nextReferenceCursor = inline.text.indexOf('[[', cursor + 1);\n\n if (nextReferenceCursor !== -1) {\n nextCursor = Math.min(nextCursor, nextReferenceCursor);\n }\n\n for (const placeholder of placeholderToTag.keys()) {\n const nextPlaceholderCursor = inline.text.indexOf(placeholder, cursor + 1);\n\n if (nextPlaceholderCursor !== -1) {\n nextCursor = Math.min(nextCursor, nextPlaceholderCursor);\n }\n }\n\n for (const placeholder of placeholderToReference.keys()) {\n const nextPlaceholderCursor = inline.text.indexOf(placeholder, cursor + 1);\n\n if (nextPlaceholderCursor !== -1) {\n nextCursor = Math.min(nextCursor, nextPlaceholderCursor);\n }\n }\n\n appendInline(restored, createTextInline(inline.text.slice(cursor, nextCursor), styles));\n cursor = nextCursor;\n }\n\n return restored;\n };\n\n const restoreBlocks = async (items: BlockNote[]): Promise<BlockNote[]> => {\n return Promise.all(\n items.map(async (block) => {\n if (block.type === 'codeBlock') {\n return {\n ...block,\n children: block.children?.length ? await restoreBlocks(block.children) : [],\n };\n }\n\n return {\n ...block,\n content: await mapBlockContentAsync(block.content, restoreTextInline),\n children: block.children?.length ? await restoreBlocks(block.children) : [],\n };\n }),\n );\n };\n\n return restoreBlocks(blocks);\n}\n\nfunction collectTagIds(blocks: BlockNote[]): string[] {\n const tagIds = new Set<string>();\n\n const visit = (items: BlockNote[]) => {\n for (const block of items) {\n visitBlockContent(block.content, (inline) => {\n if (inline.type === 'tag' && typeof inline.props?.id === 'string') {\n tagIds.add(inline.props.id);\n }\n });\n\n if (block.children?.length) {\n visit(block.children);\n }\n }\n };\n\n visit(blocks);\n return [...tagIds];\n}\n\nlet editorInstance: ServerBlockNoteEditor | null = null;\n\nfunction getEditor(): ServerBlockNoteEditor {\n if (!editorInstance) {\n editorInstance = ServerBlockNoteEditor.create();\n }\n return editorInstance;\n}\n\nexport async function blocksToMarkdown(contentJson: string): Promise<string> {\n try {\n const blocks = parseBlockNoteContent(contentJson);\n const supportedBlocks = stripUnsupportedMarkdownBlocks(blocks);\n const placeholderToTag = new Map<string, string>();\n const processed = preprocessCustomInlineContent(supportedBlocks, placeholderToTag, { value: 0 });\n const editor = getEditor();\n const markdown = await editor.blocksToMarkdownLossy(\n processed as Parameters<typeof editor.blocksToMarkdownLossy>[0],\n );\n return restoreTagPlaceholdersInMarkdown(markdown, placeholderToTag);\n } catch {\n return '';\n }\n}\n\nexport async function markdownToBlocksJson(\n markdown: string,\n deps: MarkdownImportDeps = defaultMarkdownImportDeps,\n): Promise<string> {\n const editor = getEditor();\n const preprocessedMarkdown = preprocessMarkdownExplicitTags(markdown);\n const preprocessedReferenceMarkdown = preprocessMarkdownExplicitReferences(preprocessedMarkdown.markdown);\n const tildeProtectedMarkdown = protectMarkdownNumericTildeRanges(preprocessedReferenceMarkdown.markdown);\n const hardBreakProtectedMarkdown = protectMarkdownLineEndHardBreakMarkers(tildeProtectedMarkdown.markdown);\n const basePlaceholderToToken = new Map([\n ...tildeProtectedMarkdown.placeholderToToken,\n ...hardBreakProtectedMarkdown.placeholderToToken,\n ]);\n const contentJson = await parseMarkdownToContentJson(\n editor,\n hardBreakProtectedMarkdown.markdown,\n deps,\n preprocessedMarkdown.placeholderToTag,\n preprocessedReferenceMarkdown.placeholderToReference,\n basePlaceholderToToken,\n );\n\n if (extractLiteralAngleBracketTextTokens(preprocessedReferenceMarkdown.markdown).length === 0) {\n return contentJson;\n }\n\n if (\n !hasLiteralAngleBracketTextTokenLoss(\n preprocessedReferenceMarkdown.markdown,\n await blocksToMarkdown(contentJson),\n )\n ) {\n return contentJson;\n }\n\n const protectedMarkdown = protectMarkdownTextAngleBrackets(hardBreakProtectedMarkdown.markdown);\n const placeholderToToken = new Map([...basePlaceholderToToken, ...protectedMarkdown.placeholderToToken]);\n\n return parseMarkdownToContentJson(\n editor,\n protectedMarkdown.markdown,\n deps,\n preprocessedMarkdown.placeholderToTag,\n preprocessedReferenceMarkdown.placeholderToReference,\n placeholderToToken,\n );\n}\n\nasync function parseMarkdownToContentJson(\n editor: ServerBlockNoteEditor,\n markdown: string,\n deps: MarkdownImportDeps,\n placeholderToTag: Map<string, string>,\n placeholderToReference: Map<string, { id: string; title: string; token: string }> = new Map(),\n placeholderToProtectedTextToken: Map<string, string> = new Map(),\n) {\n const blocks = await editor.tryParseMarkdownToBlocks(markdown);\n const restoredBlocks = await restoreCustomInlineContent(\n blocks as BlockNote[],\n deps,\n placeholderToTag,\n placeholderToReference,\n );\n const restoredTagBlocks = restoreRemainingTagPlaceholders(restoredBlocks, placeholderToTag);\n const restoredProtectedTextBlocks = restoreProtectedTextPlaceholders(\n restoredTagBlocks,\n placeholderToProtectedTextToken,\n );\n\n return JSON.stringify(restoredProtectedTextBlocks);\n}\n\nexport function extractTagIdsFromContentJson(contentJson: string): string[] {\n const blocks = parseBlockNoteContent(contentJson);\n return collectTagIds(blocks);\n}\n\nexport function hasUnsupportedMarkdownBlocks(contentJson: string): boolean {\n try {\n let hasUnsupportedBlock = false;\n visitBlocks(parseBlockNoteContent(contentJson), (block) => {\n if (UNSUPPORTED_MARKDOWN_BLOCK_TYPES.has(block.type)) {\n hasUnsupportedBlock = true;\n }\n });\n\n return hasUnsupportedBlock;\n } catch {\n return false;\n }\n}\n\nexport function countReferenceInlinesFromContentJson(contentJson: string): number {\n try {\n let count = 0;\n visitBlocks(parseBlockNoteContent(contentJson), (block) => {\n visitBlockContent(block.content, (inline) => {\n if (inline.type === 'reference') {\n count += 1;\n }\n });\n });\n\n return count;\n } catch {\n return 0;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
createMcpAppendNoteMarkdownHandler,
|
|
4
4
|
createMcpCreateNoteHandler,
|
|
5
5
|
createMcpDeleteNoteHandler,
|
|
6
|
+
createMcpNoteWriteBaselineHandler,
|
|
6
7
|
createMcpPatchNoteMarkdownHandler,
|
|
7
8
|
createMcpReplaceNoteMarkdownHandler,
|
|
8
9
|
createMcpUpdateNoteHandler,
|
|
@@ -19,6 +20,10 @@ const createMcpRouter = (authConfig, mcpAdminService) => Router().post(
|
|
|
19
20
|
"/notes/update",
|
|
20
21
|
createMcpAuthMiddleware(authConfig, mcpAdminService),
|
|
21
22
|
useAsync(createMcpUpdateNoteHandler())
|
|
23
|
+
).post(
|
|
24
|
+
"/notes/baseline",
|
|
25
|
+
createMcpAuthMiddleware(authConfig, mcpAdminService),
|
|
26
|
+
useAsync(createMcpNoteWriteBaselineHandler())
|
|
22
27
|
).post(
|
|
23
28
|
"/notes/patch-markdown",
|
|
24
29
|
createMcpAuthMiddleware(authConfig, mcpAdminService),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/mcp.ts"],"sourcesContent":["import { Router } from 'express';\nimport type { McpAdminService } from '../features/mcp-admin/service.js';\nimport {\n createMcpAppendNoteMarkdownHandler,\n createMcpCreateNoteHandler,\n createMcpDeleteNoteHandler,\n createMcpPatchNoteMarkdownHandler,\n createMcpReplaceNoteMarkdownHandler,\n createMcpUpdateNoteHandler,\n createMcpUpdateNoteMetadataHandler,\n} from '../features/note/http/mcp.js';\nimport { createMcpCreateTagHandler } from '../features/tag/http/mcp.js';\nimport type { AuthConfig } from '../modules/auth-mode.js';\nimport { createMcpAuthMiddleware } from '../modules/mcp-auth.js';\nimport useAsync from '../modules/use-async.js';\n\ntype McpRouteService = Pick<McpAdminService, 'getStatus' | 'validatePresentedToken'>;\n\nexport const createMcpRouter = (authConfig: AuthConfig, mcpAdminService: McpRouteService) =>\n Router()\n .post(\n '/notes/create',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpCreateNoteHandler()),\n )\n .post(\n '/notes/update',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpUpdateNoteHandler()),\n )\n .post(\n '/notes/patch-markdown',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpPatchNoteMarkdownHandler()),\n )\n .post(\n '/notes/append-markdown',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpAppendNoteMarkdownHandler()),\n )\n .post(\n '/notes/metadata',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpUpdateNoteMetadataHandler()),\n )\n .post(\n '/notes/replace-markdown',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpReplaceNoteMarkdownHandler()),\n )\n .post(\n '/notes/delete',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpDeleteNoteHandler()),\n )\n .post(\n '/tags/create',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpCreateTagHandler()),\n );\n"],"mappings":"AAAA,SAAS,cAAc;AAEvB;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,iCAAiC;AAE1C,SAAS,+BAA+B;AACxC,OAAO,cAAc;AAId,MAAM,kBAAkB,CAAC,YAAwB,oBACpD,OAAO,EACF;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,2BAA2B,CAAC;AACzC,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,2BAA2B,CAAC;AACzC,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,kCAAkC,CAAC;AAChD,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,mCAAmC,CAAC;AACjD,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,mCAAmC,CAAC;AACjD,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,oCAAoC,CAAC;AAClD,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,2BAA2B,CAAC;AACzC,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,0BAA0B,CAAC;AACxC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/routes/mcp.ts"],"sourcesContent":["import { Router } from 'express';\nimport type { McpAdminService } from '../features/mcp-admin/service.js';\nimport {\n createMcpAppendNoteMarkdownHandler,\n createMcpCreateNoteHandler,\n createMcpDeleteNoteHandler,\n createMcpNoteWriteBaselineHandler,\n createMcpPatchNoteMarkdownHandler,\n createMcpReplaceNoteMarkdownHandler,\n createMcpUpdateNoteHandler,\n createMcpUpdateNoteMetadataHandler,\n} from '../features/note/http/mcp.js';\nimport { createMcpCreateTagHandler } from '../features/tag/http/mcp.js';\nimport type { AuthConfig } from '../modules/auth-mode.js';\nimport { createMcpAuthMiddleware } from '../modules/mcp-auth.js';\nimport useAsync from '../modules/use-async.js';\n\ntype McpRouteService = Pick<McpAdminService, 'getStatus' | 'validatePresentedToken'>;\n\nexport const createMcpRouter = (authConfig: AuthConfig, mcpAdminService: McpRouteService) =>\n Router()\n .post(\n '/notes/create',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpCreateNoteHandler()),\n )\n .post(\n '/notes/update',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpUpdateNoteHandler()),\n )\n .post(\n '/notes/baseline',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpNoteWriteBaselineHandler()),\n )\n .post(\n '/notes/patch-markdown',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpPatchNoteMarkdownHandler()),\n )\n .post(\n '/notes/append-markdown',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpAppendNoteMarkdownHandler()),\n )\n .post(\n '/notes/metadata',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpUpdateNoteMetadataHandler()),\n )\n .post(\n '/notes/replace-markdown',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpReplaceNoteMarkdownHandler()),\n )\n .post(\n '/notes/delete',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpDeleteNoteHandler()),\n )\n .post(\n '/tags/create',\n createMcpAuthMiddleware(authConfig, mcpAdminService),\n useAsync(createMcpCreateTagHandler()),\n );\n"],"mappings":"AAAA,SAAS,cAAc;AAEvB;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,iCAAiC;AAE1C,SAAS,+BAA+B;AACxC,OAAO,cAAc;AAId,MAAM,kBAAkB,CAAC,YAAwB,oBACpD,OAAO,EACF;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,2BAA2B,CAAC;AACzC,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,2BAA2B,CAAC;AACzC,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,kCAAkC,CAAC;AAChD,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,kCAAkC,CAAC;AAChD,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,mCAAmC,CAAC;AACjD,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,mCAAmC,CAAC;AACjD,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,oCAAoC,CAAC;AAClD,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,2BAA2B,CAAC;AACzC,EACC;AAAA,EACG;AAAA,EACA,wBAAwB,YAAY,eAAe;AAAA,EACnD,SAAS,0BAA0B,CAAC;AACxC;","names":[]}
|