ocean-brain 0.6.2 → 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.
Files changed (46) hide show
  1. package/dist/mcp.js +79 -24
  2. package/package.json +2 -1
  3. package/server/client/dist/assets/{Calendar-DbPut8EU.js → Calendar-B2_OJcHD.js} +1 -1
  4. package/server/client/dist/assets/{Callout-DfX-gIUB.js → Callout-BvXAlA5k.js} +1 -1
  5. package/server/client/dist/assets/{Graph-yHE9m5fy.js → Graph-DO35UCPM.js} +1 -1
  6. package/server/client/dist/assets/{Image.es-CtMc7BW4.js → Image.es-DLqLiGdW.js} +1 -1
  7. package/server/client/dist/assets/Note-AaTlS352.js +22 -0
  8. package/server/client/dist/assets/{Plus.es-BGVIIQtM.js → Plus.es-I7xuoJ9B.js} +1 -1
  9. package/server/client/dist/assets/{Reminders-CvEJf0eQ.js → Reminders-B0LJeSlu.js} +1 -1
  10. package/server/client/dist/assets/{Search-CKZhztuV.js → Search-xbDSlNOT.js} +1 -1
  11. package/server/client/dist/assets/{SurfaceCard-Bnfo5EOl.js → SurfaceCard-Brd1cMxi.js} +1 -1
  12. package/server/client/dist/assets/{Tag-C4oAwjs0.js → Tag-2PlhkjwY.js} +1 -1
  13. package/server/client/dist/assets/{TagNotes-Rl1ZSJP6.js → TagNotes-1yUBLqhX.js} +1 -1
  14. package/server/client/dist/assets/{Trash.es-BcwUz2yM.js → Trash.es-B-7U25B6.js} +1 -1
  15. package/server/client/dist/assets/{ViewNotes-B9Yc0A87.js → ViewNotes-D4X-MCTk.js} +1 -1
  16. package/server/client/dist/assets/{ViewSectionTableRenderer-C5yJBO7C.js → ViewSectionTableRenderer-FuqBpQts.js} +1 -1
  17. package/server/client/dist/assets/{Views-Bqq0pUEE.js → Views-CBEimWY8.js} +1 -1
  18. package/server/client/dist/assets/{image.api-CuGTgzyQ.js → image.api-BtadKO98.js} +1 -1
  19. package/server/client/dist/assets/{index-CDjYEIVf.css → index-BFkZTZ6v.css} +1 -1
  20. package/server/client/dist/assets/{index-B43ulIPo.js → index-BgnmVjeF.js} +45 -11
  21. package/server/client/dist/assets/{index-BQDR6hIA.js → index-sGhvnErO.js} +1 -1
  22. package/server/client/dist/assets/{manage-image-Bs4Kmevx.js → manage-image-B4UZ-ZQx.js} +1 -1
  23. package/server/client/dist/assets/{manage-image-detail-WARala-v.js → manage-image-detail-ejAh3nCL.js} +1 -1
  24. package/server/client/dist/assets/{mcp-C0Z3vKBa.js → mcp-aIwuouT9.js} +1 -1
  25. package/server/client/dist/assets/{placeholder-D080guzn.js → placeholder-B_9Hnm7h.js} +4 -4
  26. package/server/client/dist/assets/{properties-DbnmfbT5.js → properties-D8oLyTCD.js} +1 -1
  27. package/server/client/dist/assets/{trash-D5ZiZfTk.js → trash-w7Hhxckg.js} +1 -1
  28. package/server/client/dist/assets/{useReminderMutate-h7d_S_X2.js → useReminderMutate--RlAj_Gg.js} +1 -1
  29. package/server/client/dist/index.html +2 -2
  30. package/server/dist/features/note/graphql/note.query.resolver.js +88 -47
  31. package/server/dist/features/note/graphql/note.query.resolver.js.map +1 -1
  32. package/server/dist/features/note/graphql/note.type-defs.js +32 -0
  33. package/server/dist/features/note/graphql/note.type-defs.js.map +1 -1
  34. package/server/dist/features/note/http/mcp.js +32 -0
  35. package/server/dist/features/note/http/mcp.js.map +1 -1
  36. package/server/dist/features/note/services/markdown-intent-write.js +3 -3
  37. package/server/dist/features/note/services/markdown-intent-write.js.map +1 -1
  38. package/server/dist/features/note/services/markdown-patch.js +34 -4
  39. package/server/dist/features/note/services/markdown-patch.js.map +1 -1
  40. package/server/dist/features/note/services/snapshot.js +159 -0
  41. package/server/dist/features/note/services/snapshot.js.map +1 -1
  42. package/server/dist/modules/blocknote.js +274 -24
  43. package/server/dist/modules/blocknote.js.map +1 -1
  44. package/server/dist/routes/mcp.js +5 -0
  45. package/server/dist/routes/mcp.js.map +1 -1
  46. package/server/client/dist/assets/Note-BECn-AoI.js +0 -21
@@ -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';\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 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 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 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 contentJson = await parseMarkdownToContentJson(\n editor,\n tildeProtectedMarkdown.markdown,\n deps,\n preprocessedMarkdown.placeholderToTag,\n tildeProtectedMarkdown.placeholderToToken,\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(tildeProtectedMarkdown.markdown);\n const placeholderToToken = new Map([\n ...tildeProtectedMarkdown.placeholderToToken,\n ...protectedMarkdown.placeholderToToken,\n ]);\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":[]}
@@ -1,21 +0,0 @@
1
- import{j as e,i as qe,k as na,U as dt,y as ut,v as ra,X as sa,F as oa}from"./note-vendor-uuJO2MTD.js";import{af as la,p as Qe,T as x,c as q,M as H,x as me,B as R,k as we,u as _e,ag as ia,q as T,ah as ca,ai as da,aj as ua,d as W,m as Ye,a6 as pt,ak as pa,n as Ee,I as $e,w as ma,o as fa,r as Me,v as mt,D as ft,l as ht,g as ha,al as xa,a as ga,am as xt,an as ya,ao as gt,a4 as yt,N as ve,ad as va,z as ba,ap as wa,a5 as ja,aq as Ie,ar as ye,a0 as Ue,P as Ge,a3 as Ze,as as Na,at as Ca,au as ka,av as Aa,aw as tt,ax as Sa,i as ie,L as Ke,j as Ra,ay as Ta,az as Ea,aA as at,H as Ma,aB as Ha,S as nt,e as He,a8 as Da,aC as La,aD as Va,aE as Fa,aF as Pa,aG as Oa,aH as Ba,aI as rt,aJ as _a,aK as $a}from"./index-B43ulIPo.js";import{a as n}from"./graph-vendor-CUxe67Lr.js";import{C as st,m as Ia}from"./Callout-DfX-gIUB.js";import{S as Ua}from"./SurfaceCard-Bnfo5EOl.js";import{u as Za,R as Ka}from"./useReminderMutate-h7d_S_X2.js";import{n as ze}from"./Plus.es-BGVIIQtM.js";import{u as za}from"./image.api-CuGTgzyQ.js";import{A as qa,G as Qa,a3 as vt,a4 as Ya}from"./note-core-DMZcZ4yV.js";function Ga(t,a){if(t===void 0)return{shouldBlockFn:()=>!0,withResolver:!1};if("shouldBlockFn"in t)return t;if(typeof t=="function")return{shouldBlockFn:async()=>await t(),enableBeforeUnload:!0,withResolver:!1};const r=!!(t.condition??!0),l=t.blockerFn;return{shouldBlockFn:async()=>r&&l!==void 0?await l():r,enableBeforeUnload:r,withResolver:l===void 0}}function Wa(t,a){const{shouldBlockFn:r,enableBeforeUnload:l=!0,disabled:s=!1,withResolver:d=!1}=Ga(t),i=la(),{history:u}=i,[c,h]=n.useState({status:"idle",current:void 0,next:void 0,action:void 0,proceed:void 0,reset:void 0});return n.useEffect(()=>{const m=async N=>{function j(M){const C=i.parseLocation(M),b=i.getMatchedRoutes(C.pathname);return b.foundRoute===void 0?{routeId:"__notFound__",fullPath:C.pathname,pathname:C.pathname,params:b.routeParams,search:i.options.parseSearch(M.search)}:{routeId:b.foundRoute.id,fullPath:b.foundRoute.fullPath,pathname:C.pathname,params:b.routeParams,search:i.options.parseSearch(M.search)}}const y=j(N.currentLocation),S=j(N.nextLocation);if(y.routeId==="__notFound__"&&S.routeId!=="__notFound__")return!1;const f=await r({action:N.action,current:y,next:S});if(!d)return f;if(!f)return!1;const F=await new Promise(M=>{h({status:"blocked",current:y,next:S,action:N.action,proceed:()=>M(!1),reset:()=>M(!0)})});return h({status:"idle",current:void 0,next:void 0,action:void 0,proceed:void 0,reset:void 0}),F};return s?void 0:u.block({blockerFn:m,enableBeforeUnload:l})},[r,l,s,d,u,i]),c}const Ja=new Map([["bold",n.createElement(n.Fragment,null,n.createElement("path",{d:"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z"}))],["duotone",n.createElement(n.Fragment,null,n.createElement("path",{d:"M216,40V168H168V88H88V40Z",opacity:"0.2"}),n.createElement("path",{d:"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z"}))],["fill",n.createElement(n.Fragment,null,n.createElement("path",{d:"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32Zm-8,128H176V88a8,8,0,0,0-8-8H96V48H208Z"}))],["light",n.createElement(n.Fragment,null,n.createElement("path",{d:"M216,34H88a6,6,0,0,0-6,6V82H40a6,6,0,0,0-6,6V216a6,6,0,0,0,6,6H168a6,6,0,0,0,6-6V174h42a6,6,0,0,0,6-6V40A6,6,0,0,0,216,34ZM162,210H46V94H162Zm48-48H174V88a6,6,0,0,0-6-6H94V46H210Z"}))],["regular",n.createElement(n.Fragment,null,n.createElement("path",{d:"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z"}))],["thin",n.createElement(n.Fragment,null,n.createElement("path",{d:"M216,36H88a4,4,0,0,0-4,4V84H40a4,4,0,0,0-4,4V216a4,4,0,0,0,4,4H168a4,4,0,0,0,4-4V172h44a4,4,0,0,0,4-4V40A4,4,0,0,0,216,36ZM164,212H44V92H164Zm48-48H172V88a4,4,0,0,0-4-4H92V44H212Z"}))]]),Xa=new Map([["bold",n.createElement(n.Fragment,null,n.createElement("path",{d:"M216.49,79.52l-56-56A12,12,0,0,0,152,20H56A20,20,0,0,0,36,40V216a20,20,0,0,0,20,20H200a20,20,0,0,0,20-20V88A12,12,0,0,0,216.49,79.52ZM160,57l23,23H160ZM60,212V44h76V92a12,12,0,0,0,12,12h48V212Z"}))],["duotone",n.createElement(n.Fragment,null,n.createElement("path",{d:"M208,88H152V32Z",opacity:"0.2"}),n.createElement("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Z"}))],["fill",n.createElement(n.Fragment,null,n.createElement("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM152,88V44l44,44Z"}))],["light",n.createElement(n.Fragment,null,n.createElement("path",{d:"M212.24,83.76l-56-56A6,6,0,0,0,152,26H56A14,14,0,0,0,42,40V216a14,14,0,0,0,14,14H200a14,14,0,0,0,14-14V88A6,6,0,0,0,212.24,83.76ZM158,46.48,193.52,82H158ZM200,218H56a2,2,0,0,1-2-2V40a2,2,0,0,1,2-2h90V88a6,6,0,0,0,6,6h50V216A2,2,0,0,1,200,218Z"}))],["regular",n.createElement(n.Fragment,null,n.createElement("path",{d:"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Z"}))],["thin",n.createElement(n.Fragment,null,n.createElement("path",{d:"M210.83,85.17l-56-56A4,4,0,0,0,152,28H56A12,12,0,0,0,44,40V216a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12V88A4,4,0,0,0,210.83,85.17ZM156,41.65,198.34,84H156ZM200,220H56a4,4,0,0,1-4-4V40a4,4,0,0,1,4-4h92V88a4,4,0,0,0,4,4h52V216A4,4,0,0,1,200,220Z"}))]]),en=new Map([["bold",n.createElement(n.Fragment,null,n.createElement("path",{d:"M87.5,151.52l64-64a12,12,0,0,1,17,17l-64,64a12,12,0,0,1-17-17Zm131-114a60.08,60.08,0,0,0-84.87,0L103.51,67.61a12,12,0,0,0,17,17l30.07-30.06a36,36,0,0,1,50.93,50.92L171.4,135.52a12,12,0,1,0,17,17l30.08-30.06A60.09,60.09,0,0,0,218.45,37.55ZM135.52,171.4l-30.07,30.08a36,36,0,0,1-50.92-50.93l30.06-30.07a12,12,0,0,0-17-17L37.55,133.58a60,60,0,0,0,84.88,84.87l30.06-30.07a12,12,0,0,0-17-17Z"}))],["duotone",n.createElement(n.Fragment,null,n.createElement("path",{d:"M209.94,113.94l-96,96a48,48,0,0,1-67.88-67.88l96-96a48,48,0,0,1,67.88,67.88Z",opacity:"0.2"}),n.createElement("path",{d:"M165.66,90.34a8,8,0,0,1,0,11.32l-64,64a8,8,0,0,1-11.32-11.32l64-64A8,8,0,0,1,165.66,90.34ZM215.6,40.4a56,56,0,0,0-79.2,0L106.34,70.45a8,8,0,0,0,11.32,11.32l30.06-30a40,40,0,0,1,56.57,56.56l-30.07,30.06a8,8,0,0,0,11.31,11.32L215.6,119.6a56,56,0,0,0,0-79.2ZM138.34,174.22l-30.06,30.06a40,40,0,1,1-56.56-56.57l30.05-30.05a8,8,0,0,0-11.32-11.32L40.4,136.4a56,56,0,0,0,79.2,79.2l30.06-30.07a8,8,0,0,0-11.32-11.31Z"}))],["fill",n.createElement(n.Fragment,null,n.createElement("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM144.56,173.66l-21.45,21.45a44,44,0,0,1-62.22-62.22l21.45-21.46a8,8,0,0,1,11.32,11.31L72.2,144.2a28,28,0,0,0,39.6,39.6l21.45-21.46a8,8,0,0,1,11.31,11.32Zm-34.9-16a8,8,0,0,1-11.32-11.32l48-48a8,8,0,0,1,11.32,11.32Zm85.45-34.55-21.45,21.45a8,8,0,0,1-11.32-11.31L183.8,111.8a28,28,0,0,0-39.6-39.6L122.74,93.66a8,8,0,0,1-11.31-11.32l21.46-21.45a44,44,0,0,1,62.22,62.22Z"}))],["light",n.createElement(n.Fragment,null,n.createElement("path",{d:"M164.25,91.75a6,6,0,0,1,0,8.49l-64,64a6,6,0,0,1-8.49-8.48l64-64A6,6,0,0,1,164.25,91.75ZM214.2,41.8a54.07,54.07,0,0,0-76.38,0L107.75,71.85a6,6,0,0,0,8.49,8.49l30.07-30.06a42,42,0,0,1,59.41,59.41l-30.08,30.07a6,6,0,1,0,8.49,8.49l30.07-30.07A54,54,0,0,0,214.2,41.8ZM139.76,175.64l-30.07,30.08a42,42,0,0,1-59.41-59.41l30.06-30.07a6,6,0,0,0-8.49-8.49l-30,30.07a54,54,0,0,0,76.38,76.39l30.07-30.08a6,6,0,0,0-8.49-8.49Z"}))],["regular",n.createElement(n.Fragment,null,n.createElement("path",{d:"M165.66,90.34a8,8,0,0,1,0,11.32l-64,64a8,8,0,0,1-11.32-11.32l64-64A8,8,0,0,1,165.66,90.34ZM215.6,40.4a56,56,0,0,0-79.2,0L106.34,70.45a8,8,0,0,0,11.32,11.32l30.06-30a40,40,0,0,1,56.57,56.56l-30.07,30.06a8,8,0,0,0,11.31,11.32L215.6,119.6a56,56,0,0,0,0-79.2ZM138.34,174.22l-30.06,30.06a40,40,0,1,1-56.56-56.57l30.05-30.05a8,8,0,0,0-11.32-11.32L40.4,136.4a56,56,0,0,0,79.2,79.2l30.06-30.07a8,8,0,0,0-11.32-11.31Z"}))],["thin",n.createElement(n.Fragment,null,n.createElement("path",{d:"M162.84,93.16a4,4,0,0,1,0,5.66l-64,64a4,4,0,0,1-5.66-5.66l64-64A4,4,0,0,1,162.84,93.16Zm49.95-49.95a52.07,52.07,0,0,0-73.56,0L109.17,73.27a4,4,0,0,0,5.65,5.66l30.07-30.06a44,44,0,0,1,62.24,62.24l-30.07,30.06a4,4,0,0,0,5.66,5.66l30.07-30.06A52.07,52.07,0,0,0,212.79,43.21ZM141.17,177.06l-30.06,30.07a44,44,0,0,1-62.24-62.24l30.06-30.06a4,4,0,0,0-5.66-5.66L43.21,139.23a52,52,0,0,0,73.56,73.56l30.06-30.07a4,4,0,1,0-5.66-5.66Z"}))]]),bt=n.forwardRef((t,a)=>n.createElement(Qe,{ref:a,...t,weights:Ja}));bt.displayName="CopyIcon";const tn=bt,wt=n.forwardRef((t,a)=>n.createElement(Qe,{ref:a,...t,weights:Xa}));wt.displayName="FileIcon";const an=wt,jt=n.forwardRef((t,a)=>n.createElement(Qe,{ref:a,...t,weights:en}));jt.displayName="LinkSimpleIcon";const Nt=jt;function Ct({icon:t,title:a,className:r}){return e.jsxs("div",{className:q("flex items-center gap-2",r),children:[e.jsx("div",{className:"flex h-3.5 w-3.5 shrink-0 items-center justify-center text-current",children:t}),e.jsx(x,{as:"span",variant:"label",weight:"semibold",className:"text-current",children:a})]})}function We({title:t,icon:a,action:r,titleButtonProps:l,ariaLabel:s,className:d,children:i}){const u=i!=null&&i!==!1,c=r!=null&&r!==!1,h=e.jsx(Ct,{icon:a,title:t,className:"text-fg-tertiary"});return e.jsxs("section",{className:q("surface-base mb-5 p-4",d),"aria-label":s??t,children:[e.jsxs("div",{className:q("relative",c&&"pr-44 sm:pr-48",u&&"mb-3"),children:[l?e.jsx("button",{...l,type:"button",className:q("focus-ring-soft -m-1 flex items-center gap-2 rounded-[10px] p-1 text-fg-tertiary transition-colors hover:bg-hover-subtle hover:text-fg-default",l.className),children:h}):h,c&&e.jsx("div",{className:"absolute top-1/2 right-0 flex -translate-y-1/2 items-center gap-2",children:r})]}),i]})}function ue({title:t,description:a,selected:r=!1,onClick:l,children:s}){return e.jsxs("button",{type:"button","aria-pressed":r,className:`focus-ring-soft flex w-full items-start justify-between gap-3 p-3 text-left transition-colors sm:p-4 ${r?"surface-floating bg-elevated":"rounded-[14px] border border-border-subtle bg-transparent hover:border-border-secondary hover:bg-hover-subtle"}`,onClick:l,children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx(x,{as:"div",variant:"body",weight:"semibold",tone:r?"default":"secondary",children:t}),e.jsx(x,{as:"div",variant:"meta",weight:"medium",tone:r?"secondary":"tertiary",className:"mt-1",children:a})]}),s?e.jsx("div",{className:"shrink-0",children:s}):null]})}const nn=[{value:"narrow",label:"Narrow",description:"Optimized for reading long-form content"},{value:"wide",label:"Wide",description:"Balanced width suitable for most content"},{value:"full",label:"Full Width",description:"Maximize screen space utilization"}];function rn({isOpen:t,onClose:a,onSave:r,currentLayout:l="wide"}){const[s,d]=n.useState(l);n.useEffect(()=>{t&&d(l)},[t,l]);const i=()=>{r(s),a()};return e.jsxs(H,{isOpen:t,onClose:a,variant:"compact",children:[e.jsx(H.Header,{title:"Layout Settings",onClose:a}),e.jsx(H.Body,{children:e.jsx("div",{className:"flex flex-col gap-3 sm:gap-4",children:e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(x,{as:"div",variant:"body",weight:"semibold",tone:"secondary",children:"Note layout"}),e.jsx("div",{className:"flex flex-col gap-2",children:nn.map(u=>e.jsx(ue,{title:u.label,description:u.description,selected:s===u.value,onClick:()=>d(u.value)},u.value))})]})})}),e.jsx(H.Footer,{children:e.jsxs(me,{children:[e.jsx(R,{variant:"ghost",size:"sm",onClick:a,children:"Cancel"}),e.jsx(R,{variant:"primary",size:"sm",onClick:i,children:"Apply"})]})})]})}const kt=t=>t==="mcp"?{actor:"An MCP client",place:"through MCP",target:"the MCP update"}:t==="web"?{actor:"Another browser tab",place:"in another tab",target:"the tab update"}:{actor:"Another editor",place:"elsewhere",target:"the outside change"},sn=({isDeleted:t,isConflict:a,source:r})=>{const l=kt(r);return t?`This note was moved to trash ${l.place}`:a?`Save paused: note changed ${l.place}`:`This note changed ${l.place}`},on=({isDeleted:t,isConflict:a,hasDraft:r,source:l})=>{const s=kt(l);return t?`${s.actor} moved this note to trash. Open trash to review or restore it.`:a&&r?`Your draft is saved locally. Reload the latest note, overwrite ${s.target}, or clone your draft into a new note.`:a?`The layout change is paused because the note changed ${s.place}. Reload the latest note or overwrite only the layout.`:`${s.actor} changed this note while it was open here. Reload the latest version before continuing.`};function ln({isOpen:t,isDeleted:a,isConflict:r,hasDraft:l,source:s,isReloading:d,onReload:i,onOverwrite:u,onCloneDraft:c,onOpenTrash:h}){return e.jsxs(H,{isOpen:t,onClose:()=>{},variant:"inspect",children:[e.jsx(H.Header,{title:sn({isDeleted:a,isConflict:r,source:s})}),e.jsx(H.Body,{children:e.jsx(x,{as:"p",variant:"body",tone:"secondary",className:"leading-6",children:on({isDeleted:a,isConflict:r,hasDraft:l,source:s})})}),e.jsx(H.Footer,{children:e.jsx(me,{children:a?e.jsx(R,{type:"button",variant:"primary",size:"sm",onClick:h,children:"Open trash"}):r?e.jsxs(e.Fragment,{children:[e.jsx(R,{type:"button",variant:"subtle",size:"sm",isLoading:d,onClick:i,children:"Reload latest"}),l&&e.jsx(R,{type:"button",variant:"ghost",size:"sm",onClick:c,children:"Clone draft"}),e.jsx(R,{type:"button",variant:"danger",size:"sm",onClick:u,children:"Overwrite"})]}):e.jsx(R,{type:"button",variant:"primary",size:"sm",isLoading:d,onClick:i,children:"Reload latest"})})})]})}const ot=(t,a)=>t||(a==="mobile"?"Mobile browser":a==="mcp"?"MCP":"Web browser");function cn({isOpen:t,noteId:a,onClose:r,onRestored:l}){const s=Ye(),d=we(),[i,u]=n.useState(null),c=n.useRef(null),h=_e({queryKey:T.notes.snapshots(a),queryFn:async()=>{const f=await ia(a);if(f.type==="error")throw f;return f.noteSnapshots},enabled:t}),m=ca({mutationFn:da,onSuccess:async f=>{if(f.type==="error"){s(f.errors[0].message);return}await Promise.all([d.invalidateQueries({queryKey:T.notes.detail(a),exact:!0}),d.invalidateQueries({queryKey:T.notes.listAll(),exact:!1}),d.invalidateQueries({queryKey:T.notes.tagListAll(),exact:!1}),d.invalidateQueries({queryKey:T.notes.tagNameListAll(),exact:!1}),d.invalidateQueries({queryKey:T.notes.pinned(),exact:!0}),d.invalidateQueries({queryKey:T.notes.backReferencesAll(),exact:!1}),d.invalidateQueries({queryKey:T.notes.graph(),exact:!0}),d.invalidateQueries({queryKey:T.notes.snapshots(a),exact:!1}),d.invalidateQueries({queryKey:T.views.sectionNotesAll(),exact:!1}),d.invalidateQueries({queryKey:T.tags.all(),exact:!1})]),s("Previous version restored."),l?.(f.restoreNoteSnapshot),u(null),r()}}),N=h.data?.find(f=>f.id===i)??null,j=_e({queryKey:T.notes.snapshotDetail(i??"pending"),queryFn:async()=>{if(!i)throw new Error("SNAPSHOT_NOT_SELECTED");const f=await ua(i);if(f.type==="error")throw f;if(!f.noteSnapshot)throw new Error("SNAPSHOT_NOT_FOUND");return f.noteSnapshot},enabled:!!i}),y=j.data?.contentAsMarkdown.trim()??"";n.useEffect(()=>{i&&c.current?.focus()},[i]);const S=()=>{u(null),r()};return e.jsxs(H,{isOpen:t,onClose:S,variant:"inspect",children:[e.jsx(H.Header,{title:N?"Snapshot Content":"Restore Previous Version",onClose:S}),e.jsx(H.Description,{className:"sr-only",children:N?"Read this snapshot content before restoring it.":"Choose a previous snapshot to restore."}),e.jsx(H.Body,{children:N?e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx(x,{as:"p",variant:"body",weight:"semibold",truncate:!0,children:N.title}),e.jsxs(x,{as:"p",variant:"label",tone:"tertiary",children:["Before"," ",ot(N.meta.label,N.meta.entrypoint)," ","edit - ",W(N.createdAt).format("YYYY-MM-DD HH:mm:ss")]})]}),j.isLoading?e.jsx(x,{as:"p",variant:"meta",tone:"secondary",className:"rounded-[14px] border border-border-subtle bg-hover-subtle/50 px-4 py-3",children:"Loading snapshot content..."}):j.isError?e.jsx(x,{as:"p",variant:"meta",tone:"secondary",className:"rounded-[14px] border border-border-subtle bg-hover-subtle/50 px-4 py-3",children:"Snapshot content could not be loaded."}):y?e.jsx("pre",{className:"max-h-[60vh] overflow-auto whitespace-pre-wrap break-words rounded-[14px] border border-border-subtle bg-hover-subtle/50 px-4 py-3 text-sm leading-6 text-fg-secondary",children:y}):e.jsx(x,{as:"p",variant:"meta",tone:"secondary",className:"rounded-[14px] border border-border-subtle bg-hover-subtle/50 px-4 py-3",children:"No readable content was found for this snapshot."})]}):e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx(x,{as:"p",variant:"meta",tone:"secondary",children:"Choose a previous snapshot to restore this note back to that state."}),h.isLoading&&e.jsx(x,{as:"div",variant:"meta",tone:"secondary",children:"Loading previous versions..."}),!h.isLoading&&h.data?.length===0&&e.jsx(x,{as:"div",variant:"meta",tone:"secondary",className:"rounded-[14px] border border-border-subtle bg-hover-subtle/50 px-4 py-3",children:"A recovery snapshot appears before the first edit in a session. Up to 10 recent snapshots are kept for 7 days, and identical versions are skipped."}),!h.isLoading&&h.data&&h.data.length>0&&e.jsx("div",{className:"flex flex-col gap-2",children:h.data.map(f=>e.jsx(Ua,{padding:"compact",children:e.jsxs("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs(x,{as:"p",variant:"body",weight:"semibold",children:["Before"," ",ot(f.meta.label,f.meta.entrypoint)," ","edit"]}),e.jsx(x,{as:"p",variant:"meta",truncate:!0,tone:"secondary",children:f.title}),e.jsx(x,{as:"p",variant:"label",tone:"tertiary",children:W(f.createdAt).format("YYYY-MM-DD HH:mm:ss")}),f.contentPreview&&e.jsx("div",{className:"mt-3 rounded-[14px] border border-border-subtle bg-hover-subtle/50 px-3 py-2",children:e.jsx(x,{as:"p",variant:"meta",tone:"secondary",className:"line-clamp-4 whitespace-pre-wrap break-words",children:f.contentPreview})})]}),e.jsxs("div",{className:"flex shrink-0 flex-wrap gap-2 sm:justify-end",children:[e.jsx(R,{variant:"subtle",size:"sm",onClick:()=>u(f.id),children:"View content"}),e.jsx(R,{size:"sm",isLoading:m.isPending,onClick:()=>m.mutate(f.id),children:"Restore"})]})]})},f.id))})]})}),N&&e.jsx(H.Footer,{children:e.jsxs(me,{children:[e.jsx(R,{ref:c,variant:"subtle",onClick:()=>u(null),children:"Back"}),e.jsx(R,{disabled:!j.data||j.isError,isLoading:m.isPending,onClick:()=>m.mutate(N.id),children:"Restore this version"})]})})]})}const dn=t=>{const{data:a}=pt({queryKey:T.notes.backReferences(t.noteId),async queryFn(){const r=await pa(t.noteId);if(r.type==="error")throw r;return r.backReferences}});return t.render(a)};let un="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict",pn=(t=21)=>{let a="",r=crypto.getRandomValues(new Uint8Array(t|=0));for(;t--;)a+=un[r[t]&63];return a};const lt={low:{active:"border-border-secondary bg-elevated text-fg-default",inactive:"border-transparent bg-transparent text-fg-muted hover:bg-hover-subtle"},medium:{active:"border-border-secondary bg-elevated text-fg-default",inactive:"border-transparent bg-transparent text-fg-muted hover:bg-hover-subtle"},high:{active:"border-border-secondary bg-elevated text-fg-default",inactive:"border-transparent bg-transparent text-fg-muted hover:bg-hover-subtle"}};function mn({isOpen:t,onClose:a,onSave:r,reminder:l,mode:s}){const[d,i]=n.useState(new Date),[u,c]=n.useState("medium"),[h,m]=n.useState("");n.useEffect(()=>{t&&s==="edit"&&l?(i(new Date(Number(l.reminderDate))),c(l.priority||"medium"),m(l.content||"")):t&&s==="create"&&(i(new Date),c("medium"),m(""))},[t,s,l]);const N=()=>{r(d,u,h||void 0),a()},j=y=>u===y?lt[y].active:lt[y].inactive;return e.jsxs(H,{isOpen:t,onClose:a,variant:"form",children:[e.jsx(H.Header,{title:s==="create"?"Create Reminder":"Edit Reminder",onClose:a}),e.jsx(H.Body,{children:e.jsxs("div",{className:"flex flex-col gap-3 sm:gap-4",children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(Ee,{children:"Date & Time"}),e.jsx($e,{type:"datetime-local",size:"sm",value:W(d).format("YYYY-MM-DDTHH:mm"),onChange:y=>i(new Date(y.target.value))})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(Ee,{children:"Content"}),e.jsx(ma,{size:"sm",placeholder:"Enter reminder content (optional)",value:h,onChange:y=>m(y.target.value)})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(Ee,{children:"Priority"}),e.jsxs(fa,{type:"single",variant:"quiet",value:u,onValueChange:y=>y&&c(y),className:"gap-1.5 border-none rounded-[14px] bg-muted/70 p-1 sm:gap-2",children:[e.jsx(Me,{value:"low",className:`flex-1 rounded-[10px] border ${j("low")}`,children:e.jsx(x,{as:"span",weight:"medium",className:"text-current",children:"Low"})}),e.jsx(Me,{value:"medium",className:`flex-1 rounded-[10px] border ${j("medium")}`,children:e.jsx(x,{as:"span",weight:"medium",className:"text-current",children:"Medium"})}),e.jsx(Me,{value:"high",className:`flex-1 rounded-[10px] border ${j("high")}`,children:e.jsx(x,{as:"span",weight:"medium",className:"text-current",children:"High"})})]})]})]})}),e.jsx(H.Footer,{children:e.jsxs(me,{children:[e.jsx(R,{variant:"ghost",size:"sm",onClick:a,children:"Cancel"}),e.jsx(R,{variant:"primary",size:"sm",onClick:N,children:s==="create"?"Create":"Save"})]})})]})}function fn({noteId:t}){const[a,r]=n.useState(!1),[l,s]=n.useState(!1),[d,i]=n.useState("create"),[u,c]=n.useState(void 0),{onCreate:h,onUpdate:m,onDelete:N}=Za(),j=()=>{i("create"),c(void 0),s(!0)},y=C=>{i("edit"),c(C),s(!0)},S=(C,b,v)=>{d==="create"?h(t,C,b,()=>{s(!1)},v):d==="edit"&&u&&m(u.id,t,{reminderDate:C,priority:b,content:v},()=>{s(!1)})},f=C=>{m(C.id,t,{completed:!C.completed})},L=C=>{const b=W(Number(C)),v=W();return b.isSame(v,"day")?`Today at ${b.format("HH:mm")}`:b.isSame(v.add(1,"day"),"day")?`Tomorrow at ${b.format("HH:mm")}`:b.format("YYYY-MM-DD HH:mm")},F=C=>{const b=W(Number(C)),v=W(),P=b.diff(v,"hour");return P<=6?"high":P<=24?"medium":"low"},M=C=>{const b=W(Number(C)),v=W(),P=b.diff(v,"hour"),_=b.diff(v,"minute")%60;return P<0||_<0?"Overdue":P===0?`${_}m remaining`:`${P}h ${_}m remaining`};return e.jsxs(e.Fragment,{children:[e.jsx(We,{title:"Reminders",icon:e.jsx(ga,{className:"h-3.5 w-3.5"}),action:e.jsxs(e.Fragment,{children:[!a&&e.jsxs(R,{size:"sm",variant:"ghost",onClick:j,children:[e.jsx(ze,{className:"w-3 h-3"}),e.jsx(x,{as:"span",variant:"label",className:"hidden sm:inline",children:"Add"})]}),e.jsxs(R,{type:"button",size:"sm",variant:"ghost","aria-label":a?"Expand reminders":"Collapse reminders","aria-expanded":!a,onClick:()=>r(!a),children:[a?e.jsx(ha,{className:"h-3.5 w-3.5"}):e.jsx(xa,{className:"h-3.5 w-3.5"}),a?"Expand":"Collapse"]})]}),children:!a&&e.jsx(Ka,{noteId:t,searchParams:{offset:0,limit:9999},render:({reminders:C,totalCount:b})=>e.jsx("div",{className:"flex flex-col gap-2",children:C.length===0?e.jsx(x,{as:"p",variant:"meta",tone:"secondary",className:"py-3 text-center",children:b===0?"No reminders yet":"All reminders complete"}):e.jsx("div",{className:"flex flex-col",children:C.map(v=>{const P=v.priority||F(v.reminderDate),_=M(v.reminderDate),D=_==="Overdue";return e.jsxs("div",{className:q("flex items-center gap-2.5 px-2 py-1.5"),children:[e.jsx(mt,{checked:v.completed,onChange:()=>f(v),size:"sm"}),e.jsx(x,{as:"div",variant:"body",weight:"medium",className:q("truncate flex-1 min-w-0",v.completed&&"line-through opacity-40"),children:v.content||L(v.reminderDate)}),e.jsxs("div",{className:q("shrink-0 flex items-center gap-1",v.completed&&"opacity-40"),children:[v.content&&e.jsx(x,{as:"span",variant:"meta",tone:"secondary",children:L(v.reminderDate)}),!v.completed&&e.jsx(x,{as:"span",variant:"label",weight:"medium",tone:D||P==="high"?"error":"tertiary",className:q(v.content&&'before:content-["·"] before:mr-1'),children:_})]}),e.jsx(ft,{button:e.jsx(ht,{label:"Reminder actions"}),items:[{name:"Edit",onClick:()=>y(v)},{name:"Delete",onClick:()=>N(v.id,t)}]})]},v.id)})})})})}),e.jsx(mn,{isOpen:l,onClose:()=>s(!1),onSave:S,reminder:u,mode:d})]})}const hn=({editor:t})=>e.jsx(qe,{triggerCharacter:"/",getItems:async a=>qa([...na(t).filter(r=>r.title!=="Audio"&&r.title!=="Video"&&r.title!=="File"),{title:"Table of Contents",subtext:"Insert a table of contents based on headings",onItemClick:()=>{t.insertBlocks([{type:"tableOfContents"}],t.getTextCursorPosition().block,"after")},aliases:["toc","table of contents","contents","outline","index"],group:"Other",icon:e.jsx(xt,{})}],a)}),xn=(t,a)=>a?t.filter(r=>r.id!==a):t,gn=({currentNoteId:t,onClick:a})=>e.jsx(qe,{triggerCharacter:"[",getItems:async r=>{const l=await ya({query:r,limit:5});return l.type==="error"?[]:xn(l.allNotes.notes,t).map(d=>({title:d.title,onItemClick:()=>a({type:"reference",props:{id:d.id,title:d.title}})}))}}),yn="pointer-events-auto inline-flex h-7 cursor-pointer select-none items-center gap-1.5 rounded-[8px] border border-white/10 bg-white/10 px-2.5 text-xs font-medium text-white/60 opacity-75 shadow-[0_8px_18px_-14px_rgba(0,0,0,0.45)] backdrop-blur-sm transition-colors hover:bg-white/20 hover:text-white/90 hover:opacity-100 focus-ring-soft focus:text-white/90 focus:opacity-100",vn={idle:"",copied:"text-accent-success hover:text-accent-success focus:text-accent-success",failed:"text-fg-error hover:text-fg-error focus:text-fg-error"},bn={idle:"Copy",copied:"Copied",failed:"Copy failed"},wn=({getText:t,resetDelayMs:a=2e3})=>{const[r,l]=n.useState("idle"),s=n.useRef(null),d=n.useCallback(()=>{s.current&&(clearTimeout(s.current),s.current=null)},[]),i=n.useCallback(()=>{d(),s.current=setTimeout(()=>{l("idle"),s.current=null},a)},[d,a]);n.useEffect(()=>d,[d]);const u=m=>{m.stopPropagation()},c=m=>{m.preventDefault(),m.stopPropagation()},h=async m=>{u(m);try{await navigator.clipboard.writeText(t()),l("copied")}catch{l("failed")}i()};return e.jsx("div",{className:"pointer-events-none absolute right-3 top-2 z-[1]",contentEditable:!1,onMouseDown:c,children:e.jsxs("button",{type:"button",className:q(yn,vn[r]),contentEditable:!1,onClick:h,children:[e.jsx(tn,{className:"h-3.5 w-3.5"}),e.jsx("span",{"aria-live":"polite",children:bn[r]})]})})},jn=({contentRef:t})=>{const a=n.useRef(null),r=n.useCallback(l=>{a.current=l,t(l)},[t]);return e.jsxs(e.Fragment,{children:[e.jsx("pre",{children:e.jsx("code",{ref:r})}),e.jsx(wn,{getText:()=>a.current?.textContent?.trimEnd()??""})]})},Nn="_Reference_102im_1",Cn={Reference:Nn},kn=gt.bind(Cn),An={type:"reference",propSchema:{id:{default:""},title:{default:"Unknown"}},content:"none"};function Sn(t){const a=yt(),r=()=>{t.editor.blur(),a({to:ve,params:{id:t.inlineContent.props.id}})},l=s=>{s.preventDefault(),s.stopPropagation()};return e.jsx("span",{role:"link",tabIndex:0,contentEditable:!1,className:kn("Reference"),onMouseDown:l,onClick:s=>{l(s),r()},onKeyDown:s=>{s.key!=="Enter"&&s.key!==" "||(l(s),r())},children:e.jsxs("span",{children:["[",t.inlineContent.props.title,"]"]})})}const Rn=dt(An,{render:t=>e.jsx(Sn,{...t})}),Tn=()=>{const t=ra(),[a,r]=n.useState([]),l={1:"pl-3",2:"pl-[26px]",3:"pl-[40px]",4:"pl-[54px]",5:"pl-[68px]",6:"pl-[82px]"};n.useEffect(()=>{const i=()=>{const c=t.document,h=[],m=N=>{for(const j of N){if(j.type==="heading"){const y=j,S=y.props.level||1,f=y.content?.map(L=>L.text||"").join("")||"";f.trim()&&h.push({id:j.id,level:S,text:f})}j.children&&Array.isArray(j.children)&&m(j.children)}};m(c),r(h)};i();const u=t.onChange?.(i);return()=>{u&&u()}},[t]);const s=i=>{t.setTextCursorPosition(i);const u=document.querySelector(`[data-id="${i}"]`);u&&u.scrollIntoView({behavior:"smooth",block:"center"})},d=e.jsx(Ct,{icon:e.jsx(xt,{className:"h-3.5 w-3.5"}),title:"Table of Contents",className:"text-fg-tertiary"});return a.length===0?e.jsxs("div",{className:"surface-base w-full p-4",children:[d,e.jsx(x,{as:"p",variant:"meta",tone:"secondary",className:"mt-2",children:"Add headings to your document to generate a table of contents"})]}):e.jsxs("div",{className:"surface-base w-full p-4",children:[e.jsx("div",{className:"mb-2",children:d}),e.jsx("nav",{className:"space-y-0.5",children:a.map(i=>{const u=i.level===1;return e.jsxs("button",{type:"button",onClick:()=>s(i.id),className:q("focus-ring-soft","flex","w-full","items-center","gap-2","rounded-[10px]","px-2.5","py-1.5",l[i.level]??"pl-2.5","text-left","transition-colors","hover:bg-hover-subtle",u?"text-fg-default":"text-fg-secondary"),children:[e.jsxs(x,{as:"span",variant:"label",weight:"medium",tone:"tertiary",className:"min-w-[1.5rem]",children:["H",i.level]}),e.jsx(x,{as:"span",variant:"body",weight:u?"semibold":"medium",className:"line-clamp-2 text-current",children:i.text})]},i.id)})})]})},En=ut({type:"tableOfContents",propSchema:{},content:"none"},{render:()=>e.jsx(Tn,{})})(),Mn="_Tag_1gb8h_1",Hn={Tag:Mn},Dn=gt.bind(Hn),Ln={type:"tag",propSchema:{id:{default:""},tag:{default:"@Unknown"}},content:"none"};function Vn(t){const a=yt(),r=()=>{t.editor.blur(),a({to:va,params:{id:t.inlineContent.props.id},search:{page:1}})},l=s=>{s.preventDefault(),s.stopPropagation()};return e.jsx("span",{role:"link",tabIndex:0,contentEditable:!1,className:Dn("Tag"),onMouseDown:l,onClick:s=>{l(s),r()},onKeyDown:s=>{s.key!=="Enter"&&s.key!==" "||(l(s),r())},children:e.jsx("span",{children:t.inlineContent.props.tag})})}const Fn=dt(Ln,{render:t=>e.jsx(Vn,{...t})}),Pn=t=>t,On=t=>t,Bn=Pn({tag:Fn,reference:Rn}),_n=On({tableOfContents:En}),se=vt.codeBlock,it=ut(se.config,{meta:se.implementation.meta,parse:se.implementation.parse,parseContent:se.implementation.parseContent,runsBefore:se.implementation.runsBefore,render:jn})(),$n={...it,extensions:se.extensions,implementation:{...it.implementation,toExternalHTML:se.implementation.toExternalHTML}},In=Qa.create({inlineContentSpecs:{...Ya,...Bn},blockSpecs:{...vt,codeBlock:$n,..._n}}),Un=(t,a)=>a.some(r=>r.name===`@${t}`),Zn=({onClick:t})=>e.jsx(qe,{triggerCharacter:"@",getItems:async a=>{const r=await ba({query:a,limit:5});if(r.type==="error")return[];const{tags:l}=r.allTags,s=Un(a,l),d=[{title:"Add a new tag",onItemClick:async()=>{const i=await wa({name:"@"+a});if(i.type==="error")return;const{id:u,name:c}=i.createTag;t({type:"tag",props:{id:u,tag:c}})}}];return l.length===0?d:l.map(i=>({title:i.name,onItemClick:()=>t({type:"tag",props:{id:i.id,tag:i.name}})})).concat(a&&!s?d:[])}}),Kn=new Set(["tableOfContents"]),zn="OCEAN_BRAIN_TAG_",qn="_TOKEN",Qn=t=>`${zn}${t}${qn}`,Yn=t=>!Array.isArray(t)&&t?.type==="tableContent",Gn=(t,a)=>Array.isArray(t)?t.map(a):Yn(t)?{...t,rows:t.rows?.map(r=>({...r,cells:r.cells?.map(l=>({...l,content:l.content?.map(a)}))}))}:t,At=(t,a)=>t.filter(r=>!Kn.has(r.type)).map(r=>({...r,content:a(r.content),children:r.children?.length?At(r.children,a):[]}));function Wn(t){const a=new Map;let r=0;return{blocks:At(t,s=>Gn(s,d=>{if(d.type==="reference")return{type:"text",text:`[[${d.props?.title||d.props?.id||""}]]`,styles:{}};if(d.type==="tag"){const i=d.props?.tag||"",u=Qn(r);return r+=1,a.set(u,i),{type:"text",text:u,styles:{}}}return d})),placeholderToTag:a}}function Jn(t,a){let r=t;for(const[l,s]of a.entries())r=r.split(l).join(`[${s}]`);return r}async function Xn(t){return new Promise((a,r)=>{const l=new FileReader;l.readAsDataURL(t),l.onload=()=>a(l.result),l.onerror=s=>r(s)})}const er=n.forwardRef(({content:t,currentNoteId:a,editable:r,onChange:l},s)=>{const{theme:d}=ja(u=>u),i=sa({schema:In,initialContent:t&&JSON.parse(t)||void 0,uploadFile:async u=>za({base64:await Xn(u)})},[]);return n.useImperativeHandle(s,()=>({getContent:()=>JSON.stringify(i.document),getMarkdown:()=>{const u=Wn(i.document),c=i.blocksToMarkdownLossy(u.blocks);return Jn(c,u.placeholderToTag)},getHtml:()=>i.blocksToHTMLLossy(i.document)})),e.jsxs(oa,{slashMenu:!1,theme:d,editor:i,editable:r,onChange:l,children:[e.jsx(hn,{editor:i}),e.jsx(gn,{currentNoteId:a,onClick:u=>{i.insertInlineContent([u," "])}}),e.jsx(Zn,{onClick:u=>{i.insertInlineContent([u," "])}})]})}),Je=t=>`ocean-brain.note-draft.${t}`,tr=t=>{if(typeof window>"u")return null;try{const a=window.localStorage.getItem(Je(t));if(!a)return null;const r=JSON.parse(a);return typeof r.title!="string"||typeof r.content!="string"||typeof r.baseUpdatedAt!="string"?null:{title:r.title,content:r.content,baseUpdatedAt:r.baseUpdatedAt,createdAt:typeof r.createdAt=="number"?r.createdAt:Date.now(),...r.layout==="narrow"||r.layout==="wide"||r.layout==="full"?{layout:r.layout}:{}}}catch{return null}},De=(t,a)=>{if(!(typeof window>"u"))try{window.localStorage.setItem(Je(t),JSON.stringify(a))}catch{}},Le=t=>{if(!(typeof window>"u"))try{window.localStorage.removeItem(Je(t))}catch{}},ar=1e3,nr="NOTE_UPDATE_CONFLICT";function rr({noteId:t,initialContent:a,initialUpdatedAt:r,editSessionIdRef:l,getContent:s,onSaved:d,onConflict:i,onError:u}){const c=we(),h=n.useRef(null),m=n.useRef(null),N=n.useRef(!1),j=n.useRef(null),y=n.useRef(!1),S=n.useRef(r),f=n.useRef(!1),L=n.useRef(!0),F=n.useRef(d),M=n.useRef(i),C=n.useRef(u),[b,v]=n.useState("saved"),[P,_]=n.useState(null),D=n.useCallback(()=>{h.current!==null&&(window.clearTimeout(h.current),h.current=null)},[]),O=n.useCallback(A=>{L.current&&v(A)},[]),J=n.useCallback(A=>{S.current=A},[]),Y=n.useCallback((A,B={})=>({title:A,content:s()??a,createdAt:Date.now(),baseUpdatedAt:S.current,...B.layout?{layout:B.layout}:{}}),[s,a]),ne=n.useCallback(()=>{m.current&&De(t,m.current)},[t]),G=n.useCallback(A=>{f.current=!0,O("conflict"),M.current(A??S.current)},[O]),Q=n.useCallback(async({ignoreConflict:A=!1,silent:B=!1}={})=>{if(N.current)return y.current=!0,j.current??"idle";const $=m.current;if(!$)return y.current=!1,"idle";m.current=null,y.current=!1,D(),N.current=!0,B||O("saving");const U=(async()=>{let Z;try{Z=await Ie({id:t,title:$.title,content:$.content,...$.layout?{layout:$.layout}:{},editSessionId:l.current,...A?{force:!0}:{expectedUpdatedAt:$.baseUpdatedAt}})}catch{Z={type:"error",category:"network",errors:[{code:"NETWORK_ERROR",message:"Failed to save note."}]}}if(N.current=!1,j.current=null,Z.type==="error"){m.current||(m.current=$),ne();const X=Z.errors[0];if(X.code===nr&&!A){const k=X.details?.extensions?.currentUpdatedAt;return f.current=!0,!B&&L.current&&(O("conflict"),M.current(k??S.current)),"conflict"}return!B&&L.current&&(O("error"),C.current(X.message)),"error"}f.current=!1,S.current=Z.updateNote.updatedAt;const K=!B&&L.current,re=T.notes.detail(t);await c.cancelQueries({queryKey:re,exact:!0}),K&&F.current(Z.updateNote.updatedAt),c.setQueryData(re,X=>X&&{...X,title:Z.updateNote.title,content:$.content,...$.layout?{layout:$.layout}:{},updatedAt:Z.updateNote.updatedAt}),ye({noteId:t,updatedAt:Z.updateNote.updatedAt,editSessionId:l.current});const I=m.current;return I?.baseUpdatedAt===$.baseUpdatedAt?(m.current={...I,baseUpdatedAt:Z.updateNote.updatedAt},ne()):I||Le(t),K&&(m.current?v("pending"):(v("saved"),c.invalidateQueries({queryKey:T.notes.listAll(),exact:!1}),c.invalidateQueries({queryKey:T.notes.tagListAll(),exact:!1}),c.invalidateQueries({queryKey:T.notes.backReferencesAll(),exact:!1}),c.invalidateQueries({queryKey:T.notes.graph(),exact:!0}))),m.current||y.current?Q({silent:B}):"saved"})();return j.current=U,U},[D,l,t,ne,c,O]),p=n.useCallback((A,B={})=>{if(m.current=A,De(t,A),f.current){O("conflict");return}if(O("pending"),D(),B.immediate){Q();return}h.current=window.setTimeout(()=>{Q()},ar)},[D,Q,t,O]),E=n.useCallback(A=>{if(m.current=A,De(t,A),_(null),A.baseUpdatedAt!==S.current){G(S.current);return}p(A)},[t,p,G]),w=n.useCallback(()=>{D(),m.current=null,j.current=null,y.current=!1,f.current=!1,Le(t),_(null),v("saved")},[D,t]),V=n.useCallback(()=>{D(),j.current=null,y.current=!1,f.current=!1,O(m.current?"pending":"saved")},[D,O]),je=n.useCallback(()=>{Le(t),_(null)},[t]),oe=n.useCallback(()=>m.current,[]),Ne=n.useCallback(A=>{D(),G(A)},[D,G]);return n.useEffect(()=>{M.current=i,C.current=u,F.current=d},[i,u,d]),n.useEffect(()=>(L.current=!0,()=>{L.current=!1}),[]),n.useEffect(()=>{m.current||N.current||f.current||(S.current=r,v("saved"))},[r]),n.useEffect(()=>{m.current=null,N.current=!1,j.current=null,y.current=!1,f.current=!1,S.current=r,_(tr(t)),v("saved")},[t]),n.useEffect(()=>{const A=B=>{!m.current&&!N.current&&!f.current||(B.preventDefault(),B.returnValue="")};return window.addEventListener("beforeunload",A),()=>{window.removeEventListener("beforeunload",A)}},[]),n.useEffect(()=>()=>{D(),m.current&&!f.current&&Q({silent:!0})},[D,Q]),{saveStatus:b,localDraft:P,serverUpdatedAtRef:S,hasUnsavedChanges:b!=="saved",buildDraft:Y,queueSave:p,flushPendingSave:Q,restoreLocalDraft:E,discardLocalDraft:je,clearDrafts:w,resolveConflict:V,pauseForConflict:Ne,getPendingDraft:oe,setServerUpdatedAt:J}}const sr=/[:{}[\],&*#?|<>=!%@`-]/,or=t=>t.trim().toLowerCase().replace(/\s+/g,"-").replace(/[\\/:*?"<>|]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"untitled-note",lr=t=>t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;"),ge=t=>t?sr.test(t)||/^\s|\s$/.test(t)?JSON.stringify(t):t:'""',be=t=>{if(!t)return;const a=Number(t);return Number.isFinite(a)?new Date(a).toISOString():t},Ve=(t,a)=>`${or(t)}.${a}`,ir=({id:t,title:a,createdAt:r,updatedAt:l})=>{const s=["---",`title: ${ge(a)}`,`note_id: ${ge(t)}`],d=be(r),i=be(l);return d&&s.push(`created_at: ${ge(d)}`),i&&s.push(`updated_at: ${ge(i)}`),s.push("source: ocean-brain","---"),s.join(`
2
- `)},cr=(t,a,r=!1)=>r?`${ir(a)}
3
-
4
- ${t}`:t,dr=(t,a,{includeMetadata:r=!1,mode:l="fragment"}={})=>{const s=r?`<!--
5
- source: ocean-brain
6
- note_id: ${a.id}
7
- title: ${a.title}
8
- created_at: ${be(a.createdAt)??""}
9
- updated_at: ${be(a.updatedAt)??""}
10
- -->
11
- `:"";return l==="fragment"?`${s}${t}`:`<!doctype html>
12
- <html lang="ko">
13
- <head>
14
- <meta charset="utf-8" />
15
- <meta name="viewport" content="width=device-width, initial-scale=1" />
16
- <title>${lr(a.title)}</title>
17
- </head>
18
- <body>
19
- ${s}${t}
20
- </body>
21
- </html>`},Fe=(t,a,r)=>{const l=new Blob([t],{type:r}),s=URL.createObjectURL(l),d=document.createElement("a");d.href=s,d.download=a,document.body.appendChild(d),d.click(),d.remove(),URL.revokeObjectURL(s)},St=Ra(ve),pe=t=>{const a=/^\d+$/.test(t)?Number(t):Date.parse(t);return Number.isFinite(a)?a:null},Pe=t=>{const a=pe(t);return W(a??Number(t)).format("YYYY-MM-DD HH:mm:ss")},ur=(t,a)=>Ta(pe(t),a),Oe=()=>pn(),pr="NOTE_UPDATE_CONFLICT",mr=2200,fr=t=>t?.extensions?.currentUpdatedAt,ct=(t,a)=>{const r=pe(t),l=pe(a);return r===null||l===null?t===a?0:1:r-l},hr=t=>{const a=t.trim();if(!a)return null;try{const r=new URL(a);return r.protocol==="http:"||r.protocol==="https:"?r.toString():null}catch{return null}},xr={narrow:"max-w-[640px]",wide:"max-w-[896px]",full:"max-w-full px-4"},gr=e.jsx(Ge,{title:"Loading note",variant:"none",children:e.jsxs("main",{className:"mx-auto max-w-[896px]",children:[e.jsx(ie,{className:"mb-8",height:"66px"}),e.jsx(ie,{className:"ml-12 mb-8",height:"150px"}),e.jsx(ie,{className:"mb-5",height:"80px"}),e.jsx(ie,{height:"80px"})]})}),yr=t=>({id:t?.key??"",key:t?.key??"",name:t?.name??"",value:t?.value??"",valueType:t?.valueType??"text",persistedKey:t?.key}),vr=t=>{if(Array.isArray(t))return t;const a=t?.keys;return Array.isArray(a)?a:[]},Be=(t=[])=>t.map(yr),Rt=(t,a)=>{const r=[],l=new Set(a);for(const s of t){const d=s.key.trim();if(!d)continue;const i=s.value.trim(),u=!!s.persistedKey&&(s.valueType==="number"||s.valueType==="date"||s.valueType==="select"||s.valueType==="url");if(!i&&u){l.add(s.persistedKey);continue}!i&&s.valueType!=="text"&&s.valueType!=="boolean"||r.push({key:d,name:s.name.trim()||d,value:s.valueType==="boolean"?i||"false":i,valueType:s.valueType})}return{set:r.sort((s,d)=>s.key.localeCompare(d.key)),deleteKeys:Array.from(l).sort()}},le=(t,a=[])=>JSON.stringify(Rt(t,a)),br=({noteId:t,properties:a=[],expectedUpdatedAt:r,editSessionId:l,disabled:s,onSaved:d})=>{const i=Ye(),u=we(),[c,h]=n.useState(()=>Be(a)),[m,N]=n.useState([]),[j,y]=n.useState("idle"),S=n.useRef(c),f=n.useRef(m),L=n.useRef(r),F=n.useRef(le(c)),M=n.useRef(null),C=n.useRef(!1),b=n.useRef(!1),v=_e({queryKey:T.notes.propertyKeys({limit:50}),queryFn:async()=>{const p=await Ma({limit:50});if(p.type==="error")throw p;return p.notePropertyKeys.keys}});n.useEffect(()=>{const p=Be(a);h(p),N([]),F.current=le(p),y("idle")},[a]),n.useEffect(()=>{S.current=c},[c]),n.useEffect(()=>{f.current=m},[m]),n.useEffect(()=>{L.current=r},[r]);const P=vr(v.data),_=P.filter(p=>!c.some(E=>E.key===p.key)),D=P.length>0,O=n.useCallback(async()=>{const p=le(S.current,f.current);if(s||p===F.current)return;if(C.current){b.current=!0;return}const E=Rt(S.current,f.current);if(!(E.set.length===0&&E.deleteKeys.length===0)){C.current=!0,b.current=!1,y("saving");try{const w=await Ha({id:t,set:E.set,deleteKeys:E.deleteKeys,editSessionId:l,expectedUpdatedAt:L.current});if(w.type==="error"){y("error"),i(w.errors[0]?.message??"Failed to save properties.");return}L.current=w.updateNoteProperties.updatedAt,F.current=le(Be(w.updateNoteProperties.properties??[])),d(w.updateNoteProperties),u.invalidateQueries({queryKey:T.notes.propertyKeysAll(),exact:!1}),y("saved")}catch{y("error"),i("Failed to save properties.")}finally{C.current=!1,b.current&&(b.current=!1,O())}}},[s,l,t,d,u,i]);n.useEffect(()=>{if(M.current&&clearTimeout(M.current),!(s||le(c,m)===F.current))return M.current=setTimeout(()=>{O()},500),()=>{M.current&&clearTimeout(M.current)}},[m,s,c,O]);const J=p=>{h(E=>[...E,{id:p.key,key:p.key,name:p.name,value:"",valueType:p.valueType,persistedKey:void 0}]),N(E=>E.filter(w=>w!==p.key))},Y=(p,E)=>{h(w=>w.map(V=>V.id===p?{...V,...E}:V))},ne=p=>{p.persistedKey&&N(E=>[...new Set([...E,p.persistedKey])]),h(E=>E.filter(w=>w.id!==p.id))},G=le(c,m)!==F.current,Q=s||!G&&j==="idle"?null:j==="saving"?"Saving...":j==="error"?"Save failed":G?"Waiting...":"Saved";return e.jsxs(We,{title:"Properties",icon:e.jsx($a,{className:"h-3.5 w-3.5"}),ariaLabel:"Note properties",action:e.jsxs(e.Fragment,{children:[Q&&e.jsx(x,{as:"span",variant:"micro",tone:j==="error"?"error":"tertiary",className:"px-1",children:Q}),D&&e.jsx(R,{asChild:!0,size:"sm",variant:"ghost",children:e.jsxs(Ke,{to:rt,search:{page:1},children:[e.jsx(_a,{className:"h-3 w-3"}),"Manage"]})})]}),children:[c.length===0?e.jsx(x,{as:"p",variant:"label",tone:"tertiary",className:"px-1 py-2",children:"No properties yet."}):e.jsx("div",{className:"divide-y divide-border-subtle",children:c.map(p=>{const E=p.valueType==="url"?hr(p.value):null;return e.jsxs("div",{className:"group grid gap-2 py-2 sm:grid-cols-[minmax(0,180px)_minmax(0,1fr)_auto] sm:items-center",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2 px-1",children:[e.jsx(x,{as:"span",variant:"label",tone:"secondary",className:"truncate",children:p.name}),e.jsx(x,{as:"span",variant:"micro",tone:"tertiary",className:"hidden truncate font-mono sm:inline",children:p.key})]}),p.valueType==="boolean"?e.jsxs(nt,{size:"sm",variant:"ghost",value:p.value||"false",disabled:s,onValueChange:w=>Y(p.id,{value:w}),children:[e.jsx(He,{value:"false",children:"False"}),e.jsx(He,{value:"true",children:"True"})]}):p.valueType==="select"?e.jsx(nt,{size:"sm",variant:"ghost",value:p.value,placeholder:"Select option",disabled:s,onValueChange:w=>Y(p.id,{value:w}),children:(P.find(w=>w.key===p.key)?.options??[]).map(w=>e.jsx(He,{value:w.value,children:w.label},w.id))}):p.valueType==="url"?e.jsxs("div",{className:"flex min-w-0 items-center gap-1",children:[e.jsx($e,{className:"min-w-0",size:"sm",variant:"ghost",type:"url","aria-label":"Property value",placeholder:"https://example.com",value:p.value,disabled:s,onChange:w=>Y(p.id,{value:w.target.value})}),E?e.jsx(R,{asChild:!0,size:"icon-sm",variant:"ghost","aria-label":`Open ${p.name}`,className:"shrink-0 text-fg-tertiary",children:e.jsx("a",{href:E,target:"_blank",rel:"noopener noreferrer",title:E,children:e.jsx(Nt,{className:"h-4 w-4"})})}):null]}):e.jsx($e,{size:"sm",variant:"ghost",type:p.valueType==="date"?"date":p.valueType==="number"?"number":"text","aria-label":"Property value",placeholder:"Value",value:p.value,disabled:s,onChange:w=>Y(p.id,{value:w.target.value})}),e.jsx(R,{type:"button",size:"icon-sm",variant:"ghost","aria-label":`Remove ${p.name}`,disabled:s,className:"justify-self-end text-fg-tertiary sm:opacity-0 sm:group-hover:opacity-100 sm:focus-visible:opacity-100",onClick:()=>ne(p),children:e.jsx(Da,{className:"h-4 w-4"})})]},p.id)})}),e.jsx("div",{className:"mt-2 flex flex-wrap items-center gap-2",children:v.isLoading?e.jsx(R,{type:"button",size:"sm",variant:"ghost",disabled:!0,children:"Loading properties..."}):_.length>0?e.jsxs(La,{children:[e.jsx(Va,{asChild:!0,children:e.jsxs(R,{type:"button",size:"sm",variant:"ghost",disabled:s,children:[e.jsx(ze,{className:"h-4 w-4"}),"Add property"]})}),e.jsxs(Fa,{align:"start",sideOffset:6,className:"max-h-80 w-[min(22rem,calc(100vw-2rem))]",style:{overflowY:"auto"},children:[e.jsx(Pa,{children:e.jsx(x,{as:"span",variant:"label",weight:"semibold",children:"Add property"})}),e.jsx(Oa,{}),_.map(p=>e.jsxs(Ba,{className:"flex-col items-start gap-0.5 whitespace-normal",onClick:()=>J(p),children:[e.jsxs("span",{className:"flex w-full min-w-0 items-center justify-between gap-3",children:[e.jsx(x,{as:"span",variant:"label",weight:"medium",className:"truncate",children:p.name}),e.jsx(x,{as:"span",variant:"micro",tone:"tertiary",className:"shrink-0 capitalize",children:p.valueType})]}),e.jsx(x,{as:"span",variant:"micro",tone:"tertiary",className:"font-mono",children:p.key})]},p.key))]})]}):D?e.jsx(x,{as:"span",variant:"micro",tone:"tertiary",className:"px-1",children:"All shared properties are attached."}):e.jsxs(Ke,{to:rt,search:{page:1},className:"focus-ring-soft inline-flex items-center gap-2 rounded-[12px] px-2.5 py-1.5 text-sm font-medium text-fg-secondary outline-none hover:bg-hover-subtle hover:text-fg-default",children:[e.jsx(ze,{className:"h-4 w-4"}),"Create property definition"]})})]})};function wr({id:t}){const a=Ye(),r=St.useNavigate(),l=we(),s=n.useRef(null),d=n.useRef(null),i=n.useRef(Oe()),u=pt({queryKey:T.notes.detail(t),queryFn:async()=>{const o=await Na(t);if(o.type==="error")throw o;return o.note},gcTime:0}),c=u.data,[h,m]=n.useState(c.title),[N,j]=n.useState(()=>Pe(c.updatedAt)),[y,S]=n.useState(c.updatedAt),[f,L]=n.useState(()=>Date.now()),[F,M]=n.useState(c.pinned),[C,b]=n.useState(c.layout||"wide"),[v,P]=n.useState(!1),[_,D]=n.useState(!1),[O,J]=n.useState(!1),[Y,ne]=n.useState("markdown"),[G,Q]=n.useState(!1),[p,E]=n.useState("fragment"),[w,V]=n.useState(null),[je,oe]=n.useState(null),[Ne,A]=n.useState(0),[B,$]=n.useState(!1),U=n.useRef(c.updatedAt),Z=n.useRef(t),K=n.useRef(null),re=n.useRef(!1),I=n.useCallback(o=>{j(Pe(o)),S(o),L(Date.now())},[]),X=rr({noteId:t,initialContent:c.content,initialUpdatedAt:c.updatedAt,editSessionIdRef:i,getContent:()=>s.current?.getContent(),onSaved:o=>{K.current=null,U.current=o,I(o),$(!0)},onConflict:o=>{V({type:"updated",updatedAt:o,source:"unknown"}),a("This note changed elsewhere. Choose how to resolve the draft.")},onError:a}),{saveStatus:k,localDraft:ee,serverUpdatedAtRef:te,hasUnsavedChanges:ce,buildDraft:fe,queueSave:he,flushPendingSave:xe,restoreLocalDraft:Tt,discardLocalDraft:Et,clearDrafts:Ce,resolveConflict:Mt,pauseForConflict:de,getPendingDraft:ke,setServerUpdatedAt:ae}=X,Ht=n.useCallback(async()=>{if(re.current)return re.current=!1,!1;if(k==="conflict")return a("Resolve the note conflict before leaving."),!0;const o=await xe();return o==="error"?(a("Save failed. Stay on this note and try again."),!0):o==="conflict"},[xe,k,a]);Wa({disabled:k==="saved",enableBeforeUnload:!1,shouldBlockFn:Ht}),n.useEffect(()=>{if(ce){c.updatedAt!==te.current&&ct(c.updatedAt,te.current)>0&&de(c.updatedAt);return}const o=U.current;if(!(c.updatedAt!==o&&ct(c.updatedAt,o)<0)&&(M(c.pinned),b(c.layout||"wide"),ae(c.updatedAt),m(c.title),I(c.updatedAt),o!==c.updatedAt)){const g=s.current?.getContent();U.current=c.updatedAt,(g===void 0||g!==c.content)&&(oe(null),A(z=>z+1))}},[ce,c.layout,c.pinned,c.title,c.updatedAt,de,te,ae,I]),n.useEffect(()=>{Z.current!==t&&(Z.current=t,i.current=Oe(),U.current=c.updatedAt,K.current=null,V(null),oe(null),A(o=>o+1),$(!1))},[t,c.updatedAt]),n.useEffect(()=>{if(k!=="saved")return;const o=window.setTimeout(()=>{L(Date.now())},Ca(pe(y),f));return()=>window.clearTimeout(o)},[y,f,k]),n.useEffect(()=>{if(!B)return;const o=window.setTimeout(()=>{$(!1)},mr);return()=>window.clearTimeout(o)},[B]),n.useEffect(()=>{w?.type!=="updated"||k==="conflict"||w.updatedAt!==c.updatedAt||(U.current=c.updatedAt,ae(c.updatedAt),I(c.updatedAt),V(null))},[w,c.updatedAt,k,ae,I]),n.useEffect(()=>ka(o=>{if(o.noteId===t&&!(o.source==="web"&&o.editSessionId===i.current)){if(o.type==="mcp.note.updated"||o.type==="web.note.updated"){if(o.updatedAt===c.updatedAt||o.updatedAt===te.current)return;if(ce){de(o.updatedAt),V({type:"updated",updatedAt:o.updatedAt,source:o.source});return}V({type:"updated",updatedAt:o.updatedAt,source:o.source});return}o.type==="mcp.note.deleted"&&V({type:"deleted",source:o.source})}}),[ce,t,c.updatedAt,de,te]);const{onCreate:Dt,onDelete:Lt,onPinned:Vt,deleteWarningDialog:Ft}=Aa(),Pt=()=>{he(fe(h))},Ot=o=>{m(o),he(fe(o))},Xe=()=>{he(fe(h),{immediate:!0})},Bt=async o=>{if(ce){b(o),he(fe(h,{layout:o}),{immediate:!0}),a("Layout will be saved with your draft.");return}const g=await Ie({id:t,layout:o,editSessionId:i.current,expectedUpdatedAt:te.current});if(g.type==="error"){g.errors[0].code===pr&&(K.current=o,b(o),de(fr(g.errors[0].details)??te.current)),a(g.errors[0].message);return}K.current=null,await l.cancelQueries({queryKey:T.notes.detail(t),exact:!0}),U.current=g.updateNote.updatedAt,ae(g.updateNote.updatedAt),l.setQueryData(T.notes.detail(t),z=>z&&{...z,layout:o,updatedAt:g.updateNote.updatedAt}),ye({noteId:t,updatedAt:g.updateNote.updatedAt,editSessionId:i.current}),I(g.updateNote.updatedAt),b(o),a("Layout has been updated.")},_t=()=>({id:t,title:h,createdAt:c.createdAt,updatedAt:te.current||c.updatedAt}),$t=async()=>{const o=s.current?.getMarkdown();if(o===void 0){a("Markdown is not ready yet.");return}try{await navigator.clipboard.writeText(o),a("Copied note as Markdown.")}catch{a("Failed to copy Markdown.")}},It=()=>{const o=s.current?.getMarkdown();if(o===void 0){a("Markdown is not ready yet.");return}try{Fe(o,Ve(h,"md"),"text/markdown;charset=utf-8"),a("Downloaded note as Markdown.")}catch{a("Failed to download Markdown.")}},Ut=()=>{const o=_t();try{if(Y==="markdown"){const g=s.current?.getMarkdown();if(g===void 0){a("Markdown is not ready yet.");return}Fe(cr(g,o,G),Ve(h,"md"),"text/markdown;charset=utf-8")}else{const g=s.current?.getHtml();if(g===void 0){a("HTML is not ready yet.");return}Fe(dr(g,o,{includeMetadata:G,mode:p}),Ve(h,"html"),"text/html;charset=utf-8")}J(!1),a("Downloaded note.")}catch{a("Failed to download note.")}},Zt=async()=>{const o=await u.refetch();if(o.error||!o.data){a("Failed to reload the latest note state.");return}Ce(),K.current=null,U.current=o.data.updatedAt,ae(o.data.updatedAt),m(o.data.title),b(o.data.layout||"wide"),I(o.data.updatedAt),oe(null),A(g=>g+1),V(null)},Kt=async()=>{if(ke()){K.current=null,V(null),await xe({ignoreConflict:!0});return}const g=K.current;if(g){const z=await Ie({id:t,layout:g,editSessionId:i.current,force:!0});if(z.type==="error"){a(z.errors[0].message);return}K.current=null,await l.cancelQueries({queryKey:T.notes.detail(t),exact:!0}),U.current=z.updateNote.updatedAt,Mt(),V(null),ae(z.updateNote.updatedAt),l.setQueryData(T.notes.detail(t),Te=>Te&&{...Te,layout:g,updatedAt:z.updateNote.updatedAt}),ye({noteId:t,updatedAt:z.updateNote.updatedAt,editSessionId:i.current}),I(z.updateNote.updatedAt),b(g);return}V(null),await xe({ignoreConflict:!0})},et=async()=>{const o=ke();if(!o)return;const g=await Ea({title:at(o.title||"untitled"),content:at(o.content),layout:o.layout??C});if(g.type==="error"){a(g.errors[0].message);return}re.current=!0,K.current=null,V(null),Ce(),Promise.resolve(r({to:ve,params:{id:g.createNote.id}})).finally(()=>{re.current=!1})},zt=()=>{ee&&(m(ee.title),ee.layout&&b(ee.layout),oe(ee.content),A(o=>o+1),Tt(ee))},qt=()=>{Et()},Qt=ee?W(ee.createdAt).format("YYYY-MM-DD HH:mm:ss"):null,Ae=k==="saved"&&B,Yt=ur(y,f),Gt=Pe(c.createdAt),Wt=k==="pending"?"Saving...":k==="saving"?"Saving now...":k==="error"?"Save failed. Try again.":k==="conflict"?"Save paused: changed elsewhere":`Saved ${Yt}`,Jt=q("inline-flex items-center gap-2 transition-colors",k==="saved"&&!Ae&&"text-fg-secondary",Ae&&"text-accent-success",(k==="pending"||k==="saving")&&"text-fg-default",(k==="error"||k==="conflict")&&"text-fg-error"),Se=q("save-progress-ring flex h-4 w-4 shrink-0 items-center justify-center rounded-full",(k==="pending"||k==="saving")&&"save-progress-ring-active",k==="saved"&&Ae&&"save-progress-ring-complete",(k==="error"||k==="conflict")&&"save-progress-ring-error"),Xt=k==="saving"?e.jsx("span",{className:Se,"aria-hidden":!0,children:e.jsx("span",{className:"h-2 w-2 rounded-full bg-elevated"})}):k==="pending"?e.jsx("span",{className:Se,"aria-hidden":!0,children:e.jsx("span",{className:"h-2 w-2 rounded-full bg-elevated"})}):k==="error"||k==="conflict"?e.jsx(Ia,{className:"h-3.5 w-3.5",weight:"fill"}):e.jsx("span",{className:Se,"aria-hidden":!0,children:e.jsx("span",{className:"h-2 w-2 rounded-full bg-elevated"})}),ea=e.jsxs(x,{as:"span",variant:"label",weight:"medium",className:Jt,role:"status","aria-live":"polite",title:N,children:[Xt,Wt]}),Re=k==="conflict"&&w?.type==="updated",ta=Re?ke():null,aa=w!==null&&!(w.type==="updated"&&!Re&&w.updatedAt===c.updatedAt);return e.jsx(Ge,{title:h,variant:"none",children:e.jsxs("main",{className:q("mx-auto",xr[C]),children:[e.jsx("div",{className:"surface-floating sticky top-20 z-[1001] mb-7 px-5 pt-4 pb-3.5",children:e.jsxs("div",{className:"flex flex-col gap-3.5",children:[e.jsxs("div",{className:"flex items-start justify-between gap-5",children:[e.jsxs("div",{className:"min-w-0 flex-1 pt-0.5",children:[e.jsx(x,{as:"div",variant:"micro",weight:"semibold",tracking:"widest",transform:"uppercase",tone:"tertiary",className:"mb-1.5",children:"Thought in progress"}),e.jsx("input",{ref:d,placeholder:"Title",className:"text-heading sm:text-display w-full bg-transparent font-semibold leading-[1.25] tracking-[-0.02em] outline-none",type:"text",value:h,onChange:o=>Ot(o.target.value)})]}),e.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[e.jsx(ft,{button:e.jsx(ht,{label:"Note actions",size:"lg"}),items:[{name:"Copy Markdown",onClick:$t},{name:"Download Markdown",onClick:It},{name:"Download in another format",onClick:()=>J(!0)},{type:"separator",key:"export-separator"},{name:F?"Unpin":"Pin",onClick:()=>Vt(t,F,()=>{M(o=>!o)})},{name:"Change layout",onClick:()=>P(!0)},{type:"separator"},{name:"Clone this note",onClick:()=>Dt(d.current?.value||"untitled",s.current?.getContent()||"",C)},{name:"Restore previous version",onClick:()=>D(!0)},{type:"separator"},{name:"Delete",onClick:()=>Lt(t,()=>{r({to:tt,search:{page:1}})})}]}),e.jsx(R,{size:"sm",variant:"subtle",isLoading:k==="saving",disabled:k==="conflict",onClick:Xe,children:"Save"})]})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-x-2.5 gap-y-1.5 border-t border-border-subtle/80 pt-3",children:[F&&e.jsxs(x,{as:"span",variant:"label",weight:"medium",tone:"secondary",className:"inline-flex items-center gap-1.5",children:[e.jsx(Sa,{className:"h-3 w-3",weight:"fill"}),"Pinned"]}),F&&e.jsx("span",{className:"h-1 w-1 rounded-full bg-border-secondary"}),ea,e.jsx("span",{className:"h-1 w-1 rounded-full bg-border-secondary"}),e.jsxs(x,{as:"span",variant:"micro",weight:"medium",tone:"tertiary",children:["Created ",Gt]})]})]})}),ee&&e.jsx(st,{tone:"danger",className:"mb-6",children:e.jsxs("div",{className:"flex w-full flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[e.jsxs("span",{children:["A draft from ",Qt," is saved only in this browser."]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(R,{type:"button",size:"sm",variant:"subtle",className:"self-start",onClick:zt,children:"Restore draft"}),e.jsx(R,{type:"button",size:"sm",variant:"ghost",className:"self-start",onClick:qt,children:"Discard"})]})]})}),k==="error"&&e.jsx(st,{tone:"danger",className:"mb-6",children:e.jsxs("div",{className:"flex w-full flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[e.jsx("span",{children:"Save failed. Your latest draft is still available here. Retry before leaving this note."}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(R,{type:"button",size:"sm",variant:"subtle",className:"self-start",onClick:Xe,children:"Retry save"}),e.jsx(R,{type:"button",size:"sm",variant:"ghost",className:"self-start",onClick:()=>{et()},children:"Save as new note"})]})]})}),e.jsx(br,{noteId:t,properties:c.properties,expectedUpdatedAt:te.current,editSessionId:i.current,disabled:k!=="saved",onSaved:o=>{U.current=o.updatedAt,ae(o.updatedAt),I(o.updatedAt),$(!0),l.setQueryData(T.notes.detail(t),g=>g&&{...g,updatedAt:o.updatedAt,properties:o.properties}),ye({noteId:t,updatedAt:o.updatedAt,editSessionId:i.current})}}),e.jsx(er,{ref:s,content:je??c.content,currentNoteId:t,onChange:Pt},`${t}:${Ne}`),e.jsx(Ue,{fallback:e.jsx(ie,{className:"mb-5",height:"80px"}),errorTitle:"Failed to load reminders",errorDescription:"Retry loading reminder details for this note.",renderError:({error:o,retry:g})=>e.jsx(Ze,{title:"Failed to load reminders",description:"Retry loading reminder details for this note.",error:o,onRetry:g,showBackAction:!1,showHomeAction:!1}),children:e.jsx(fn,{noteId:t})}),e.jsx(Ue,{fallback:e.jsx(ie,{height:"80px"}),errorTitle:"Failed to load back references",errorDescription:"Retry loading notes that link back here.",renderError:({error:o,retry:g})=>e.jsx(Ze,{title:"Failed to load back references",description:"Retry loading notes that link back here.",error:o,onRetry:g,showBackAction:!1,showHomeAction:!1}),children:e.jsx(dn,{noteId:t,render:o=>o&&o.length>0&&e.jsx(We,{icon:e.jsx(Nt,{className:"h-3.5 w-3.5"}),title:"Back References",children:e.jsx("ul",{className:"flex flex-col",children:o.map(g=>e.jsx("li",{children:e.jsxs(Ke,{to:ve,params:{id:g.id},className:"flex items-center gap-2 rounded-[10px] px-2.5 py-1.5 text-fg-secondary transition-colors hover:bg-hover-subtle hover:text-fg-default",children:[e.jsx(an,{className:"h-3.5 w-3.5 shrink-0 text-fg-tertiary"}),e.jsx(x,{as:"span",variant:"body",weight:"medium",className:"text-current",children:g.title})]})},g.id))})})})}),e.jsx(rn,{isOpen:v,onClose:()=>P(!1),onSave:Bt,currentLayout:C}),e.jsx(ln,{isOpen:aa,isDeleted:w?.type==="deleted",isConflict:Re,hasDraft:ta!==null,source:w?.source??"unknown",isReloading:u.isRefetching,onReload:Zt,onOverwrite:()=>{Kt()},onCloneDraft:()=>{et()},onOpenTrash:()=>r({to:tt,search:{page:1}})}),e.jsxs(H,{isOpen:O,onClose:()=>J(!1),variant:"compact",children:[e.jsx(H.Header,{title:"Download in another format",onClose:()=>J(!1)}),e.jsx(H.Body,{children:e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(x,{as:"div",variant:"body",weight:"semibold",tone:"secondary",children:"Format"}),e.jsxs("div",{className:"grid gap-2 sm:grid-cols-2",children:[e.jsx(ue,{title:"Markdown",description:"Good for GitHub, static blogs, and other note apps.",selected:Y==="markdown",onClick:()=>ne("markdown")}),e.jsx(ue,{title:"HTML",description:"Good for web documents or CMS editors.",selected:Y==="html",onClick:()=>ne("html")})]})]}),e.jsxs("div",{className:"flex items-start gap-3 rounded-[14px] border border-border-subtle bg-subtle/60 p-3",children:[e.jsx(mt,{size:"sm",checked:G,onChange:o=>Q(o.target.checked),className:"mt-0.5","aria-label":"Include metadata"}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(x,{as:"span",variant:"body",weight:"semibold",children:"Include metadata"}),e.jsx(x,{as:"span",variant:"label",tone:"tertiary",children:"Add the title, note id, timestamps, and Ocean Brain source information."})]})]}),Y==="html"&&e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(x,{as:"div",variant:"body",weight:"semibold",tone:"secondary",children:"HTML style"}),e.jsxs("div",{className:"grid gap-2 sm:grid-cols-2",children:[e.jsx(ue,{title:"Content only",description:"Save only the note body HTML.",selected:p==="fragment",onClick:()=>E("fragment")}),e.jsx(ue,{title:"Full HTML document",description:"Save a complete HTML file that opens in a browser.",selected:p==="standalone",onClick:()=>E("standalone")})]})]})]})}),e.jsx(H.Footer,{children:e.jsxs(me,{children:[e.jsx(R,{variant:"ghost",size:"sm",onClick:()=>J(!1),children:"Cancel"}),e.jsx(R,{variant:"primary",size:"sm",onClick:Ut,children:"Download"})]})})]}),e.jsx(cn,{isOpen:_,noteId:t,onClose:()=>D(!1),onRestored:o=>{i.current=Oe(),Ce(),K.current=null,U.current=o.updatedAt,V(null),ae(o.updatedAt),I(o.updatedAt)}}),Ft]})})}function Mr(){const{id:t}=St.useParams();if(!t)throw new Error("Note id is required.");return e.jsx(Ue,{fallback:gr,errorTitle:"Failed to load note",errorDescription:"Retry loading the note editor.",resetKeys:[t],renderError:({error:a,retry:r})=>e.jsx(Ge,{title:"Note",variant:"none",children:e.jsx(Ze,{title:"Failed to load note",description:"Retry loading the note editor.",error:a,onRetry:r})}),children:e.jsx(wr,{id:t},t)})}export{wr as NoteContent,Mr as default};