vertex-notes 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-WM6QVD53.js → chunk-EEEL6ZKK.js} +10 -3
- package/dist/chunk-EEEL6ZKK.js.map +1 -0
- package/dist/{chunk-XGZKUOFI.js → chunk-URRSVCB7.js} +2 -2
- package/dist/commands/capture.js +2 -2
- package/dist/commands/daily.js +2 -2
- package/dist/commands/delete.js +2 -2
- package/dist/commands/edit.js +2 -2
- package/dist/commands/export.js +2 -2
- package/dist/commands/hello.js +1 -1
- package/dist/commands/help.js +1 -1
- package/dist/commands/howto.js +7 -1
- package/dist/commands/howto.js.map +1 -1
- package/dist/commands/import.js +2 -2
- package/dist/commands/interactive.js +2 -2
- package/dist/commands/login.js +1 -1
- package/dist/commands/new.js +2 -2
- package/dist/commands/notes.js +2 -2
- package/dist/commands/restore.js +2 -2
- package/dist/commands/search.js +2 -2
- package/dist/commands/status.js +2 -2
- package/dist/commands/syntax.js +7 -1
- package/dist/commands/syntax.js.map +1 -1
- package/dist/commands/tags.js +2 -2
- package/dist/commands/today.js +2 -2
- package/dist/commands/trash/empty.js +2 -2
- package/dist/commands/trash/index.js +2 -2
- package/dist/commands/view.js +2 -2
- package/dist/lib/client.js +2 -2
- package/dist/lib/md-to-tiptap.js +3 -1
- package/dist/lib/md-to-tiptap.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-WM6QVD53.js.map +0 -1
- /package/dist/{chunk-XGZKUOFI.js.map → chunk-URRSVCB7.js.map} +0 -0
|
@@ -254,7 +254,8 @@ function mapTiptapTypeToBlockType(tiptapType) {
|
|
|
254
254
|
queryBlock: "query",
|
|
255
255
|
horizontalRule: "divider",
|
|
256
256
|
fileBlock: "file",
|
|
257
|
-
linkPreview: "text"
|
|
257
|
+
linkPreview: "text",
|
|
258
|
+
inlineMath: "text"
|
|
258
259
|
};
|
|
259
260
|
return MAP[tiptapType] ?? "text";
|
|
260
261
|
}
|
|
@@ -397,6 +398,10 @@ function extractTextFromNode(node) {
|
|
|
397
398
|
return content.map(extractTextFromNode).join("");
|
|
398
399
|
}
|
|
399
400
|
function extractInlineMarkdown(node) {
|
|
401
|
+
if (node.type === "inlineMath") {
|
|
402
|
+
const formula = node.attrs?.formula ?? "";
|
|
403
|
+
return `$${formula}$`;
|
|
404
|
+
}
|
|
400
405
|
if (typeof node.text === "string") {
|
|
401
406
|
const marks = node.marks ?? [];
|
|
402
407
|
let text = node.text;
|
|
@@ -754,7 +759,7 @@ function markdownToTiptap(md) {
|
|
|
754
759
|
function parseInline(text) {
|
|
755
760
|
if (!text) return [];
|
|
756
761
|
const nodes = [];
|
|
757
|
-
const regex = /(\*\*(
|
|
762
|
+
const regex = /(\*\*([^*]+)\*\*|\*([^*]+)\*|`([^`]+)`|~~([^~]+)~~|\[\[([^\]]+)\]\]|#([a-zA-Z][a-zA-Z0-9_/-]*)|\[([^\]]+)\]\(([^)]+)\)|(?<!\$)\$([^\$\n]+)\$(?!\$))/g;
|
|
758
763
|
let lastIndex = 0;
|
|
759
764
|
let match;
|
|
760
765
|
while ((match = regex.exec(text)) !== null) {
|
|
@@ -775,6 +780,8 @@ function parseInline(text) {
|
|
|
775
780
|
nodes.push({ type: "text", text: `#${match[7]}` });
|
|
776
781
|
} else if (match[8] && match[9]) {
|
|
777
782
|
nodes.push({ type: "text", text: match[8], marks: [{ type: "link", attrs: { href: match[9], target: "_blank" } }] });
|
|
783
|
+
} else if (match[10]) {
|
|
784
|
+
nodes.push({ type: "inlineMath", attrs: { formula: match[10] } });
|
|
778
785
|
}
|
|
779
786
|
lastIndex = match.index + match[0].length;
|
|
780
787
|
}
|
|
@@ -804,4 +811,4 @@ export {
|
|
|
804
811
|
markdownToTiptap,
|
|
805
812
|
VERTEX_VERSION
|
|
806
813
|
};
|
|
807
|
-
//# sourceMappingURL=chunk-
|
|
814
|
+
//# sourceMappingURL=chunk-EEEL6ZKK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../core/src/client.ts","../../core/src/auth.ts","../../core/src/storage.ts","../../core/src/notes.ts","../../core/src/tags.ts","../../core/src/links.ts","../../core/src/blocks.ts","../../core/src/snapshots.ts","../../core/src/search.ts","../../core/src/graph.ts","../../core/src/templates.ts","../../core/src/export.ts","../../core/src/md-to-tiptap.ts","../../core/src/index.ts"],"sourcesContent":["import { createClient, type SupabaseClient } from \"@supabase/supabase-js\";\n\nexport type { SupabaseClient };\n\nlet defaultClient: SupabaseClient | null = null;\n\nexport function createSupabaseClient(\n url: string,\n anonKey: string,\n): SupabaseClient {\n return createClient(url, anonKey, {\n auth: {\n autoRefreshToken: true,\n persistSession: true,\n },\n });\n}\n\nexport function initSupabaseClient(url: string, anonKey: string): void {\n defaultClient = createSupabaseClient(url, anonKey);\n}\n\nexport function getSupabaseClient(): SupabaseClient {\n if (!defaultClient) {\n throw new Error(\n \"Supabase client not initialized. Call initSupabaseClient() first.\",\n );\n }\n return defaultClient;\n}\n","import type { SupabaseClient, User, Session } from \"@supabase/supabase-js\";\nimport type { Profile } from \"./types\";\n\nexport type { User, Session };\n\nexport type OAuthProvider = \"google\" | \"github\";\n\nexport async function signInWithOAuth(\n client: SupabaseClient,\n provider: OAuthProvider,\n redirectTo?: string,\n) {\n return client.auth.signInWithOAuth({\n provider,\n options: { redirectTo },\n });\n}\n\nexport async function signInWithEmail(\n client: SupabaseClient,\n email: string,\n password: string,\n) {\n return client.auth.signInWithPassword({ email, password });\n}\n\nexport async function signUpWithEmail(\n client: SupabaseClient,\n email: string,\n password: string,\n) {\n return client.auth.signUp({ email, password });\n}\n\nexport async function signOut(client: SupabaseClient) {\n return client.auth.signOut();\n}\n\nexport async function getUser(client: SupabaseClient) {\n return client.auth.getUser();\n}\n\nexport async function getSession(client: SupabaseClient) {\n return client.auth.getSession();\n}\n\nexport async function getProfile(\n client: SupabaseClient,\n userId: string,\n): Promise<Profile | null> {\n const { data, error } = await client\n .from(\"profiles\")\n .select(\"*\")\n .eq(\"id\", userId)\n .maybeSingle();\n\n if (error) return null;\n return data as Profile;\n}\n\nexport function onAuthStateChange(\n client: SupabaseClient,\n callback: (event: string, session: unknown) => void,\n) {\n return client.auth.onAuthStateChange(callback);\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\n\nexport const DEFAULT_STORAGE_CAP = 50 * 1024 * 1024;\n\nexport async function getStorageInfo(\n client: SupabaseClient,\n userId: string,\n): Promise<{ used: number; cap: number }> {\n const { data, error } = await client\n .from(\"profiles\")\n .select(\"storage_used, storage_cap\")\n .eq(\"id\", userId)\n .maybeSingle();\n if (error || !data) return { used: 0, cap: DEFAULT_STORAGE_CAP };\n return {\n used: (data.storage_used as number) ?? 0,\n cap: (data.storage_cap as number) ?? DEFAULT_STORAGE_CAP,\n };\n}\n\nexport async function getStorageUsed(\n client: SupabaseClient,\n userId: string,\n): Promise<number> {\n const { used } = await getStorageInfo(client, userId);\n return used;\n}\n\nexport async function getStorageCap(\n client: SupabaseClient,\n userId: string,\n): Promise<number> {\n const { cap } = await getStorageInfo(client, userId);\n return cap;\n}\n\nexport async function checkStorageCap(\n client: SupabaseClient,\n userId: string,\n fileSize: number,\n): Promise<{ allowed: boolean; used: number; cap: number }> {\n const { used, cap } = await getStorageInfo(client, userId);\n return { allowed: used + fileSize <= cap, used, cap };\n}\n\nexport async function incrementStorageUsed(\n client: SupabaseClient,\n userId: string,\n bytes: number,\n): Promise<void> {\n const used = await getStorageUsed(client, userId);\n await client\n .from(\"profiles\")\n .update({ storage_used: used + bytes })\n .eq(\"id\", userId);\n}\n\nexport async function decrementStorageUsed(\n client: SupabaseClient,\n userId: string,\n bytes: number,\n): Promise<void> {\n const used = await getStorageUsed(client, userId);\n await client\n .from(\"profiles\")\n .update({ storage_used: Math.max(0, used - bytes) })\n .eq(\"id\", userId);\n}\n\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Note, NoteType } from \"./types\";\nimport { decrementStorageUsed } from \"./storage\";\n\nexport type FileCleanupFn = (urls: Array<{ src: string; filesize: number }>) => Promise<void>;\n\nexport interface CreateNoteParams {\n user_id: string;\n title?: string;\n slug?: string;\n note_type?: NoteType;\n daily_date?: string;\n}\n\nasync function uniqueTitle(\n client: SupabaseClient,\n userId: string,\n title: string,\n excludeNoteId?: string,\n): Promise<string> {\n const { data } = await client\n .from(\"notes\")\n .select(\"title\")\n .eq(\"user_id\", userId)\n .is(\"deleted_at\", null);\n\n const existing = new Set(\n ((data ?? []) as Array<{ title: string }>)\n .filter(() => true)\n .map((n) => n.title),\n );\n\n if (excludeNoteId) {\n const { data: self } = await client\n .from(\"notes\")\n .select(\"title\")\n .eq(\"id\", excludeNoteId)\n .single();\n if (self) existing.delete((self as { title: string }).title);\n }\n\n if (!existing.has(title)) return title;\n\n let counter = 1;\n while (existing.has(`${title}(${counter})`)) counter++;\n return `${title}(${counter})`;\n}\n\nexport async function createNote(\n client: SupabaseClient,\n params: CreateNoteParams,\n): Promise<Note> {\n const title = await uniqueTitle(client, params.user_id, params.title ?? \"Untitled\");\n const { data, error } = await client\n .from(\"notes\")\n .insert({\n user_id: params.user_id,\n title,\n slug: params.slug ?? null,\n note_type: params.note_type ?? \"regular\",\n daily_date: params.daily_date ?? null,\n })\n .select()\n .single();\n\n if (error) throw error;\n return data as Note;\n}\n\nexport async function getNote(\n client: SupabaseClient,\n noteId: string,\n): Promise<Note | null> {\n const { data, error } = await client\n .from(\"notes\")\n .select(\"*\")\n .eq(\"id\", noteId)\n .is(\"deleted_at\", null)\n .single();\n\n if (error) return null;\n return data as Note;\n}\n\nexport async function updateNote(\n client: SupabaseClient,\n noteId: string,\n updates: Partial<Pick<Note, \"title\" | \"slug\" | \"is_pinned\">>,\n userId?: string,\n): Promise<Note> {\n const payload = { ...updates };\n if (payload.title && userId) {\n payload.title = await uniqueTitle(client, userId, payload.title, noteId);\n }\n const { data, error } = await client\n .from(\"notes\")\n .update(payload)\n .eq(\"id\", noteId)\n .select()\n .single();\n\n if (error) throw error;\n return data as Note;\n}\n\nexport async function softDeleteNote(\n client: SupabaseClient,\n noteId: string,\n): Promise<void> {\n const { error } = await client\n .from(\"notes\")\n .update({ deleted_at: new Date().toISOString() })\n .eq(\"id\", noteId);\n\n if (error) throw error;\n}\n\nexport async function restoreNote(\n client: SupabaseClient,\n noteId: string,\n): Promise<void> {\n const { error } = await client\n .from(\"notes\")\n .update({ deleted_at: null })\n .eq(\"id\", noteId);\n\n if (error) throw error;\n}\n\nexport async function hardDeleteNote(\n client: SupabaseClient,\n noteId: string,\n onFilesRemoved?: FileCleanupFn,\n): Promise<void> {\n const { data: blocks } = await client\n .from(\"blocks\")\n .select(\"type, metadata, user_id\")\n .eq(\"note_id\", noteId);\n\n const fileUrls: Array<{ src: string; filesize: number }> = [];\n let userId: string | null = null;\n\n for (const b of (blocks ?? []) as Array<{ type: string; metadata: Record<string, unknown>; user_id: string }>) {\n if (!userId) userId = b.user_id;\n const tiptap = b.metadata?.tiptap as Record<string, unknown> | undefined;\n const attrs = (tiptap?.attrs ?? {}) as Record<string, unknown>;\n const src = attrs.src as string | undefined;\n if (src && (b.type === \"file\" || b.type === \"image\") && !src.startsWith(\"data:\")) {\n fileUrls.push({ src, filesize: (attrs.filesize as number) ?? 0 });\n }\n }\n\n for (const file of fileUrls) {\n try {\n const parsed = new URL(file.src);\n if (parsed.pathname.includes(\"/storage/v1/object/public/\")) {\n const pathParts = parsed.pathname.split(\"/storage/v1/object/public/\");\n if (pathParts.length >= 2) {\n const fullPath = decodeURIComponent(pathParts[1]);\n const slashIdx = fullPath.indexOf(\"/\");\n if (slashIdx !== -1) {\n await client.storage.from(fullPath.substring(0, slashIdx)).remove([fullPath.substring(slashIdx + 1)]);\n }\n }\n }\n if (userId && file.filesize > 0) {\n await decrementStorageUsed(client, userId, file.filesize).catch(() => {});\n }\n } catch {\n // best-effort\n }\n }\n\n if (fileUrls.length > 0 && onFilesRemoved) {\n await onFilesRemoved(fileUrls).catch(() => {});\n }\n\n const { error } = await client\n .from(\"notes\")\n .delete()\n .eq(\"id\", noteId);\n\n if (error) throw error;\n\n if (userId) {\n await cleanupOrphanedTags(client, userId);\n }\n}\n\nasync function cleanupOrphanedTags(client: SupabaseClient, userId: string): Promise<void> {\n try {\n const { data: tags } = await client\n .from(\"tags\")\n .select(\"id\")\n .eq(\"user_id\", userId);\n\n if (!tags || tags.length === 0) return;\n\n for (const tag of tags) {\n const { count: blockCount } = await client\n .from(\"block_tags\")\n .select(\"*\", { count: \"exact\", head: true })\n .eq(\"tag_id\", tag.id);\n\n const { count: noteCount } = await client\n .from(\"note_tags\")\n .select(\"*\", { count: \"exact\", head: true })\n .eq(\"tag_id\", tag.id);\n\n if ((blockCount ?? 0) === 0 && (noteCount ?? 0) === 0) {\n await client.from(\"tag_edges\").delete().or(`parent_id.eq.${tag.id},child_id.eq.${tag.id}`);\n await client.from(\"tags\").delete().eq(\"id\", tag.id);\n }\n }\n } catch {\n // best-effort\n }\n}\n\nexport async function emptyTrash(\n client: SupabaseClient,\n userId: string,\n): Promise<number> {\n const { data } = await client\n .from(\"notes\")\n .select(\"id\")\n .eq(\"user_id\", userId)\n .not(\"deleted_at\", \"is\", null);\n\n if (!data || data.length === 0) return 0;\n\n const ids = (data as Array<{ id: string }>).map((n) => n.id);\n const { error } = await client\n .from(\"notes\")\n .delete()\n .in(\"id\", ids);\n\n if (error) throw error;\n return ids.length;\n}\n\nexport interface ListNotesParams {\n user_id: string;\n note_type?: NoteType;\n is_pinned?: boolean;\n include_deleted?: boolean;\n limit?: number;\n offset?: number;\n}\n\nexport async function listNotes(\n client: SupabaseClient,\n params: ListNotesParams,\n): Promise<Note[]> {\n let query = client\n .from(\"notes\")\n .select(\"*\")\n .eq(\"user_id\", params.user_id)\n .order(\"updated_at\", { ascending: false });\n\n if (!params.include_deleted) {\n query = query.is(\"deleted_at\", null);\n }\n if (params.note_type) {\n query = query.eq(\"note_type\", params.note_type);\n }\n if (params.is_pinned !== undefined) {\n query = query.eq(\"is_pinned\", params.is_pinned);\n }\n if (params.limit) {\n query = query.limit(params.limit);\n }\n if (params.offset) {\n query = query.range(params.offset, params.offset + (params.limit ?? 50) - 1);\n }\n\n const { data, error } = await query;\n if (error) throw error;\n return (data ?? []) as Note[];\n}\n\nexport async function getOrCreateDailyNote(\n client: SupabaseClient,\n userId: string,\n date: string,\n): Promise<Note> {\n const { data: existing } = await client\n .from(\"notes\")\n .select(\"*\")\n .eq(\"user_id\", userId)\n .eq(\"note_type\", \"daily\")\n .eq(\"daily_date\", date)\n .single();\n\n if (existing) return existing as Note;\n\n const dateObj = new Date(date + \"T00:00:00\");\n const title = dateObj.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n\n return createNote(client, {\n user_id: userId,\n title,\n slug: date,\n note_type: \"daily\",\n daily_date: date,\n });\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Tag, TagEdge } from \"./types\";\n\nexport async function createTag(\n client: SupabaseClient,\n userId: string,\n name: string,\n color?: string,\n): Promise<Tag> {\n const { data, error } = await client\n .from(\"tags\")\n .insert({ user_id: userId, name: name.toLowerCase(), color: color ?? null })\n .select()\n .single();\n\n if (error) throw error;\n return data as Tag;\n}\n\nexport async function getOrCreateTag(\n client: SupabaseClient,\n userId: string,\n name: string,\n color?: string,\n): Promise<Tag> {\n const normalized = name.toLowerCase();\n const { data: existing } = await client\n .from(\"tags\")\n .select(\"*\")\n .eq(\"user_id\", userId)\n .eq(\"name\", normalized)\n .single();\n\n if (existing) return existing as Tag;\n return createTag(client, userId, normalized, color);\n}\n\nexport async function getUserTags(\n client: SupabaseClient,\n userId: string,\n): Promise<Tag[]> {\n const { data, error } = await client\n .from(\"tags\")\n .select(\"*\")\n .eq(\"user_id\", userId)\n .order(\"name\");\n\n if (error) throw error;\n return (data ?? []) as Tag[];\n}\n\nexport async function updateTag(\n client: SupabaseClient,\n tagId: string,\n updates: Partial<Pick<Tag, \"name\" | \"color\">>,\n): Promise<Tag> {\n const payload: Record<string, unknown> = {};\n if (updates.name !== undefined) payload.name = updates.name.toLowerCase();\n if (updates.color !== undefined) payload.color = updates.color;\n\n const { data, error } = await client\n .from(\"tags\")\n .update(payload)\n .eq(\"id\", tagId)\n .select()\n .single();\n\n if (error) throw error;\n return data as Tag;\n}\n\nexport async function deleteTag(\n client: SupabaseClient,\n tagId: string,\n): Promise<void> {\n const { error } = await client.from(\"tags\").delete().eq(\"id\", tagId);\n if (error) throw error;\n}\n\nexport async function addTagEdge(\n client: SupabaseClient,\n userId: string,\n parentId: string,\n childId: string,\n): Promise<TagEdge> {\n const { data, error } = await client\n .from(\"tag_edges\")\n .insert({ parent_id: parentId, child_id: childId, user_id: userId })\n .select()\n .single();\n\n if (error) throw error;\n return data as TagEdge;\n}\n\nexport async function removeTagEdge(\n client: SupabaseClient,\n parentId: string,\n childId: string,\n): Promise<void> {\n const { error } = await client\n .from(\"tag_edges\")\n .delete()\n .eq(\"parent_id\", parentId)\n .eq(\"child_id\", childId);\n\n if (error) throw error;\n}\n\nexport async function getTagParents(\n client: SupabaseClient,\n tagId: string,\n): Promise<Tag[]> {\n const { data, error } = await client\n .from(\"tag_edges\")\n .select(\"parent_id\")\n .eq(\"child_id\", tagId);\n\n if (error) throw error;\n if (!data || data.length === 0) return [];\n\n const parentIds = data.map((e) => (e as TagEdge).parent_id);\n const { data: tags, error: tagErr } = await client\n .from(\"tags\")\n .select(\"*\")\n .in(\"id\", parentIds);\n\n if (tagErr) throw tagErr;\n return (tags ?? []) as Tag[];\n}\n\nexport async function getTagChildren(\n client: SupabaseClient,\n tagId: string,\n): Promise<Tag[]> {\n const { data, error } = await client\n .from(\"tag_edges\")\n .select(\"child_id\")\n .eq(\"parent_id\", tagId);\n\n if (error) throw error;\n if (!data || data.length === 0) return [];\n\n const childIds = data.map((e) => (e as TagEdge).child_id);\n const { data: tags, error: tagErr } = await client\n .from(\"tags\")\n .select(\"*\")\n .in(\"id\", childIds);\n\n if (tagErr) throw tagErr;\n return (tags ?? []) as Tag[];\n}\n\nexport async function getTagDescendants(\n client: SupabaseClient,\n tagId: string,\n): Promise<string[]> {\n const { data, error } = await client.rpc(\"get_tag_descendants\", {\n root_tag_id: tagId,\n });\n\n if (error) throw error;\n return ((data ?? []) as Array<{ tag_id: string }>).map((r) => r.tag_id);\n}\n\nexport async function addBlockTag(\n client: SupabaseClient,\n blockId: string,\n tagId: string,\n): Promise<void> {\n const { error } = await client\n .from(\"block_tags\")\n .upsert({ block_id: blockId, tag_id: tagId }, { onConflict: \"block_id,tag_id\" });\n\n if (error) throw error;\n}\n\nexport async function removeBlockTag(\n client: SupabaseClient,\n blockId: string,\n tagId: string,\n): Promise<void> {\n const { error } = await client\n .from(\"block_tags\")\n .delete()\n .eq(\"block_id\", blockId)\n .eq(\"tag_id\", tagId);\n\n if (error) throw error;\n}\n\nexport async function getBlocksByTag(\n client: SupabaseClient,\n userId: string,\n tagId: string,\n includeDescendants = true,\n): Promise<string[]> {\n let tagIds: string[];\n if (includeDescendants) {\n tagIds = await getTagDescendants(client, tagId);\n } else {\n tagIds = [tagId];\n }\n\n const { data, error } = await client\n .from(\"block_tags\")\n .select(\"block_id, blocks!inner(user_id)\")\n .in(\"tag_id\", tagIds);\n\n if (error) throw error;\n return ((data ?? []) as Array<{ block_id: string }>).map((r) => r.block_id);\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Link, LinkTargetType, BacklinkResult, Block } from \"./types\";\n\nexport async function createLink(\n client: SupabaseClient,\n userId: string,\n sourceBlockId: string,\n targetType: LinkTargetType,\n targetId: string,\n): Promise<Link> {\n const { data, error } = await client\n .from(\"links\")\n .insert({\n user_id: userId,\n source_block_id: sourceBlockId,\n target_type: targetType,\n target_id: targetId,\n })\n .select()\n .single();\n\n if (error) throw error;\n return data as Link;\n}\n\nexport async function deleteLinksForBlock(\n client: SupabaseClient,\n sourceBlockId: string,\n): Promise<void> {\n const { error } = await client\n .from(\"links\")\n .delete()\n .eq(\"source_block_id\", sourceBlockId);\n\n if (error) throw error;\n}\n\nexport async function getBacklinksForNote(\n client: SupabaseClient,\n noteId: string,\n): Promise<BacklinkResult[]> {\n const { data, error } = await client\n .from(\"links\")\n .select(\"source_block_id, blocks!inner(id, note_id, content, type, position, metadata, user_id, created_at, updated_at, deleted_at)\")\n .eq(\"target_type\", \"note\")\n .eq(\"target_id\", noteId);\n\n if (error) throw error;\n if (!data || data.length === 0) return [];\n\n const blockRows = data as unknown as Array<{ source_block_id: string; blocks: Record<string, unknown> }>;\n const noteIds = [...new Set(blockRows.map((r) => r.blocks.note_id as string))];\n\n const { data: notes } = await client\n .from(\"notes\")\n .select(\"id, title\")\n .in(\"id\", noteIds);\n\n const noteMap = new Map((notes ?? []).map((n: Record<string, unknown>) => [n.id as string, n.title as string]));\n\n return blockRows.map((r) => ({\n source_block: r.blocks as unknown as Block,\n source_note_title: noteMap.get(r.blocks.note_id as string) ?? \"Untitled\",\n }));\n}\n\nexport async function syncLinksForNote(\n client: SupabaseClient,\n userId: string,\n noteId: string,\n wikiLinks: Array<{ blockId?: string; targetNoteTitle: string }>,\n): Promise<void> {\n const { data: existingBlocks } = await client\n .from(\"blocks\")\n .select(\"id\")\n .eq(\"note_id\", noteId);\n\n if (existingBlocks) {\n const blockIds = existingBlocks.map((b: Record<string, unknown>) => b.id as string);\n if (blockIds.length > 0) {\n await client\n .from(\"links\")\n .delete()\n .in(\"source_block_id\", blockIds);\n }\n }\n\n if (wikiLinks.length === 0) return;\n\n const titles = [...new Set(wikiLinks.map((l) => l.targetNoteTitle))];\n const { data: targetNotes } = await client\n .from(\"notes\")\n .select(\"id, title\")\n .eq(\"user_id\", userId)\n .in(\"title\", titles);\n\n if (!targetNotes || targetNotes.length === 0) return;\n\n const titleToId = new Map(\n (targetNotes as Array<{ id: string; title: string }>).map((n) => [n.title, n.id]),\n );\n\n const newBlocks = await client\n .from(\"blocks\")\n .select(\"id\")\n .eq(\"note_id\", noteId)\n .order(\"position\");\n\n if (!newBlocks.data) return;\n const firstBlockId = (newBlocks.data[0] as Record<string, unknown>)?.id as string | undefined;\n\n const linksToInsert = wikiLinks\n .map((l) => {\n const targetId = titleToId.get(l.targetNoteTitle);\n if (!targetId) return null;\n return {\n user_id: userId,\n source_block_id: l.blockId ?? firstBlockId,\n target_type: \"note\" as LinkTargetType,\n target_id: targetId,\n };\n })\n .filter((l): l is NonNullable<typeof l> => l !== null && l.source_block_id !== undefined);\n\n if (linksToInsert.length > 0) {\n await client.from(\"links\").insert(linksToInsert);\n }\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Block, BlockType, BlockMetadata } from \"./types\";\nimport { getOrCreateTag, addTagEdge, addBlockTag } from \"./tags\";\nimport { syncLinksForNote } from \"./links\";\n\nexport interface CreateBlockParams {\n note_id: string;\n user_id: string;\n type?: BlockType;\n content?: string;\n position: number;\n metadata?: BlockMetadata;\n}\n\nexport async function createBlock(\n client: SupabaseClient,\n params: CreateBlockParams,\n): Promise<Block> {\n const { data, error } = await client\n .from(\"blocks\")\n .insert({\n note_id: params.note_id,\n user_id: params.user_id,\n type: params.type ?? \"text\",\n content: params.content ?? \"\",\n position: params.position,\n metadata: params.metadata ?? {},\n })\n .select()\n .single();\n\n if (error) throw error;\n return data as Block;\n}\n\nexport async function getBlocksForNote(\n client: SupabaseClient,\n noteId: string,\n): Promise<Block[]> {\n const { data, error } = await client\n .from(\"blocks\")\n .select(\"*\")\n .eq(\"note_id\", noteId)\n .is(\"deleted_at\", null)\n .order(\"position\", { ascending: true });\n\n if (error) throw error;\n return (data ?? []) as Block[];\n}\n\nexport async function updateBlock(\n client: SupabaseClient,\n blockId: string,\n updates: Partial<Pick<Block, \"content\" | \"type\" | \"position\" | \"metadata\">>,\n): Promise<Block> {\n const { data, error } = await client\n .from(\"blocks\")\n .update(updates)\n .eq(\"id\", blockId)\n .select()\n .single();\n\n if (error) throw error;\n return data as Block;\n}\n\nexport async function deleteBlock(\n client: SupabaseClient,\n blockId: string,\n): Promise<void> {\n const { error } = await client\n .from(\"blocks\")\n .update({ deleted_at: new Date().toISOString() })\n .eq(\"id\", blockId);\n\n if (error) throw error;\n}\n\nexport async function upsertBlocks(\n client: SupabaseClient,\n blocks: Array<{\n id?: string;\n note_id: string;\n user_id: string;\n type: BlockType;\n content: string;\n position: number;\n metadata: BlockMetadata;\n }>,\n): Promise<Block[]> {\n const { data, error } = await client\n .from(\"blocks\")\n .upsert(blocks, { onConflict: \"id\" })\n .select();\n\n if (error) throw error;\n return (data ?? []) as Block[];\n}\n\nconst saveLocks = new Map<string, Promise<void>>();\n\nexport async function saveNoteContent(\n client: SupabaseClient,\n noteId: string,\n userId: string,\n tiptapJson: Record<string, unknown>,\n): Promise<void> {\n const existing = saveLocks.get(noteId);\n const doSave = async () => {\n if (existing) await existing.catch(() => {});\n await _saveNoteContentInner(client, noteId, userId, tiptapJson);\n };\n const promise = doSave();\n saveLocks.set(noteId, promise);\n try {\n await promise;\n } finally {\n if (saveLocks.get(noteId) === promise) saveLocks.delete(noteId);\n }\n}\n\nasync function _saveNoteContentInner(\n client: SupabaseClient,\n noteId: string,\n userId: string,\n tiptapJson: Record<string, unknown>,\n): Promise<void> {\n const nodes = tiptapJson.content as Array<Record<string, unknown>> | undefined;\n if (!nodes) return;\n\n const blocksToInsert = nodes.map((node, index) => ({\n note_id: noteId,\n user_id: userId,\n type: mapTiptapTypeToBlockType(node.type as string),\n content: extractPlainText(node),\n position: (index + 1) * 1.0,\n metadata: { tiptap: node },\n }));\n\n if (blocksToInsert.length === 0) return;\n\n const { error } = await client\n .from(\"blocks\")\n .delete()\n .eq(\"note_id\", noteId);\n\n if (error) throw error;\n\n const { error: insertError } = await client\n .from(\"blocks\")\n .insert(blocksToInsert);\n\n if (insertError) throw insertError;\n\n const { data: insertedBlocks } = await client\n .from(\"blocks\")\n .select(\"id, content, type\")\n .eq(\"note_id\", noteId)\n .order(\"position\");\n\n const blockRows = (insertedBlocks ?? []) as Array<{ id: string; content: string; type: string }>;\n\n await client.from(\"block_tags\").delete().in(\"block_id\", blockRows.map((b) => b.id));\n await client.from(\"note_tags\").delete().eq(\"note_id\", noteId);\n\n const noteTagIds = new Set<string>();\n\n const SKIP_TAG_TYPES = new Set([\"code\", \"mermaid\", \"math\", \"image\", \"divider\", \"chart\", \"file\"]);\n\n for (const block of blockRows) {\n if (SKIP_TAG_TYPES.has(block.type)) continue;\n\n const leafTags = extractLeafTags(block.content);\n for (const tagName of leafTags) {\n const tag = await getOrCreateTag(client, userId, tagName);\n await addBlockTag(client, block.id, tag.id).catch(() => {});\n noteTagIds.add(tag.id);\n }\n\n const scopedTags = extractScopedTags(block.content);\n for (const { parent, child } of scopedTags) {\n const parentTag = await getOrCreateTag(client, userId, parent);\n const childTag = await getOrCreateTag(client, userId, child);\n await addTagEdge(client, userId, parentTag.id, childTag.id).catch(() => {});\n }\n }\n\n for (const tagId of noteTagIds) {\n await client\n .from(\"note_tags\")\n .upsert({ note_id: noteId, tag_id: tagId }, { onConflict: \"note_id,tag_id\" });\n }\n\n const fullText = blockRows.map((b) => b.content).join(\" \");\n\n const wikiLinkTitles = extractWikiLinks(fullText);\n if (wikiLinkTitles.length > 0) {\n await syncLinksForNote(client, userId, noteId, wikiLinkTitles.map((t) => ({ targetNoteTitle: t })));\n }\n}\n\nfunction mapTiptapTypeToBlockType(tiptapType: string): BlockType {\n const MAP: Record<string, BlockType> = {\n paragraph: \"text\",\n heading: \"heading\",\n codeBlock: \"code\",\n taskList: \"todo\",\n taskItem: \"todo\",\n blockquote: \"text\",\n bulletList: \"text\",\n orderedList: \"text\",\n image: \"image\",\n mermaidBlock: \"mermaid\",\n mathBlock: \"math\",\n calloutBlock: \"callout\",\n queryBlock: \"query\",\n horizontalRule: \"divider\",\n fileBlock: \"file\",\n linkPreview: \"text\",\n inlineMath: \"text\",\n };\n return MAP[tiptapType] ?? \"text\";\n}\n\nfunction extractPlainText(node: Record<string, unknown>): string {\n if (typeof node.text === \"string\") return node.text;\n const content = node.content as Array<Record<string, unknown>> | undefined;\n if (!content) return \"\";\n return content.map(extractPlainText).join(\"\");\n}\n\nfunction extractLeafTags(text: string): string[] {\n const matches = text.match(/#([a-zA-Z][a-zA-Z0-9_-]*(?:\\/[a-zA-Z][a-zA-Z0-9_-]*)*)/g);\n if (!matches) return [];\n const tags = new Set<string>();\n for (const m of matches) {\n const full = m.slice(1).toLowerCase();\n if (full.includes(\"/\")) {\n const parts = full.split(\"/\");\n tags.add(parts[parts.length - 1]);\n } else {\n tags.add(full);\n }\n }\n return [...tags];\n}\n\nfunction extractScopedTags(text: string): Array<{ parent: string; child: string }> {\n const matches = text.match(/#([a-zA-Z][a-zA-Z0-9_-]*(?:\\/[a-zA-Z][a-zA-Z0-9_-]*)+)/g);\n if (!matches) return [];\n const edges: Array<{ parent: string; child: string }> = [];\n for (const m of matches) {\n const parts = m.slice(1).toLowerCase().split(\"/\");\n for (let i = 0; i < parts.length - 1; i++) {\n edges.push({ parent: parts[i], child: parts[i + 1] });\n }\n }\n return edges;\n}\n\nfunction extractWikiLinks(text: string): string[] {\n const matches = text.match(/\\[\\[([^\\]]+)\\]\\]/g);\n if (!matches) return [];\n return [...new Set(matches.map((m) => m.slice(2, -2)))];\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Snapshot } from \"./types\";\n\nfunction generateHash(): string {\n const chars = \"0123456789abcdef\";\n let hash = \"\";\n for (let i = 0; i < 8; i++) {\n hash += chars[Math.floor(Math.random() * chars.length)];\n }\n return hash;\n}\n\nexport async function createSnapshot(\n client: SupabaseClient,\n noteId: string,\n userId: string,\n content: Record<string, unknown>,\n message?: string,\n): Promise<Snapshot | null> {\n const latest = await getLatestSnapshot(client, noteId);\n if (latest && JSON.stringify(latest.content) === JSON.stringify(content)) {\n return null;\n }\n\n const { data, error } = await client\n .from(\"snapshots\")\n .insert({\n note_id: noteId,\n user_id: userId,\n content,\n hash: generateHash(),\n message: message ?? null,\n })\n .select()\n .single();\n\n if (error) throw error;\n return data as Snapshot;\n}\n\nexport async function listSnapshots(\n client: SupabaseClient,\n noteId: string,\n limit = 50,\n): Promise<Snapshot[]> {\n const { data, error } = await client\n .from(\"snapshots\")\n .select(\"*\")\n .eq(\"note_id\", noteId)\n .order(\"created_at\", { ascending: false })\n .limit(limit);\n\n if (error) throw error;\n return (data ?? []) as Snapshot[];\n}\n\nexport async function getSnapshot(\n client: SupabaseClient,\n snapshotId: string,\n): Promise<Snapshot | null> {\n const { data, error } = await client\n .from(\"snapshots\")\n .select(\"*\")\n .eq(\"id\", snapshotId)\n .single();\n\n if (error) return null;\n return data as Snapshot;\n}\n\nexport async function getLatestSnapshot(\n client: SupabaseClient,\n noteId: string,\n): Promise<Snapshot | null> {\n const { data, error } = await client\n .from(\"snapshots\")\n .select(\"*\")\n .eq(\"note_id\", noteId)\n .order(\"created_at\", { ascending: false })\n .limit(1)\n .single();\n\n if (error) return null;\n return data as Snapshot;\n}\n\nexport interface DiffResult {\n added: string[];\n removed: string[];\n unchanged: string[];\n}\n\nexport function diffSnapshots(\n older: Record<string, unknown>,\n newer: Record<string, unknown>,\n): DiffResult {\n const olderBlocks = extractBlockTexts(older);\n const newerBlocks = extractBlockTexts(newer);\n\n const olderSet = new Set(olderBlocks);\n const newerSet = new Set(newerBlocks);\n\n const added = newerBlocks.filter((b) => !olderSet.has(b));\n const removed = olderBlocks.filter((b) => !newerSet.has(b));\n const unchanged = newerBlocks.filter((b) => olderSet.has(b));\n\n return { added, removed, unchanged };\n}\n\nfunction extractBlockTexts(tiptapJson: Record<string, unknown>): string[] {\n const content = tiptapJson.content as Array<Record<string, unknown>> | undefined;\n if (!content) return [];\n return content.map((node) => {\n return extractText(node).trim();\n }).filter(Boolean);\n}\n\nfunction extractText(node: Record<string, unknown>): string {\n if (typeof node.text === \"string\") return node.text;\n const children = node.content as Array<Record<string, unknown>> | undefined;\n if (!children) return \"\";\n return children.map(extractText).join(\"\");\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Block, Note, BlockType } from \"./types\";\nimport { getTagDescendants } from \"./tags\";\n\nexport interface SearchResult {\n block: Block;\n noteId: string;\n noteTitle: string;\n matchType: \"text\" | \"tag\" | \"type\";\n}\n\nexport async function fullTextSearch(\n client: SupabaseClient,\n userId: string,\n query: string,\n limit = 30,\n): Promise<SearchResult[]> {\n const { data, error } = await client\n .from(\"blocks\")\n .select(\"*, notes!inner(id, title)\")\n .eq(\"user_id\", userId)\n .is(\"deleted_at\", null)\n .textSearch(\"content\", query, { type: \"websearch\" })\n .limit(limit);\n\n if (error) throw error;\n\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => {\n const notes = row.notes as Record<string, unknown>;\n return {\n block: row as unknown as Block,\n noteId: notes.id as string,\n noteTitle: notes.title as string,\n matchType: \"text\" as const,\n };\n });\n}\n\nexport async function searchByTag(\n client: SupabaseClient,\n userId: string,\n tagName: string,\n includeDescendants = true,\n): Promise<SearchResult[]> {\n const { data: tags } = await client\n .from(\"tags\")\n .select(\"id\")\n .eq(\"user_id\", userId)\n .eq(\"name\", tagName.toLowerCase())\n .single();\n\n if (!tags) return [];\n const tagId = (tags as Record<string, string>).id;\n\n let tagIds: string[];\n if (includeDescendants) {\n tagIds = await getTagDescendants(client, tagId);\n } else {\n tagIds = [tagId];\n }\n\n const { data, error } = await client\n .from(\"block_tags\")\n .select(\"block_id, blocks!inner(*, notes!inner(id, title))\")\n .in(\"tag_id\", tagIds);\n\n if (error) throw error;\n\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => {\n const block = row.blocks as Record<string, unknown>;\n const notes = block.notes as Record<string, unknown>;\n return {\n block: block as unknown as Block,\n noteId: notes.id as string,\n noteTitle: notes.title as string,\n matchType: \"tag\" as const,\n };\n });\n}\n\nexport async function searchByType(\n client: SupabaseClient,\n userId: string,\n blockType: BlockType,\n limit = 50,\n): Promise<SearchResult[]> {\n const { data, error } = await client\n .from(\"blocks\")\n .select(\"*, notes!inner(id, title)\")\n .eq(\"user_id\", userId)\n .eq(\"type\", blockType)\n .is(\"deleted_at\", null)\n .limit(limit);\n\n if (error) throw error;\n\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => {\n const notes = row.notes as Record<string, unknown>;\n return {\n block: row as unknown as Block,\n noteId: notes.id as string,\n noteTitle: notes.title as string,\n matchType: \"type\" as const,\n };\n });\n}\n\nexport interface QueryFilter {\n text?: string;\n tag?: string;\n type?: BlockType;\n status?: \"open\" | \"done\";\n hasLink?: boolean;\n}\n\nexport function parseQuery(input: string): QueryFilter {\n const filter: QueryFilter = {};\n const parts = input.trim().split(/\\s+/);\n const textParts: string[] = [];\n\n for (const part of parts) {\n if (part.startsWith(\"#\")) {\n const raw = part.slice(1).toLowerCase();\n filter.tag = raw.includes(\"/\") ? raw.split(\"/\").pop()! : raw;\n } else if (part.startsWith(\"type:\")) {\n filter.type = part.slice(5) as BlockType;\n } else if (part.startsWith(\"status:\")) {\n filter.status = part.slice(7) as \"open\" | \"done\";\n } else if (part === \"has:link\") {\n filter.hasLink = true;\n } else {\n textParts.push(part);\n }\n }\n\n if (textParts.length > 0) {\n filter.text = textParts.join(\" \");\n }\n\n return filter;\n}\n\nexport async function executeQuery(\n client: SupabaseClient,\n userId: string,\n input: string,\n limit = 30,\n): Promise<SearchResult[]> {\n const filter = parseQuery(input);\n let results: SearchResult[] = [];\n\n if (filter.tag) {\n results = await searchByTag(client, userId, filter.tag);\n } else if (filter.type) {\n results = await searchByType(client, userId, filter.type, limit);\n } else if (filter.text) {\n results = await fullTextSearch(client, userId, filter.text, limit);\n }\n\n if (filter.status && results.length > 0) {\n const isDone = filter.status === \"done\";\n results = results.filter((r) => {\n const meta = r.block.metadata as Record<string, unknown>;\n if (meta.status === filter.status) return true;\n const json = JSON.stringify(meta);\n if (isDone) return json.includes('\"checked\":true');\n return json.includes('\"checked\":false') || (json.includes('\"taskItem\"') && !json.includes('\"checked\":true'));\n });\n }\n\n return results;\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\n\nexport interface GraphNode {\n id: string;\n label: string;\n type: \"note\" | \"tag\";\n color?: string;\n}\n\nexport interface GraphEdge {\n source: string;\n target: string;\n type: \"link\" | \"tag\";\n}\n\nexport interface GraphData {\n nodes: GraphNode[];\n edges: GraphEdge[];\n}\n\nexport async function getGraphData(\n client: SupabaseClient,\n userId: string,\n): Promise<GraphData> {\n const nodes: GraphNode[] = [];\n const edges: GraphEdge[] = [];\n\n const { data: notes } = await client\n .from(\"notes\")\n .select(\"id, title\")\n .eq(\"user_id\", userId)\n .is(\"deleted_at\", null);\n\n for (const n of (notes ?? []) as Array<{ id: string; title: string }>) {\n nodes.push({ id: n.id, label: n.title, type: \"note\" });\n }\n\n const { data: links } = await client\n .from(\"links\")\n .select(\"source_block_id, target_id, target_type, blocks!inner(note_id)\")\n .eq(\"user_id\", userId)\n .eq(\"target_type\", \"note\");\n\n for (const l of (links ?? []) as unknown as Array<{ target_id: string; blocks: { note_id: string } }>) {\n const sourceNoteId = l.blocks.note_id;\n const targetNoteId = l.target_id;\n if (sourceNoteId && targetNoteId && sourceNoteId !== targetNoteId) {\n edges.push({ source: sourceNoteId, target: targetNoteId, type: \"link\" });\n }\n }\n\n const { data: tags } = await client\n .from(\"tags\")\n .select(\"id, name, color\")\n .eq(\"user_id\", userId);\n\n for (const t of (tags ?? []) as Array<{ id: string; name: string; color: string | null }>) {\n nodes.push({ id: `tag-${t.id}`, label: `#${t.name}`, type: \"tag\", color: t.color ?? undefined });\n }\n\n const { data: noteTags } = await client\n .from(\"note_tags\")\n .select(\"note_id, tag_id\");\n\n for (const nt of (noteTags ?? []) as Array<{ note_id: string; tag_id: string }>) {\n edges.push({ source: nt.note_id, target: `tag-${nt.tag_id}`, type: \"tag\" });\n }\n\n const { data: tagEdges } = await client\n .from(\"tag_edges\")\n .select(\"parent_id, child_id\")\n .eq(\"user_id\", userId);\n\n for (const te of (tagEdges ?? []) as Array<{ parent_id: string; child_id: string }>) {\n edges.push({ source: `tag-${te.parent_id}`, target: `tag-${te.child_id}`, type: \"tag\" });\n }\n\n return { nodes, edges };\n}\n","export interface NoteTemplate {\n id: string;\n name: string;\n content: Record<string, unknown>;\n}\n\nexport const NOTE_TEMPLATES: NoteTemplate[] = [\n {\n id: \"blank\",\n name: \"Blank Note\",\n content: { type: \"doc\", content: [{ type: \"paragraph\" }] },\n },\n {\n id: \"meeting\",\n name: \"Meeting Notes\",\n content: {\n type: \"doc\",\n content: [\n { type: \"heading\", attrs: { level: 1 }, content: [{ type: \"text\", text: \"Meeting Notes\" }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Attendees\" }] },\n { type: \"paragraph\", content: [{ type: \"text\", text: \"- \" }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Agenda\" }] },\n { type: \"paragraph\", content: [{ type: \"text\", text: \"1. \" }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Discussion\" }] },\n { type: \"paragraph\" },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Action Items\" }] },\n { type: \"taskList\", content: [{ type: \"taskItem\", attrs: { checked: false }, content: [{ type: \"paragraph\" }] }] },\n ],\n },\n },\n {\n id: \"daily-standup\",\n name: \"Daily Standup\",\n content: {\n type: \"doc\",\n content: [\n { type: \"heading\", attrs: { level: 1 }, content: [{ type: \"text\", text: \"Daily Standup\" }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Yesterday\" }] },\n { type: \"taskList\", content: [{ type: \"taskItem\", attrs: { checked: true }, content: [{ type: \"paragraph\" }] }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Today\" }] },\n { type: \"taskList\", content: [{ type: \"taskItem\", attrs: { checked: false }, content: [{ type: \"paragraph\" }] }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Blockers\" }] },\n { type: \"paragraph\" },\n ],\n },\n },\n {\n id: \"project\",\n name: \"Project Plan\",\n content: {\n type: \"doc\",\n content: [\n { type: \"heading\", attrs: { level: 1 }, content: [{ type: \"text\", text: \"Project Name\" }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Overview\" }] },\n { type: \"paragraph\" },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Goals\" }] },\n { type: \"paragraph\", content: [{ type: \"text\", text: \"- \" }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Timeline\" }] },\n { type: \"paragraph\" },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Tasks\" }] },\n { type: \"taskList\", content: [{ type: \"taskItem\", attrs: { checked: false }, content: [{ type: \"paragraph\" }] }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Notes\" }] },\n { type: \"paragraph\" },\n ],\n },\n },\n];\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Note } from \"./types\";\n\nfunction extractTextFromNode(node: Record<string, unknown>): string {\n if (typeof node.text === \"string\") return node.text;\n const content = node.content as Array<Record<string, unknown>> | undefined;\n if (!content) return \"\";\n return content.map(extractTextFromNode).join(\"\");\n}\n\nfunction extractInlineMarkdown(node: Record<string, unknown>): string {\n if (node.type === \"inlineMath\") {\n const formula = (node.attrs as Record<string, unknown>)?.formula as string ?? \"\";\n return `$${formula}$`;\n }\n if (typeof node.text === \"string\") {\n const marks = (node.marks ?? []) as Array<{ type: string; attrs?: Record<string, unknown> }>;\n let text = node.text;\n const linkMark = marks.find((m) => m.type === \"link\");\n if (linkMark) {\n const href = (linkMark.attrs?.href as string) ?? \"\";\n return `[${text}](${href})`;\n }\n for (const mark of marks) {\n if (mark.type === \"bold\") text = `**${text}**`;\n else if (mark.type === \"italic\") text = `*${text}*`;\n else if (mark.type === \"code\") text = `\\`${text}\\``;\n else if (mark.type === \"strike\") text = `~~${text}~~`;\n }\n return text;\n }\n const content = node.content as Array<Record<string, unknown>> | undefined;\n if (!content) return \"\";\n return content.map(extractInlineMarkdown).join(\"\");\n}\n\nfunction tiptapNodeToMarkdown(node: Record<string, unknown>): string[] {\n const type = node.type as string;\n const attrs = (node.attrs ?? {}) as Record<string, unknown>;\n const content = (node.content ?? []) as Array<Record<string, unknown>>;\n const lines: string[] = [];\n\n switch (type) {\n case \"heading\": {\n const level = (attrs.level as number) ?? 1;\n lines.push(`${\"#\".repeat(level)} ${extractInlineMarkdown({ content } as Record<string, unknown>)}`);\n break;\n }\n case \"paragraph\": {\n lines.push(extractInlineMarkdown({ content } as Record<string, unknown>));\n break;\n }\n case \"taskList\": {\n for (const child of content) {\n const childAttrs = (child.attrs ?? {}) as Record<string, unknown>;\n const checked = childAttrs.checked ? \"x\" : \" \";\n const text = extractInlineMarkdown(child);\n lines.push(`- [${checked}] ${text}`);\n }\n break;\n }\n case \"taskItem\": {\n const checked = attrs.checked ? \"x\" : \" \";\n lines.push(`- [${checked}] ${extractInlineMarkdown({ content } as Record<string, unknown>)}`);\n break;\n }\n case \"bulletList\": {\n for (const child of content) {\n const text = extractInlineMarkdown(child);\n lines.push(`- ${text}`);\n }\n break;\n }\n case \"orderedList\": {\n content.forEach((child, i) => {\n const text = extractInlineMarkdown(child);\n lines.push(`${i + 1}. ${text}`);\n });\n break;\n }\n case \"codeBlock\": {\n const lang = (attrs.language as string) ?? \"\";\n lines.push(\"```\" + lang, extractTextFromNode(node), \"```\");\n break;\n }\n case \"mermaidBlock\": {\n lines.push(\"```mermaid\", extractTextFromNode(node), \"```\");\n break;\n }\n case \"mathBlock\": {\n lines.push(\"$$\", extractTextFromNode(node), \"$$\");\n break;\n }\n case \"calloutBlock\": {\n const variant = (attrs.variant as string) ?? \"info\";\n const text = extractInlineMarkdown({ content } as Record<string, unknown>);\n lines.push(`> [!${variant}]`, ...text.split(\"\\n\").map((l) => `> ${l}`));\n break;\n }\n case \"queryBlock\": {\n const text = extractTextFromNode(node).trim();\n lines.push(`> [!query]`, `> ${text}`);\n break;\n }\n case \"blockquote\": {\n const text = extractInlineMarkdown({ content } as Record<string, unknown>);\n lines.push(...text.split(\"\\n\").map((l) => `> ${l}`));\n break;\n }\n case \"horizontalRule\": {\n lines.push(\"---\");\n break;\n }\n case \"image\": {\n const src = attrs.src as string ?? \"\";\n const alt = (attrs.alt as string) ?? \"\";\n lines.push(``);\n break;\n }\n case \"linkPreview\": {\n const url = attrs.url as string ?? \"\";\n lines.push(`> [!embed]`, `> ${url}`);\n break;\n }\n case \"fileBlock\": {\n const src = attrs.src as string ?? \"\";\n const filename = (attrs.filename as string) ?? \"file\";\n const filesize = (attrs.filesize as number) ?? 0;\n const filetype = (attrs.filetype as string) ?? \"\";\n lines.push(`> [!file]`, `> [${filename}](${src})`, `> ${filetype} ${filesize}`);\n break;\n }\n default: {\n const text = extractTextFromNode(node);\n if (text.trim()) lines.push(text);\n break;\n }\n }\n\n return lines;\n}\n\nexport async function exportNoteAsJson(\n client: SupabaseClient,\n noteId: string,\n): Promise<string> {\n const { data: note } = await client\n .from(\"notes\")\n .select(\"*\")\n .eq(\"id\", noteId)\n .single();\n\n const { data: blocks } = await client\n .from(\"blocks\")\n .select(\"*\")\n .eq(\"note_id\", noteId)\n .is(\"deleted_at\", null)\n .order(\"position\");\n\n return JSON.stringify({ note, blocks }, null, 2);\n}\n\nexport async function exportNoteAsMarkdown(\n client: SupabaseClient,\n noteId: string,\n): Promise<string> {\n const { data: note } = await client\n .from(\"notes\")\n .select(\"title\")\n .eq(\"id\", noteId)\n .single();\n\n const { data: blocks } = await client\n .from(\"blocks\")\n .select(\"type, content, metadata\")\n .eq(\"note_id\", noteId)\n .is(\"deleted_at\", null)\n .order(\"position\");\n\n if (!blocks) return \"\";\n\n const title = (note as Record<string, string>)?.title ?? \"Untitled\";\n const lines: string[] = [`# ${title}`, \"\"];\n\n for (const block of blocks as Array<{ type: string; content: string; metadata: Record<string, unknown> }>) {\n const tiptap = block.metadata.tiptap as Record<string, unknown> | undefined;\n if (tiptap) {\n lines.push(...tiptapNodeToMarkdown(tiptap), \"\");\n } else {\n if (block.content.trim()) lines.push(block.content, \"\");\n }\n }\n\n return lines.join(\"\\n\");\n}\n","interface TiptapNode {\n type: string;\n attrs?: Record<string, unknown>;\n content?: TiptapNode[];\n text?: string;\n marks?: Array<{ type: string; attrs?: Record<string, unknown> }>;\n}\n\nexport function markdownToTiptap(md: string): Record<string, unknown> {\n const lines = md.split(\"\\n\");\n const nodes: TiptapNode[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n if (line.match(/^#{1,4}\\s/)) {\n const match = line.match(/^(#{1,4})\\s(.*)$/);\n if (match) {\n nodes.push({\n type: \"heading\",\n attrs: { level: match[1].length },\n content: parseInline(match[2]),\n });\n }\n i++;\n continue;\n }\n\n if (line.match(/^```mermaid\\s*$/)) {\n const mermaidLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].match(/^```\\s*$/)) {\n mermaidLines.push(lines[i]);\n i++;\n }\n i++;\n nodes.push({\n type: \"mermaidBlock\",\n content: [{ type: \"text\", text: mermaidLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (line.match(/^```/)) {\n const langMatch = line.match(/^```(\\w*)$/);\n const language = langMatch?.[1] || \"plaintext\";\n const codeLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].match(/^```\\s*$/)) {\n codeLines.push(lines[i]);\n i++;\n }\n i++;\n nodes.push({\n type: \"codeBlock\",\n attrs: { language },\n content: [{ type: \"text\", text: codeLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (line.match(/^\\$\\$\\s*$/)) {\n const mathLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].match(/^\\$\\$\\s*$/)) {\n mathLines.push(lines[i]);\n i++;\n }\n i++;\n nodes.push({\n type: \"mathBlock\",\n content: [{ type: \"text\", text: mathLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (line.match(/^>\\s*\\[!(\\w+)\\]\\s*$/)) {\n const variantMatch = line.match(/^>\\s*\\[!(\\w+)\\]\\s*$/);\n const variant = variantMatch?.[1] ?? \"info\";\n\n if (variant === \"query\") {\n const queryLines: string[] = [];\n i++;\n while (i < lines.length && lines[i].match(/^>\\s/)) {\n queryLines.push(lines[i].replace(/^>\\s?/, \"\"));\n i++;\n }\n nodes.push({\n type: \"queryBlock\",\n content: [{ type: \"text\", text: queryLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (variant === \"embed\") {\n i++;\n const embedUrl = lines[i]?.replace(/^>\\s?/, \"\").trim() ?? \"\";\n i++;\n nodes.push({\n type: \"linkPreview\",\n attrs: { url: embedUrl },\n });\n continue;\n }\n\n if (variant === \"file\") {\n i++;\n const linkLine = lines[i]?.replace(/^>\\s?/, \"\") ?? \"\";\n const linkMatch = linkLine.match(/^\\[(.+?)\\]\\((.+?)\\)$/);\n i++;\n const metaLine = lines[i]?.replace(/^>\\s?/, \"\") ?? \"\";\n const metaParts = metaLine.split(\" \");\n i++;\n nodes.push({\n type: \"fileBlock\",\n attrs: {\n filename: linkMatch?.[1] ?? \"file\",\n src: linkMatch?.[2] ?? \"\",\n filetype: metaParts[0] ?? \"\",\n filesize: parseInt(metaParts[1] ?? \"0\", 10) || 0,\n },\n });\n continue;\n }\n\n const calloutLines: string[] = [];\n i++;\n while (i < lines.length && lines[i].match(/^>\\s/)) {\n calloutLines.push(lines[i].replace(/^>\\s?/, \"\"));\n i++;\n }\n nodes.push({\n type: \"calloutBlock\",\n attrs: { variant },\n content: [{ type: \"paragraph\", content: parseInline(calloutLines.join(\"\\n\")) }],\n });\n continue;\n }\n\n if (line.match(/^>\\s/)) {\n const quoteLines: string[] = [];\n while (i < lines.length && lines[i].match(/^>\\s?/)) {\n quoteLines.push(lines[i].replace(/^>\\s?/, \"\"));\n i++;\n }\n nodes.push({\n type: \"blockquote\",\n content: [{ type: \"paragraph\", content: parseInline(quoteLines.join(\"\\n\")) }],\n });\n continue;\n }\n\n if (line.match(/^---\\s*$/)) {\n nodes.push({ type: \"horizontalRule\" });\n i++;\n continue;\n }\n\n if (line.match(/^!\\[.*?\\]\\(.*?\\)$/)) {\n const imgMatch = line.match(/^!\\[(.*?)\\]\\((.*?)\\)$/);\n if (imgMatch) {\n nodes.push({\n type: \"image\",\n attrs: { src: imgMatch[2], alt: imgMatch[1] },\n });\n }\n i++;\n continue;\n }\n\n if (line.match(/^[-*]\\s\\[[ x]\\]\\s/)) {\n const taskItems: TiptapNode[] = [];\n while (i < lines.length && lines[i].match(/^[-*]\\s\\[[ x]\\]\\s/)) {\n const m = lines[i].match(/^[-*]\\s\\[([ x])\\]\\s(.*)$/);\n if (m) {\n taskItems.push({\n type: \"taskItem\",\n attrs: { checked: m[1] === \"x\" },\n content: [{ type: \"paragraph\", content: parseInline(m[2]) }],\n });\n }\n i++;\n }\n nodes.push({ type: \"taskList\", content: taskItems });\n continue;\n }\n\n if (line.match(/^[-*]\\s/)) {\n const items: TiptapNode[] = [];\n while (i < lines.length && lines[i].match(/^[-*]\\s/)) {\n const text = lines[i].replace(/^[-*]\\s/, \"\");\n items.push({\n type: \"listItem\",\n content: [{ type: \"paragraph\", content: parseInline(text) }],\n });\n i++;\n }\n nodes.push({ type: \"bulletList\", content: items });\n continue;\n }\n\n if (line.match(/^\\d+\\.\\s/)) {\n const items: TiptapNode[] = [];\n while (i < lines.length && lines[i].match(/^\\d+\\.\\s/)) {\n const text = lines[i].replace(/^\\d+\\.\\s/, \"\");\n items.push({\n type: \"listItem\",\n content: [{ type: \"paragraph\", content: parseInline(text) }],\n });\n i++;\n }\n nodes.push({ type: \"orderedList\", content: items });\n continue;\n }\n\n if (line.trim() === \"\") {\n i++;\n continue;\n }\n\n const paraLines: string[] = [];\n while (\n i < lines.length &&\n lines[i].trim() !== \"\" &&\n !lines[i].match(/^#{1,4}\\s/) &&\n !lines[i].match(/^```/) &&\n !lines[i].match(/^\\$\\$/) &&\n !lines[i].match(/^---\\s*$/) &&\n !lines[i].match(/^[-*]\\s/) &&\n !lines[i].match(/^\\d+\\.\\s/) &&\n !lines[i].match(/^>\\s/) &&\n !lines[i].match(/^!\\[/)\n ) {\n paraLines.push(lines[i]);\n i++;\n }\n nodes.push({\n type: \"paragraph\",\n content: parseInline(paraLines.join(\"\\n\")),\n });\n }\n\n if (nodes.length === 0) {\n nodes.push({ type: \"paragraph\" });\n }\n\n return { type: \"doc\", content: nodes };\n}\n\nfunction parseInline(text: string): TiptapNode[] {\n if (!text) return [];\n\n const nodes: TiptapNode[] = [];\n const regex = /(\\*\\*([^*]+)\\*\\*|\\*([^*]+)\\*|`([^`]+)`|~~([^~]+)~~|\\[\\[([^\\]]+)\\]\\]|#([a-zA-Z][a-zA-Z0-9_/-]*)|\\[([^\\]]+)\\]\\(([^)]+)\\)|(?<!\\$)\\$([^\\$\\n]+)\\$(?!\\$))/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n if (match.index > lastIndex) {\n nodes.push({ type: \"text\", text: text.slice(lastIndex, match.index) });\n }\n\n if (match[2]) {\n nodes.push({ type: \"text\", text: match[2], marks: [{ type: \"bold\" }] });\n } else if (match[3]) {\n nodes.push({ type: \"text\", text: match[3], marks: [{ type: \"italic\" }] });\n } else if (match[4]) {\n nodes.push({ type: \"text\", text: match[4], marks: [{ type: \"code\" }] });\n } else if (match[5]) {\n nodes.push({ type: \"text\", text: match[5], marks: [{ type: \"strike\" }] });\n } else if (match[6]) {\n nodes.push({ type: \"text\", text: `[[${match[6]}]]` });\n } else if (match[7]) {\n nodes.push({ type: \"text\", text: `#${match[7]}` });\n } else if (match[8] && match[9]) {\n nodes.push({ type: \"text\", text: match[8], marks: [{ type: \"link\", attrs: { href: match[9], target: \"_blank\" } }] });\n } else if (match[10]) {\n nodes.push({ type: \"inlineMath\", attrs: { formula: match[10] } });\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < text.length) {\n nodes.push({ type: \"text\", text: text.slice(lastIndex) });\n }\n\n return nodes.length > 0 ? nodes : [{ type: \"text\", text: text || \" \" }];\n}\n","export const VERTEX_VERSION = \"0.1.0\";\n\nexport {\n createSupabaseClient,\n initSupabaseClient,\n getSupabaseClient,\n type SupabaseClient,\n} from \"./client\";\n\nexport type {\n NoteType,\n BlockType,\n LinkTargetType,\n Priority,\n TodoStatus,\n CalloutVariant,\n ChartType,\n Profile,\n UserPreferences,\n Note,\n Block,\n BlockMetadata,\n TodoMetadata,\n CodeMetadata,\n HeadingMetadata,\n ImageMetadata,\n FileMetadata,\n MermaidMetadata,\n ChartMetadata,\n CalloutMetadata,\n QueryMetadata,\n ScopeMetadata,\n Tag,\n TagEdge,\n BlockTag,\n NoteTag,\n Link,\n Snapshot,\n SrsCard,\n TagWithCounts,\n NoteWithTags,\n BlockWithTags,\n BacklinkResult,\n} from \"./types\";\n\nexport {\n signInWithOAuth,\n signInWithEmail,\n signUpWithEmail,\n signOut,\n getUser,\n getSession,\n getProfile,\n onAuthStateChange,\n type OAuthProvider,\n type User,\n type Session,\n} from \"./auth\";\n\nexport {\n createNote,\n getNote,\n updateNote,\n softDeleteNote,\n restoreNote,\n hardDeleteNote,\n emptyTrash,\n listNotes,\n getOrCreateDailyNote,\n type CreateNoteParams,\n type ListNotesParams,\n type FileCleanupFn,\n} from \"./notes\";\n\nexport {\n createBlock,\n getBlocksForNote,\n updateBlock,\n deleteBlock,\n upsertBlocks,\n saveNoteContent,\n type CreateBlockParams,\n} from \"./blocks\";\n\nexport {\n createTag,\n getOrCreateTag,\n getUserTags,\n updateTag,\n deleteTag,\n addTagEdge,\n removeTagEdge,\n getTagParents,\n getTagChildren,\n getTagDescendants,\n addBlockTag,\n removeBlockTag,\n getBlocksByTag,\n} from \"./tags\";\n\nexport {\n createLink,\n deleteLinksForBlock,\n getBacklinksForNote,\n syncLinksForNote,\n} from \"./links\";\n\nexport {\n createSnapshot,\n listSnapshots,\n getSnapshot,\n getLatestSnapshot,\n diffSnapshots,\n type DiffResult,\n} from \"./snapshots\";\n\nexport {\n fullTextSearch,\n searchByTag,\n searchByType,\n parseQuery,\n executeQuery,\n type SearchResult,\n type QueryFilter,\n} from \"./search\";\n\nexport {\n getGraphData,\n type GraphNode,\n type GraphEdge,\n type GraphData,\n} from \"./graph\";\n\nexport { NOTE_TEMPLATES, type NoteTemplate } from \"./templates\";\n\nexport {\n exportNoteAsJson,\n exportNoteAsMarkdown,\n} from \"./export\";\n\nexport { markdownToTiptap } from \"./md-to-tiptap\";\n\nexport {\n DEFAULT_STORAGE_CAP,\n getStorageInfo,\n getStorageUsed,\n getStorageCap,\n checkStorageCap,\n incrementStorageUsed,\n decrementStorageUsed,\n formatFileSize,\n} from \"./storage\";\n"],"mappings":"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","names":[]}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-PBF5EE4Y.js";
|
|
5
5
|
import {
|
|
6
6
|
createSupabaseClient
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-EEEL6ZKK.js";
|
|
8
8
|
|
|
9
9
|
// src/lib/client.ts
|
|
10
10
|
var cachedClient = null;
|
|
@@ -47,4 +47,4 @@ export {
|
|
|
47
47
|
getClient,
|
|
48
48
|
getUserId
|
|
49
49
|
};
|
|
50
|
-
//# sourceMappingURL=chunk-
|
|
50
|
+
//# sourceMappingURL=chunk-URRSVCB7.js.map
|
package/dist/commands/capture.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
getBlocksForNote,
|
|
8
8
|
listNotes,
|
|
9
9
|
saveNoteContent
|
|
10
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
11
11
|
|
|
12
12
|
// src/commands/capture.ts
|
|
13
13
|
import { Command, Args } from "@oclif/core";
|
package/dist/commands/daily.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
exportNoteAsMarkdown,
|
|
8
8
|
getOrCreateDailyNote,
|
|
9
9
|
listNotes
|
|
10
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
11
11
|
|
|
12
12
|
// src/commands/daily.ts
|
|
13
13
|
import { Command, Flags } from "@oclif/core";
|
package/dist/commands/delete.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
listNotes,
|
|
8
8
|
softDeleteNote
|
|
9
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
10
10
|
|
|
11
11
|
// src/commands/delete.ts
|
|
12
12
|
import { Command, Args } from "@oclif/core";
|
package/dist/commands/edit.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
exportNoteAsMarkdown,
|
|
8
8
|
listNotes,
|
|
9
9
|
markdownToTiptap,
|
|
10
10
|
saveNoteContent
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
12
12
|
|
|
13
13
|
// src/commands/edit.ts
|
|
14
14
|
import { Command, Args } from "@oclif/core";
|
package/dist/commands/export.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
exportNoteAsJson,
|
|
8
8
|
exportNoteAsMarkdown,
|
|
9
9
|
listNotes
|
|
10
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
11
11
|
|
|
12
12
|
// src/commands/export.ts
|
|
13
13
|
import { Command, Args, Flags } from "@oclif/core";
|
package/dist/commands/hello.js
CHANGED
package/dist/commands/help.js
CHANGED
package/dist/commands/howto.js
CHANGED
|
@@ -122,10 +122,16 @@ ${Y} \`\`\`${R}
|
|
|
122
122
|
${D} Types: graph/flowchart, sequenceDiagram, classDiagram,${R}
|
|
123
123
|
${D} erDiagram, stateDiagram, gantt, pie, gitGraph, mindmap${R}
|
|
124
124
|
|
|
125
|
-
${C} MATH
|
|
125
|
+
${C} INLINE MATH${R}
|
|
126
|
+
${Y} The value $E = mc^2$ is inline.${R}
|
|
127
|
+
${Y} Solve $\\frac{-b \\pm \\sqrt{b^2-4ac}}{2a}$ for $x$.${R}
|
|
128
|
+
${D} Use single $ for inline math within text.${R}
|
|
129
|
+
|
|
130
|
+
${C} BLOCK MATH (LaTeX via KaTeX)${R}
|
|
126
131
|
${Y} $$${R}
|
|
127
132
|
${Y} E = mc^2${R}
|
|
128
133
|
${Y} $$${R}
|
|
134
|
+
${D} Use $$ on separate lines for standalone equations.${R}
|
|
129
135
|
${D} LaTeX: \\frac{a}{b} \\sqrt{x} \\sum_{i=1}^{n} \\int_0^1${R}
|
|
130
136
|
${D} \\alpha \\beta \\pi \\infty \\text{label} x^{2} x_{i}${R}
|
|
131
137
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/howto.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\n\nconst D = \"\\x1b[90m\";\nconst B = \"\\x1b[1m\";\nconst C = \"\\x1b[36m\";\nconst Y = \"\\x1b[33m\";\nconst G = \"\\x1b[32m\";\nconst P = \"\\x1b[35m\";\nconst R = \"\\x1b[0m\";\n\nexport default class Howto extends Command {\n static override description = \"Complete guide for AI agents to create and manage Vertex notes\";\n\n async run(): Promise<void> {\n this.log(`\n${B}${P} Vertex — Complete AI Guide${R}\n${D} Everything an AI agent needs to create, edit, and manage notes.${R}\n${D} Read this once, then you can do anything in Vertex.${R}\n${D} ══════════════════════════════════════════════════════════════${R}\n\n${C}${B} 1. WHAT IS VERTEX?${R}\n${D} A knowledge workspace. Notes are stored in the cloud (Supabase).${R}\n${D} You write markdown in the terminal → it renders as rich content${R}\n${D} (diagrams, math, code, callouts) in the web app.${R}\n${D} Notes can link to each other via [[wiki links]] and #tags.${R}\n\n${C}${B} 2. HOW TO CREATE A NOTE${R}\n\n${D} Option A: Create and edit in one step${R}\n ${G}vertex new \"My Note Title\"${R}\n ${G}vertex edit \"My Note\"${R} ${D}← opens in $EDITOR (vim/nano/code)${R}\n\n${D} Option B: Write a .md file, then import${R}\n ${G}cat > note.md << 'EOF'${R}\n ${Y}# My Note Title${R}\n ${Y}Content here...${R}\n ${G}EOF${R}\n ${G}vertex import note.md -t \"My Note Title\"${R}\n\n${D} Option C: Quick one-liner to inbox${R}\n ${G}vertex capture \"Remember to review PR #42\"${R}\n\n${C}${B} 3. HOW TO EDIT AN EXISTING NOTE${R}\n\n ${G}vertex edit \"Note Title\"${R} ${D}← partial match works: \"Note\" matches \"Note Title\"${R}\n${D} This exports the note as markdown, opens your $EDITOR,${R}\n${D} and when you save & quit, it parses the markdown back${R}\n${D} and updates the note in the database.${R}\n\n${D} To use a specific editor:${R}\n ${G}EDITOR=nano vertex edit \"My Note\"${R}\n ${G}EDITOR=\"code --wait\" vertex edit \"My Note\"${R}\n ${G}EDITOR=vim vertex edit \"My Note\"${R}\n\n${C}${B} 4. HOW TO VIEW A NOTE (read-only)${R}\n\n ${G}vertex view \"Note Title\"${R} ${D}← prints markdown to stdout${R}\n ${G}vertex view \"Note\" | less${R} ${D}← paginated view${R}\n ${G}vertex export \"Note\" -o note.md${R} ${D}← save to file${R}\n\n${C}${B} 5. HOW TO LIST AND FIND NOTES${R}\n\n ${G}vertex notes${R} ${D}← list all notes${R}\n ${G}vertex search \"keyword\"${R} ${D}← full-text search${R}\n ${G}vertex search \"#tagname\"${R} ${D}← search by tag${R}\n ${G}vertex search \"type:todo status:open\"${R} ${D}← find open todos${R}\n ${G}vertex tags${R} ${D}← list all tags${R}\n ${G}vertex daily --last${R} ${D}← view latest daily note${R}\n\n${D} ══════════════════════════════════════════════════════════════${R}\n\n${C}${B} 6. MARKDOWN SYNTAX — ALL BLOCK TYPES${R}\n\n${D} ┌─ IMPORTANT ────────────────────────────────────────────────${R}\n${D} │ Every block must be separated by a BLANK LINE.${R}\n${D} │ The first # H1 heading becomes the note title.${R}\n${D} │ Tags must start with a letter (a-z): #valid not #123${R}\n${D} └──────────────────────────────────────────────────────────${R}\n\n${C} HEADINGS${R}\n${Y} # Heading 1${R}\n${Y} ## Heading 2${R}\n${Y} ### Heading 3${R}\n\n${C} TEXT FORMATTING${R}\n${Y} **bold text**${R}\n${Y} *italic text*${R}\n${Y} \\`inline code\\`${R}\n${Y} ~~strikethrough~~${R}\n\n${C} BULLET LIST${R}\n${Y} - Item one${R}\n${Y} - Item two${R}\n${Y} - Item three${R}\n\n${C} NUMBERED LIST${R}\n${Y} 1. First${R}\n${Y} 2. Second${R}\n${Y} 3. Third${R}\n\n${C} TODO TASKS${R}\n${Y} - [ ] Open task${R}\n${Y} - [x] Completed task${R}\n\n${C} BLOCKQUOTE${R}\n${Y} > Quoted text here${R}\n\n${C} DIVIDER${R}\n${Y} ---${R}\n\n${C} CODE BLOCK${R}\n${Y} \\`\\`\\`python${R}\n${Y} def hello():${R}\n${Y} print(\"Hello!\")${R}\n${Y} \\`\\`\\`${R}\n${D} Languages: python, javascript, typescript, rust, go, java,${R}\n${D} c, cpp, sql, html, css, json, yaml, bash, ruby, swift, etc.${R}\n\n${C} MERMAID DIAGRAM${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} graph TD;${R}\n${Y} A --> B --> C;${R}\n${Y} \\`\\`\\`${R}\n${D} Types: graph/flowchart, sequenceDiagram, classDiagram,${R}\n${D} erDiagram, stateDiagram, gantt, pie, gitGraph, mindmap${R}\n\n${C} MATH (LaTeX via KaTeX)${R}\n${Y} $$${R}\n${Y} E = mc^2${R}\n${Y} $$${R}\n${D} LaTeX: \\\\frac{a}{b} \\\\sqrt{x} \\\\sum_{i=1}^{n} \\\\int_0^1${R}\n${D} \\\\alpha \\\\beta \\\\pi \\\\infty \\\\text{label} x^{2} x_{i}${R}\n\n${C} CALLOUT${R}\n${Y} > [!info]${R}\n${Y} > Informational note${R}\n${D} Variants: info, warning, error, tip${R}\n${D} Multi-line: each line starts with > ${R}\n\n${C} QUERY BLOCK${R}\n${Y} > [!query]${R}\n${Y} > type:todo status:open #work${R}\n\n${C} INLINE LINK${R}\n${Y} [Link Text](https://example.com)${R}\n${D} Opens in new tab. Standard markdown link syntax.${R}\n\n${C} EMBED (link preview)${R}\n${Y} > [!embed]${R}\n${Y} > https://youtube.com/watch?v=ID${R}\n${D} YouTube → video player. Other URLs → preview card.${R}\n\n${C} IMAGE${R}\n${Y} ${R}\n\n${C} FILE ATTACHMENT${R}\n${Y} > [!file]${R}\n${Y} > [filename.pdf](https://url.com/file.pdf)${R}\n${Y} > application/pdf 149780${R}\n\n${D} ══════════════════════════════════════════════════════════════${R}\n\n${C}${B} 7. WIKI LINKS — HOW TO CONNECT NOTES${R}\n\n${D} Wiki links create connections between notes.${R}\n${D} They render as clickable purple links in the web app.${R}\n${D} The linked note shows a \"backlink\" at the bottom.${R}\n\n${Y} Check out [[Project Roadmap]] for details.${R}\n${Y} This connects to [[AI Research Notes]] and [[Meeting Notes]].${R}\n\n${D} Rules:${R}\n${D} • Use the exact note title inside [[ ]]${R}\n${D} • Case-insensitive: [[my note]] matches \"My Note\"${R}\n${D} • If the note doesn't exist yet, the link is still created${R}\n${D} • Multiple links in one paragraph is fine${R}\n${D} • Wiki links work in any text: paragraphs, todos, callouts${R}\n\n${D} Example: Create a network of linked notes${R}\n ${G}vertex new \"Hub Note\"${R}\n ${G}vertex edit \"Hub Note\"${R}\n${D} Then write:${R}\n${Y} # Hub Note${R}\n${Y} ${R}\n${Y} This connects to:${R}\n${Y} - [[Topic A]] — first topic${R}\n${Y} - [[Topic B]] — second topic${R}\n${Y} - [[Topic C]] — third topic${R}\n\n${C}${B} 8. TAGS — HOW THEY WORK${R}\n\n${D} Tags categorize content. They appear as purple pills in the web app.${R}\n${D} Tags are auto-created when you use them — no need to create first.${R}\n\n${C} Basic tags:${R}\n${Y} This paragraph has #work and #important tags.${R}\n${Y} - [x] Finish report #work #deadline${R}\n\n${C} Rules:${R}\n${D} • Must start with a letter: #valid, #tag123${R}\n${D} • Can contain letters, numbers, hyphens, underscores: #my-tag, #my_tag${R}\n${D} • NO spaces: #my tag is wrong → use #my-tag${R}\n${D} • Tags are case-insensitive: #Work = #work${R}\n${D} • Tags work everywhere: paragraphs, todos, headings, callouts${R}\n\n${C}${B} 9. TAG HIERARCHY — PARENT/CHILD RELATIONSHIPS${R}\n\n${D} Tags can have parent-child relationships using / separator.${R}\n${D} This creates a DAG (directed acyclic graph) of tags.${R}\n\n${Y} This is about #work/frontend${R} ${D}← creates: work → frontend${R}\n${Y} Also covers #work/backend${R} ${D}← creates: work → backend${R}\n${Y} Deep nesting: #cs/algo/sorting${R} ${D}← creates: cs → algo → sorting${R}\n\n${D} What happens:${R}\n${D} • Only the LEAF tag is applied to the block: \"frontend\" not \"work\"${R}\n${D} • Parent tags are auto-created if they don't exist${R}\n${D} • Parent→child edges are created in the tag hierarchy${R}\n${D} • Searching #work finds blocks tagged with #work AND all children${R}\n${D} (frontend, backend, etc.)${R}\n\n${D} You can also set relationships via command palette (Cmd+K in web):${R}\n${D} \"Tag Extend\" → pick parent and child tags${R}\n\n${C}${B} 10. SEARCH QUERY SYNTAX${R}\n\n ${G}vertex search \"keyword\"${R} ${D}← full-text search${R}\n ${G}vertex search \"#work\"${R} ${D}← all blocks tagged #work (+ children)${R}\n ${G}vertex search \"#work/frontend\"${R} ${D}← searches the leaf tag \"frontend\"${R}\n ${G}vertex search \"type:todo\"${R} ${D}← all todo blocks${R}\n ${G}vertex search \"type:code\"${R} ${D}← all code blocks${R}\n ${G}vertex search \"type:heading\"${R} ${D}← all headings${R}\n ${G}vertex search \"status:open\"${R} ${D}← unchecked todos${R}\n ${G}vertex search \"status:done\"${R} ${D}← checked todos${R}\n ${G}vertex search \"type:todo status:open #work\"${R} ${D}← combine filters${R}\n ${G}vertex search \"type:todo #work keyword\"${R} ${D}← all three${R}\n\n${C}${B} 11. DAILY NOTES${R}\n\n ${G}vertex daily${R} ${D}← view/create today's daily note${R}\n ${G}vertex daily --last${R} ${D}← view most recent daily (no create)${R}\n ${G}vertex today${R} ${D}← open latest daily in interactive TUI${R}\n\n${D} Daily notes are auto-titled with the date: \"April 14, 2026\"${R}\n${D} One daily note per day — calling vertex daily twice won't duplicate.${R}\n\n${C}${B} 12. INTERACTIVE MODE${R}\n\n ${G}vertex interactive \"Note Title\"${R} ${D}← open any note${R}\n ${G}vertex today${R} ${D}← shortcut for latest daily${R}\n\n${D} Controls:${R}\n${D} ↑ ↓ Move cursor between items${R}\n${D} Enter Toggle todo done/undone${R}\n${D} t Add new todo${R}\n${D} n Add new text line${R}\n${D} d Delete item at cursor${R}\n${D} e Open in $EDITOR for full editing${R}\n${D} s Save changes${R}\n${D} q Save and quit${R}\n\n${C}${B} 13. TRASH & DELETE${R}\n\n ${G}vertex delete \"Note\"${R} ${D}← soft delete (recoverable)${R}\n ${G}vertex trash${R} ${D}← list trashed notes${R}\n ${G}vertex restore \"Note\"${R} ${D}← restore from trash${R}\n ${G}vertex trash:empty${R} ${D}← permanent delete all (irreversible)${R}\n\n${D} Soft delete: note goes to trash, can be restored${R}\n${D} Hard delete (trash:empty): note + files + tags permanently removed${R}\n\n${C}${B} 14. ALL COMMANDS REFERENCE${R}\n\n ${G}vertex login${R} ${D}← authenticate (GitHub/Google/Email)${R}\n ${G}vertex logout${R} ${D}← clear session${R}\n ${G}vertex whoami${R} ${D}← show logged-in user${R}\n ${G}vertex notes${R} ${D}← list all notes${R}\n ${G}vertex new [title]${R} ${D}← create note${R}\n ${G}vertex view <title>${R} ${D}← view as markdown${R}\n ${G}vertex edit <title>${R} ${D}← edit in $EDITOR${R}\n ${G}vertex daily${R} ${D}← today's daily note${R}\n ${G}vertex daily --last${R} ${D}← latest daily note${R}\n ${G}vertex today${R} ${D}← latest daily → interactive${R}\n ${G}vertex interactive <title>${R} ${D}← interactive TUI mode${R}\n ${G}vertex capture \"text\"${R} ${D}← quick capture to inbox${R}\n ${G}vertex search <query>${R} ${D}← search notes${R}\n ${G}vertex tags${R} ${D}← list tags${R}\n ${G}vertex import <file.md>${R} ${D}← import markdown as note${R}\n ${G}vertex import <file> -t \"T\"${R} ${D}← import with title${R}\n ${G}vertex export <title>${R} ${D}← export as markdown${R}\n ${G}vertex export <title> -o file${R} ${D}← export to file${R}\n ${G}vertex export <title> --json${R} ${D}← export as JSON${R}\n ${G}vertex delete <title>${R} ${D}← soft delete${R}\n ${G}vertex restore <title>${R} ${D}← restore from trash${R}\n ${G}vertex trash${R} ${D}← list trash${R}\n ${G}vertex trash:empty${R} ${D}← empty trash permanently${R}\n ${G}vertex status${R} ${D}← storage, note count, version${R}\n ${G}vertex syntax${R} ${D}← markdown syntax reference${R}\n ${G}vertex howto${R} ${D}← this guide${R}\n ${G}vertex help${R} ${D}← command overview${R}\n\n${C}${B} 15. FULL EXAMPLE — AI CREATING A COMPLETE NOTE${R}\n${D} ──────────────────────────────────────────────────────────────${R}\n\n ${G}cat > /tmp/my-note.md << 'VERTEX'${R}\n ${Y}# Distributed Systems Study Guide${R}\n ${Y}${R}\n ${Y}Notes from studying distributed systems. #learning #cs${R}\n ${Y}${R}\n ${Y}## CAP Theorem${R}\n ${Y}${R}\n ${Y}A distributed system can only guarantee 2 of 3:${R}\n ${Y}${R}\n ${Y}- **Consistency** — every read gets the latest write${R}\n ${Y}- **Availability** — every request gets a response${R}\n ${Y}- **Partition tolerance** — system works despite network failures${R}\n ${Y}${R}\n ${Y}> [!warning]${R}\n ${Y}> In practice, P is non-negotiable. You choose between CP and AP.${R}\n ${Y}${R}\n ${Y}## Consensus Algorithm${R}\n ${Y}${R}\n ${Y}\\`\\`\\`mermaid${R}\n ${Y}sequenceDiagram${R}\n ${Y} Leader->>Follower1: AppendEntries${R}\n ${Y} Leader->>Follower2: AppendEntries${R}\n ${Y} Follower1-->>Leader: ACK${R}\n ${Y} Follower2-->>Leader: ACK${R}\n ${Y} Leader->>Leader: Commit (majority ACK)${R}\n ${Y}\\`\\`\\`${R}\n ${Y}${R}\n ${Y}## Consistency Models${R}\n ${Y}${R}\n ${Y}$$${R}\n ${Y}\\\\text{Linearizability} \\\\subset \\\\text{Sequential} \\\\subset \\\\text{Causal} \\\\subset \\\\text{Eventual}${R}\n ${Y}$$${R}\n ${Y}${R}\n ${Y}## Implementation${R}\n ${Y}${R}\n ${Y}\\`\\`\\`go${R}\n ${Y}type RaftNode struct {${R}\n ${Y} state State${R}\n ${Y} term int${R}\n ${Y} votedFor string${R}\n ${Y} log []Entry${R}\n ${Y}}${R}\n ${Y}\\`\\`\\`${R}\n ${Y}${R}\n ${Y}## Reading List${R}\n ${Y}${R}\n ${Y}- [x] Designing Data-Intensive Applications #learning/books${R}\n ${Y}- [ ] Raft paper #learning/papers${R}\n ${Y}- [ ] Paxos Made Simple #learning/papers${R}\n ${Y}${R}\n ${Y}> [!tip]${R}\n ${Y}> Start with Raft — it's simpler than Paxos and used in etcd.${R}\n ${Y}${R}\n ${Y}---${R}\n ${Y}${R}\n ${Y}Related: [[Project Roadmap]] · [[AI Research Notes]]${R}\n ${G}VERTEX${R}\n\n ${G}vertex import /tmp/my-note.md -t \"Distributed Systems Study Guide\"${R}\n\n${D} ──────────────────────────────────────────────────────────────${R}\n${D} This creates a note with: heading, bullets, callouts, mermaid,${R}\n${D} math, code, todos with scoped tags, wiki links, and a divider.${R}\n${D} Open the web app to see it rendered with rich blocks.${R}\n`);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/howto.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\n\nconst D = \"\\x1b[90m\";\nconst B = \"\\x1b[1m\";\nconst C = \"\\x1b[36m\";\nconst Y = \"\\x1b[33m\";\nconst G = \"\\x1b[32m\";\nconst P = \"\\x1b[35m\";\nconst R = \"\\x1b[0m\";\n\nexport default class Howto extends Command {\n static override description = \"Complete guide for AI agents to create and manage Vertex notes\";\n\n async run(): Promise<void> {\n this.log(`\n${B}${P} Vertex — Complete AI Guide${R}\n${D} Everything an AI agent needs to create, edit, and manage notes.${R}\n${D} Read this once, then you can do anything in Vertex.${R}\n${D} ══════════════════════════════════════════════════════════════${R}\n\n${C}${B} 1. WHAT IS VERTEX?${R}\n${D} A knowledge workspace. Notes are stored in the cloud (Supabase).${R}\n${D} You write markdown in the terminal → it renders as rich content${R}\n${D} (diagrams, math, code, callouts) in the web app.${R}\n${D} Notes can link to each other via [[wiki links]] and #tags.${R}\n\n${C}${B} 2. HOW TO CREATE A NOTE${R}\n\n${D} Option A: Create and edit in one step${R}\n ${G}vertex new \"My Note Title\"${R}\n ${G}vertex edit \"My Note\"${R} ${D}← opens in $EDITOR (vim/nano/code)${R}\n\n${D} Option B: Write a .md file, then import${R}\n ${G}cat > note.md << 'EOF'${R}\n ${Y}# My Note Title${R}\n ${Y}Content here...${R}\n ${G}EOF${R}\n ${G}vertex import note.md -t \"My Note Title\"${R}\n\n${D} Option C: Quick one-liner to inbox${R}\n ${G}vertex capture \"Remember to review PR #42\"${R}\n\n${C}${B} 3. HOW TO EDIT AN EXISTING NOTE${R}\n\n ${G}vertex edit \"Note Title\"${R} ${D}← partial match works: \"Note\" matches \"Note Title\"${R}\n${D} This exports the note as markdown, opens your $EDITOR,${R}\n${D} and when you save & quit, it parses the markdown back${R}\n${D} and updates the note in the database.${R}\n\n${D} To use a specific editor:${R}\n ${G}EDITOR=nano vertex edit \"My Note\"${R}\n ${G}EDITOR=\"code --wait\" vertex edit \"My Note\"${R}\n ${G}EDITOR=vim vertex edit \"My Note\"${R}\n\n${C}${B} 4. HOW TO VIEW A NOTE (read-only)${R}\n\n ${G}vertex view \"Note Title\"${R} ${D}← prints markdown to stdout${R}\n ${G}vertex view \"Note\" | less${R} ${D}← paginated view${R}\n ${G}vertex export \"Note\" -o note.md${R} ${D}← save to file${R}\n\n${C}${B} 5. HOW TO LIST AND FIND NOTES${R}\n\n ${G}vertex notes${R} ${D}← list all notes${R}\n ${G}vertex search \"keyword\"${R} ${D}← full-text search${R}\n ${G}vertex search \"#tagname\"${R} ${D}← search by tag${R}\n ${G}vertex search \"type:todo status:open\"${R} ${D}← find open todos${R}\n ${G}vertex tags${R} ${D}← list all tags${R}\n ${G}vertex daily --last${R} ${D}← view latest daily note${R}\n\n${D} ══════════════════════════════════════════════════════════════${R}\n\n${C}${B} 6. MARKDOWN SYNTAX — ALL BLOCK TYPES${R}\n\n${D} ┌─ IMPORTANT ────────────────────────────────────────────────${R}\n${D} │ Every block must be separated by a BLANK LINE.${R}\n${D} │ The first # H1 heading becomes the note title.${R}\n${D} │ Tags must start with a letter (a-z): #valid not #123${R}\n${D} └──────────────────────────────────────────────────────────${R}\n\n${C} HEADINGS${R}\n${Y} # Heading 1${R}\n${Y} ## Heading 2${R}\n${Y} ### Heading 3${R}\n\n${C} TEXT FORMATTING${R}\n${Y} **bold text**${R}\n${Y} *italic text*${R}\n${Y} \\`inline code\\`${R}\n${Y} ~~strikethrough~~${R}\n\n${C} BULLET LIST${R}\n${Y} - Item one${R}\n${Y} - Item two${R}\n${Y} - Item three${R}\n\n${C} NUMBERED LIST${R}\n${Y} 1. First${R}\n${Y} 2. Second${R}\n${Y} 3. Third${R}\n\n${C} TODO TASKS${R}\n${Y} - [ ] Open task${R}\n${Y} - [x] Completed task${R}\n\n${C} BLOCKQUOTE${R}\n${Y} > Quoted text here${R}\n\n${C} DIVIDER${R}\n${Y} ---${R}\n\n${C} CODE BLOCK${R}\n${Y} \\`\\`\\`python${R}\n${Y} def hello():${R}\n${Y} print(\"Hello!\")${R}\n${Y} \\`\\`\\`${R}\n${D} Languages: python, javascript, typescript, rust, go, java,${R}\n${D} c, cpp, sql, html, css, json, yaml, bash, ruby, swift, etc.${R}\n\n${C} MERMAID DIAGRAM${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} graph TD;${R}\n${Y} A --> B --> C;${R}\n${Y} \\`\\`\\`${R}\n${D} Types: graph/flowchart, sequenceDiagram, classDiagram,${R}\n${D} erDiagram, stateDiagram, gantt, pie, gitGraph, mindmap${R}\n\n${C} INLINE MATH${R}\n${Y} The value $E = mc^2$ is inline.${R}\n${Y} Solve $\\\\frac{-b \\\\pm \\\\sqrt{b^2-4ac}}{2a}$ for $x$.${R}\n${D} Use single $ for inline math within text.${R}\n\n${C} BLOCK MATH (LaTeX via KaTeX)${R}\n${Y} $$${R}\n${Y} E = mc^2${R}\n${Y} $$${R}\n${D} Use $$ on separate lines for standalone equations.${R}\n${D} LaTeX: \\\\frac{a}{b} \\\\sqrt{x} \\\\sum_{i=1}^{n} \\\\int_0^1${R}\n${D} \\\\alpha \\\\beta \\\\pi \\\\infty \\\\text{label} x^{2} x_{i}${R}\n\n${C} CALLOUT${R}\n${Y} > [!info]${R}\n${Y} > Informational note${R}\n${D} Variants: info, warning, error, tip${R}\n${D} Multi-line: each line starts with > ${R}\n\n${C} QUERY BLOCK${R}\n${Y} > [!query]${R}\n${Y} > type:todo status:open #work${R}\n\n${C} INLINE LINK${R}\n${Y} [Link Text](https://example.com)${R}\n${D} Opens in new tab. Standard markdown link syntax.${R}\n\n${C} EMBED (link preview)${R}\n${Y} > [!embed]${R}\n${Y} > https://youtube.com/watch?v=ID${R}\n${D} YouTube → video player. Other URLs → preview card.${R}\n\n${C} IMAGE${R}\n${Y} ${R}\n\n${C} FILE ATTACHMENT${R}\n${Y} > [!file]${R}\n${Y} > [filename.pdf](https://url.com/file.pdf)${R}\n${Y} > application/pdf 149780${R}\n\n${D} ══════════════════════════════════════════════════════════════${R}\n\n${C}${B} 7. WIKI LINKS — HOW TO CONNECT NOTES${R}\n\n${D} Wiki links create connections between notes.${R}\n${D} They render as clickable purple links in the web app.${R}\n${D} The linked note shows a \"backlink\" at the bottom.${R}\n\n${Y} Check out [[Project Roadmap]] for details.${R}\n${Y} This connects to [[AI Research Notes]] and [[Meeting Notes]].${R}\n\n${D} Rules:${R}\n${D} • Use the exact note title inside [[ ]]${R}\n${D} • Case-insensitive: [[my note]] matches \"My Note\"${R}\n${D} • If the note doesn't exist yet, the link is still created${R}\n${D} • Multiple links in one paragraph is fine${R}\n${D} • Wiki links work in any text: paragraphs, todos, callouts${R}\n\n${D} Example: Create a network of linked notes${R}\n ${G}vertex new \"Hub Note\"${R}\n ${G}vertex edit \"Hub Note\"${R}\n${D} Then write:${R}\n${Y} # Hub Note${R}\n${Y} ${R}\n${Y} This connects to:${R}\n${Y} - [[Topic A]] — first topic${R}\n${Y} - [[Topic B]] — second topic${R}\n${Y} - [[Topic C]] — third topic${R}\n\n${C}${B} 8. TAGS — HOW THEY WORK${R}\n\n${D} Tags categorize content. They appear as purple pills in the web app.${R}\n${D} Tags are auto-created when you use them — no need to create first.${R}\n\n${C} Basic tags:${R}\n${Y} This paragraph has #work and #important tags.${R}\n${Y} - [x] Finish report #work #deadline${R}\n\n${C} Rules:${R}\n${D} • Must start with a letter: #valid, #tag123${R}\n${D} • Can contain letters, numbers, hyphens, underscores: #my-tag, #my_tag${R}\n${D} • NO spaces: #my tag is wrong → use #my-tag${R}\n${D} • Tags are case-insensitive: #Work = #work${R}\n${D} • Tags work everywhere: paragraphs, todos, headings, callouts${R}\n\n${C}${B} 9. TAG HIERARCHY — PARENT/CHILD RELATIONSHIPS${R}\n\n${D} Tags can have parent-child relationships using / separator.${R}\n${D} This creates a DAG (directed acyclic graph) of tags.${R}\n\n${Y} This is about #work/frontend${R} ${D}← creates: work → frontend${R}\n${Y} Also covers #work/backend${R} ${D}← creates: work → backend${R}\n${Y} Deep nesting: #cs/algo/sorting${R} ${D}← creates: cs → algo → sorting${R}\n\n${D} What happens:${R}\n${D} • Only the LEAF tag is applied to the block: \"frontend\" not \"work\"${R}\n${D} • Parent tags are auto-created if they don't exist${R}\n${D} • Parent→child edges are created in the tag hierarchy${R}\n${D} • Searching #work finds blocks tagged with #work AND all children${R}\n${D} (frontend, backend, etc.)${R}\n\n${D} You can also set relationships via command palette (Cmd+K in web):${R}\n${D} \"Tag Extend\" → pick parent and child tags${R}\n\n${C}${B} 10. SEARCH QUERY SYNTAX${R}\n\n ${G}vertex search \"keyword\"${R} ${D}← full-text search${R}\n ${G}vertex search \"#work\"${R} ${D}← all blocks tagged #work (+ children)${R}\n ${G}vertex search \"#work/frontend\"${R} ${D}← searches the leaf tag \"frontend\"${R}\n ${G}vertex search \"type:todo\"${R} ${D}← all todo blocks${R}\n ${G}vertex search \"type:code\"${R} ${D}← all code blocks${R}\n ${G}vertex search \"type:heading\"${R} ${D}← all headings${R}\n ${G}vertex search \"status:open\"${R} ${D}← unchecked todos${R}\n ${G}vertex search \"status:done\"${R} ${D}← checked todos${R}\n ${G}vertex search \"type:todo status:open #work\"${R} ${D}← combine filters${R}\n ${G}vertex search \"type:todo #work keyword\"${R} ${D}← all three${R}\n\n${C}${B} 11. DAILY NOTES${R}\n\n ${G}vertex daily${R} ${D}← view/create today's daily note${R}\n ${G}vertex daily --last${R} ${D}← view most recent daily (no create)${R}\n ${G}vertex today${R} ${D}← open latest daily in interactive TUI${R}\n\n${D} Daily notes are auto-titled with the date: \"April 14, 2026\"${R}\n${D} One daily note per day — calling vertex daily twice won't duplicate.${R}\n\n${C}${B} 12. INTERACTIVE MODE${R}\n\n ${G}vertex interactive \"Note Title\"${R} ${D}← open any note${R}\n ${G}vertex today${R} ${D}← shortcut for latest daily${R}\n\n${D} Controls:${R}\n${D} ↑ ↓ Move cursor between items${R}\n${D} Enter Toggle todo done/undone${R}\n${D} t Add new todo${R}\n${D} n Add new text line${R}\n${D} d Delete item at cursor${R}\n${D} e Open in $EDITOR for full editing${R}\n${D} s Save changes${R}\n${D} q Save and quit${R}\n\n${C}${B} 13. TRASH & DELETE${R}\n\n ${G}vertex delete \"Note\"${R} ${D}← soft delete (recoverable)${R}\n ${G}vertex trash${R} ${D}← list trashed notes${R}\n ${G}vertex restore \"Note\"${R} ${D}← restore from trash${R}\n ${G}vertex trash:empty${R} ${D}← permanent delete all (irreversible)${R}\n\n${D} Soft delete: note goes to trash, can be restored${R}\n${D} Hard delete (trash:empty): note + files + tags permanently removed${R}\n\n${C}${B} 14. ALL COMMANDS REFERENCE${R}\n\n ${G}vertex login${R} ${D}← authenticate (GitHub/Google/Email)${R}\n ${G}vertex logout${R} ${D}← clear session${R}\n ${G}vertex whoami${R} ${D}← show logged-in user${R}\n ${G}vertex notes${R} ${D}← list all notes${R}\n ${G}vertex new [title]${R} ${D}← create note${R}\n ${G}vertex view <title>${R} ${D}← view as markdown${R}\n ${G}vertex edit <title>${R} ${D}← edit in $EDITOR${R}\n ${G}vertex daily${R} ${D}← today's daily note${R}\n ${G}vertex daily --last${R} ${D}← latest daily note${R}\n ${G}vertex today${R} ${D}← latest daily → interactive${R}\n ${G}vertex interactive <title>${R} ${D}← interactive TUI mode${R}\n ${G}vertex capture \"text\"${R} ${D}← quick capture to inbox${R}\n ${G}vertex search <query>${R} ${D}← search notes${R}\n ${G}vertex tags${R} ${D}← list tags${R}\n ${G}vertex import <file.md>${R} ${D}← import markdown as note${R}\n ${G}vertex import <file> -t \"T\"${R} ${D}← import with title${R}\n ${G}vertex export <title>${R} ${D}← export as markdown${R}\n ${G}vertex export <title> -o file${R} ${D}← export to file${R}\n ${G}vertex export <title> --json${R} ${D}← export as JSON${R}\n ${G}vertex delete <title>${R} ${D}← soft delete${R}\n ${G}vertex restore <title>${R} ${D}← restore from trash${R}\n ${G}vertex trash${R} ${D}← list trash${R}\n ${G}vertex trash:empty${R} ${D}← empty trash permanently${R}\n ${G}vertex status${R} ${D}← storage, note count, version${R}\n ${G}vertex syntax${R} ${D}← markdown syntax reference${R}\n ${G}vertex howto${R} ${D}← this guide${R}\n ${G}vertex help${R} ${D}← command overview${R}\n\n${C}${B} 15. FULL EXAMPLE — AI CREATING A COMPLETE NOTE${R}\n${D} ──────────────────────────────────────────────────────────────${R}\n\n ${G}cat > /tmp/my-note.md << 'VERTEX'${R}\n ${Y}# Distributed Systems Study Guide${R}\n ${Y}${R}\n ${Y}Notes from studying distributed systems. #learning #cs${R}\n ${Y}${R}\n ${Y}## CAP Theorem${R}\n ${Y}${R}\n ${Y}A distributed system can only guarantee 2 of 3:${R}\n ${Y}${R}\n ${Y}- **Consistency** — every read gets the latest write${R}\n ${Y}- **Availability** — every request gets a response${R}\n ${Y}- **Partition tolerance** — system works despite network failures${R}\n ${Y}${R}\n ${Y}> [!warning]${R}\n ${Y}> In practice, P is non-negotiable. You choose between CP and AP.${R}\n ${Y}${R}\n ${Y}## Consensus Algorithm${R}\n ${Y}${R}\n ${Y}\\`\\`\\`mermaid${R}\n ${Y}sequenceDiagram${R}\n ${Y} Leader->>Follower1: AppendEntries${R}\n ${Y} Leader->>Follower2: AppendEntries${R}\n ${Y} Follower1-->>Leader: ACK${R}\n ${Y} Follower2-->>Leader: ACK${R}\n ${Y} Leader->>Leader: Commit (majority ACK)${R}\n ${Y}\\`\\`\\`${R}\n ${Y}${R}\n ${Y}## Consistency Models${R}\n ${Y}${R}\n ${Y}$$${R}\n ${Y}\\\\text{Linearizability} \\\\subset \\\\text{Sequential} \\\\subset \\\\text{Causal} \\\\subset \\\\text{Eventual}${R}\n ${Y}$$${R}\n ${Y}${R}\n ${Y}## Implementation${R}\n ${Y}${R}\n ${Y}\\`\\`\\`go${R}\n ${Y}type RaftNode struct {${R}\n ${Y} state State${R}\n ${Y} term int${R}\n ${Y} votedFor string${R}\n ${Y} log []Entry${R}\n ${Y}}${R}\n ${Y}\\`\\`\\`${R}\n ${Y}${R}\n ${Y}## Reading List${R}\n ${Y}${R}\n ${Y}- [x] Designing Data-Intensive Applications #learning/books${R}\n ${Y}- [ ] Raft paper #learning/papers${R}\n ${Y}- [ ] Paxos Made Simple #learning/papers${R}\n ${Y}${R}\n ${Y}> [!tip]${R}\n ${Y}> Start with Raft — it's simpler than Paxos and used in etcd.${R}\n ${Y}${R}\n ${Y}---${R}\n ${Y}${R}\n ${Y}Related: [[Project Roadmap]] · [[AI Research Notes]]${R}\n ${G}VERTEX${R}\n\n ${G}vertex import /tmp/my-note.md -t \"Distributed Systems Study Guide\"${R}\n\n${D} ──────────────────────────────────────────────────────────────${R}\n${D} This creates a note with: heading, bullets, callouts, mermaid,${R}\n${D} math, code, todos with scoped tags, wiki links, and a divider.${R}\n${D} Open the web app to see it rendered with rich blocks.${R}\n`);\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/commands/import.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
createNote,
|
|
8
8
|
markdownToTiptap,
|
|
9
9
|
saveNoteContent
|
|
10
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
11
11
|
|
|
12
12
|
// src/commands/import.ts
|
|
13
13
|
import { Command, Args, Flags } from "@oclif/core";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
exportNoteAsMarkdown,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
listNotes,
|
|
10
10
|
markdownToTiptap,
|
|
11
11
|
saveNoteContent
|
|
12
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
13
13
|
|
|
14
14
|
// src/commands/interactive.ts
|
|
15
15
|
import { Command, Args } from "@oclif/core";
|
package/dist/commands/login.js
CHANGED
package/dist/commands/new.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
createNote
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
9
9
|
|
|
10
10
|
// src/commands/new.ts
|
|
11
11
|
import { Command, Args } from "@oclif/core";
|
package/dist/commands/notes.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
listNotes
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
9
9
|
|
|
10
10
|
// src/commands/notes.ts
|
|
11
11
|
import { Command } from "@oclif/core";
|
package/dist/commands/restore.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
listNotes,
|
|
8
8
|
restoreNote
|
|
9
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
10
10
|
|
|
11
11
|
// src/commands/restore.ts
|
|
12
12
|
import { Command, Args } from "@oclif/core";
|
package/dist/commands/search.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
executeQuery
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
9
9
|
|
|
10
10
|
// src/commands/search.ts
|
|
11
11
|
import { Command, Args } from "@oclif/core";
|
package/dist/commands/status.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import {
|
|
6
6
|
loadConfig
|
|
7
7
|
} from "../chunk-PBF5EE4Y.js";
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
formatFileSize,
|
|
11
11
|
getStorageInfo,
|
|
12
12
|
listNotes
|
|
13
|
-
} from "../chunk-
|
|
13
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
14
14
|
|
|
15
15
|
// src/commands/status.ts
|
|
16
16
|
import { Command } from "@oclif/core";
|
package/dist/commands/syntax.js
CHANGED
|
@@ -120,7 +120,13 @@ ${Y} \`\`\`${R}
|
|
|
120
120
|
|
|
121
121
|
${D} Also: gantt, pie, stateDiagram, flowchart, gitGraph, mindmap${R}
|
|
122
122
|
|
|
123
|
-
${C}${B} \u2501\u2501\u2501 MATH
|
|
123
|
+
${C}${B} \u2501\u2501\u2501 MATH (LaTeX) \u2501\u2501\u2501${R}
|
|
124
|
+
|
|
125
|
+
${C} Inline math (within text):${R}
|
|
126
|
+
${Y} The formula $E = mc^2$ is famous.${R}
|
|
127
|
+
${Y} Solve for $x$ where $ax^2 + bx + c = 0$.${R}
|
|
128
|
+
|
|
129
|
+
${C} Block math (standalone):${R}
|
|
124
130
|
${D} Use $$ on its own line to open and close. KaTeX syntax.${R}
|
|
125
131
|
|
|
126
132
|
${Y} $$${R}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/syntax.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\n\nconst D = \"\\x1b[90m\";\nconst B = \"\\x1b[1m\";\nconst C = \"\\x1b[36m\";\nconst Y = \"\\x1b[33m\";\nconst G = \"\\x1b[32m\";\nconst P = \"\\x1b[35m\";\nconst R = \"\\x1b[0m\";\n\nexport default class Syntax extends Command {\n static override description = \"Show all Vertex markdown syntax for writing notes\";\n\n async run(): Promise<void> {\n this.log(`\n${B}${P} Vertex Markdown Syntax — Complete Reference${R}\n${D} For AI agents and humans writing Vertex notes from the terminal.${R}\n${D} ──────────────────────────────────────────────────────────${R}\n\n${C}${B} RULES${R}\n${D} • Each block must be separated by a blank line${R}\n${D} • First # Heading 1 in a note becomes the note title${R}\n${D} • Tags must start with a letter: #valid #123invalid${R}\n${D} • Wiki links are case-insensitive: [[My Note]] matches \"my note\"${R}\n${D} • Indent with spaces, not tabs${R}\n\n${C}${B} ━━━ TEXT & HEADINGS ━━━${R}\n\n${Y} # Heading 1${R} ${D}← note title${R}\n${Y} ## Heading 2${R} ${D}← section${R}\n${Y} ### Heading 3${R} ${D}← subsection${R}\n${Y} #### Heading 4${R} ${D}← minor heading${R}\n\n${Y} Plain paragraph text.${R} ${D}← just text on a line${R}\n${Y} **bold** *italic* \\`code\\` ~~strike~~${R}\n\n${C}${B} ━━━ LINKS & TAGS ━━━${R}\n\n${Y} [[Note Title]]${R} ${D}← wiki link (navigates to note)${R}\n${Y} #tagname${R} ${D}← tag (auto-created, purple pill)${R}\n${Y} #parent/child${R} ${D}← scoped tag (creates hierarchy)${R}\n${Y} #work/frontend${R} ${D}← example: parent=work, child=frontend${R}\n\n${C}${B} ━━━ LISTS ━━━${R}\n\n${Y} - Bullet item one${R}\n${Y} - Bullet item two${R}\n${Y} - Bullet item three${R}\n\n${Y} 1. Numbered item one${R}\n${Y} 2. Numbered item two${R}\n${Y} 3. Numbered item three${R}\n\n${Y} - [ ] Open todo task${R}\n${Y} - [x] Completed todo task${R}\n${Y} - [ ] Another open task #work${R} ${D}← tags work inside tasks${R}\n\n${C}${B} ━━━ BLOCKQUOTE ━━━${R}\n\n${Y} > Single line quote${R}\n\n${Y} > Multi-line quote${R}\n${Y} > continues with > prefix${R}\n${Y} > on each line${R}\n\n${C}${B} ━━━ DIVIDER ━━━${R}\n\n${Y} ---${R} ${D}← horizontal rule${R}\n\n${C}${B} ━━━ CODE BLOCK ━━━${R}\n\n${Y} \\`\\`\\`javascript${R}\n${Y} function greet(name) {${R}\n${Y} return \\`Hello, \\${name}!\\`;${R}\n${Y} }${R}\n${Y} \\`\\`\\`${R}\n\n${D} Languages: python, javascript, typescript, rust, go, java,${R}\n${D} c, cpp, csharp, ruby, php, swift, kotlin, sql, html, css,${R}\n${D} json, yaml, xml, markdown, bash, shell, dockerfile, graphql${R}\n\n${C}${B} ━━━ MERMAID DIAGRAM ━━━${R}\n${D} Use \\`\\`\\`mermaid to open, \\`\\`\\` to close. All Mermaid syntax works.${R}\n\n${D} Flowchart:${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} graph TD;${R}\n${Y} A[Start] --> B{Decision};${R}\n${Y} B -->|Yes| C[Do X];${R}\n${Y} B -->|No| D[Do Y];${R}\n${Y} C --> E[End];${R}\n${Y} D --> E;${R}\n${Y} \\`\\`\\`${R}\n\n${D} Sequence diagram:${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} sequenceDiagram${R}\n${Y} Client->>Server: Request${R}\n${Y} Server->>DB: Query${R}\n${Y} DB-->>Server: Result${R}\n${Y} Server-->>Client: Response${R}\n${Y} \\`\\`\\`${R}\n\n${D} ER diagram:${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} erDiagram${R}\n${Y} USER ||--o{ POST : writes${R}\n${Y} POST ||--o{ COMMENT : has${R}\n${Y} USER ||--o{ COMMENT : writes${R}\n${Y} \\`\\`\\`${R}\n\n${D} Class diagram:${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} classDiagram${R}\n${Y} class Animal {${R}\n${Y} +String name${R}\n${Y} +eat() void${R}\n${Y} }${R}\n${Y} Animal <|-- Dog${R}\n${Y} Animal <|-- Cat${R}\n${Y} \\`\\`\\`${R}\n\n${D} Also: gantt, pie, stateDiagram, flowchart, gitGraph, mindmap${R}\n\n${C}${B} ━━━ MATH BLOCK (LaTeX) ━━━${R}\n${D} Use $$ on its own line to open and close. KaTeX syntax.${R}\n\n${Y} $$${R}\n${Y} E = mc^2${R}\n${Y} $$${R}\n\n${Y} $$${R}\n${Y} \\\\frac{-b \\\\pm \\\\sqrt{b^2 - 4ac}}{2a}${R}\n${Y} $$${R}\n\n${Y} $$${R}\n${Y} \\\\sum_{i=1}^{n} i = \\\\frac{n(n+1)}{2}${R}\n${Y} $$${R}\n\n${Y} $$${R}\n${Y} \\\\int_0^\\\\infty e^{-x^2} dx = \\\\frac{\\\\sqrt{\\\\pi}}{2}${R}\n${Y} $$${R}\n\n${D} Common LaTeX: \\\\frac{a}{b} \\\\sqrt{x} x^{2} x_{i}${R}\n${D} \\\\sum \\\\prod \\\\int \\\\lim \\\\infty \\\\alpha \\\\beta \\\\pi${R}\n${D} \\\\text{label} \\\\mathbb{R} \\\\vec{v} \\\\hat{x} \\\\bar{x}${R}\n${D} Matrices: \\\\begin{pmatrix} a & b \\\\\\\\ c & d \\\\end{pmatrix}${R}\n\n${C}${B} ━━━ CALLOUT BLOCKS ━━━${R}\n${D} 4 variants: info, warning, error, tip${R}\n\n${Y} > [!info]${R}\n${Y} > This is an informational note.${R}\n\n${Y} > [!warning]${R}\n${Y} > Be careful about this.${R}\n\n${Y} > [!error]${R}\n${Y} > Something went wrong.${R}\n\n${Y} > [!tip]${R}\n${Y} > Helpful suggestion here.${R}\n\n${D} Multi-line callout:${R}\n${Y} > [!info]${R}\n${Y} > Line one of the callout.${R}\n${Y} > Line two continues here.${R}\n${Y} > Each line needs the > prefix.${R}\n\n${C}${B} ━━━ QUERY BLOCK (live search) ━━━${R}\n\n${Y} > [!query]${R}\n${Y} > type:todo status:open${R}\n\n${Y} > [!query]${R}\n${Y} > #work type:todo${R}\n\n${D} Queries: keyword, #tag, type:todo/code/heading, status:open/done${R}\n\n${C}${B} ━━━ INLINE LINK ━━━${R}\n\n${Y} [Link Text](https://example.com)${R}\n${D} Opens in new tab. Works in paragraphs, lists, todos, callouts.${R}\n\n${C}${B} ━━━ EMBED (link preview) ━━━${R}\n\n${Y} > [!embed]${R}\n${Y} > https://www.youtube.com/watch?v=VIDEO_ID${R}\n\n${Y} > [!embed]${R}\n${Y} > https://github.com/user/repo${R}\n${D} YouTube → embedded video player${R}\n${D} Other URLs → preview card with title, description, image${R}\n\n${C}${B} ━━━ IMAGE ━━━${R}\n\n${Y} ${R}\n\n${C}${B} ━━━ FILE ATTACHMENT ━━━${R}\n\n${Y} > [!file]${R}\n${Y} > [document.pdf](https://example.com/file.pdf)${R}\n${Y} > application/pdf 149780${R}\n\n${D} Format: > [filename](url) then > mimetype size_in_bytes${R}\n\n${D} ──────────────────────────────────────────────────────────${R}\n\n${C}${B} COMMANDS${R}\n ${G}vertex new \"Title\"${R} ${D}← create empty note${R}\n ${G}vertex edit \"Title\"${R} ${D}← edit in $EDITOR${R}\n ${G}vertex import file.md${R} ${D}← import markdown as new note${R}\n ${G}vertex import file.md -t \"T\"${R} ${D}← import with custom title${R}\n ${G}vertex export \"Title\"${R} ${D}← print as markdown${R}\n ${G}vertex export \"Title\" -o out.md${R} ${D}← save to file${R}\n ${G}vertex view \"Title\"${R} ${D}← quick view (same as export)${R}\n ${G}vertex syntax${R} ${D}← this reference${R}\n\n${C}${B} AI USAGE${R}\n${D} Any AI can create Vertex notes. Write a .md file using${R}\n${D} the syntax above, then:${R}\n\n ${G}vertex import note.md -t \"My Note\"${R}\n\n${D} Or edit an existing note directly:${R}\n\n ${G}vertex edit \"My Note\"${R}\n\n${D} The note will render with rich blocks (mermaid diagrams,${R}\n${D} LaTeX math, syntax-highlighted code, callouts, etc.)${R}\n${D} in the Vertex web app at ${P}https://vertex-alu.pages.dev${R}\n\n${C}${B} FULL EXAMPLE${R}\n${D} ──────────────────────────────────────────────────────────${R}\n${Y} # Project Notes${R}\n${Y} ${R}\n${Y} Overview of the #project with [[Related Note]] link.${R}\n${Y} ${R}\n${Y} ## Architecture${R}\n${Y} ${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} graph LR;${R}\n${Y} Client --> API --> DB;${R}\n${Y} \\`\\`\\`${R}\n${Y} ${R}\n${Y} ## Key Formula${R}\n${Y} ${R}\n${Y} $$${R}\n${Y} O(n \\\\log n)${R}\n${Y} $$${R}\n${Y} ${R}\n${Y} ## Code${R}\n${Y} ${R}\n${Y} \\`\\`\\`python${R}\n${Y} print(\"hello\")${R}\n${Y} \\`\\`\\`${R}\n${Y} ${R}\n${Y} > [!tip]${R}\n${Y} > Remember to test edge cases.${R}\n${Y} ${R}\n${Y} ## Tasks${R}\n${Y} ${R}\n${Y} - [x] Design complete${R}\n${Y} - [ ] Implementation pending #work${R}\n${D} ──────────────────────────────────────────────────────────${R}\n`);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/syntax.ts"],"sourcesContent":["import { Command } from \"@oclif/core\";\n\nconst D = \"\\x1b[90m\";\nconst B = \"\\x1b[1m\";\nconst C = \"\\x1b[36m\";\nconst Y = \"\\x1b[33m\";\nconst G = \"\\x1b[32m\";\nconst P = \"\\x1b[35m\";\nconst R = \"\\x1b[0m\";\n\nexport default class Syntax extends Command {\n static override description = \"Show all Vertex markdown syntax for writing notes\";\n\n async run(): Promise<void> {\n this.log(`\n${B}${P} Vertex Markdown Syntax — Complete Reference${R}\n${D} For AI agents and humans writing Vertex notes from the terminal.${R}\n${D} ──────────────────────────────────────────────────────────${R}\n\n${C}${B} RULES${R}\n${D} • Each block must be separated by a blank line${R}\n${D} • First # Heading 1 in a note becomes the note title${R}\n${D} • Tags must start with a letter: #valid #123invalid${R}\n${D} • Wiki links are case-insensitive: [[My Note]] matches \"my note\"${R}\n${D} • Indent with spaces, not tabs${R}\n\n${C}${B} ━━━ TEXT & HEADINGS ━━━${R}\n\n${Y} # Heading 1${R} ${D}← note title${R}\n${Y} ## Heading 2${R} ${D}← section${R}\n${Y} ### Heading 3${R} ${D}← subsection${R}\n${Y} #### Heading 4${R} ${D}← minor heading${R}\n\n${Y} Plain paragraph text.${R} ${D}← just text on a line${R}\n${Y} **bold** *italic* \\`code\\` ~~strike~~${R}\n\n${C}${B} ━━━ LINKS & TAGS ━━━${R}\n\n${Y} [[Note Title]]${R} ${D}← wiki link (navigates to note)${R}\n${Y} #tagname${R} ${D}← tag (auto-created, purple pill)${R}\n${Y} #parent/child${R} ${D}← scoped tag (creates hierarchy)${R}\n${Y} #work/frontend${R} ${D}← example: parent=work, child=frontend${R}\n\n${C}${B} ━━━ LISTS ━━━${R}\n\n${Y} - Bullet item one${R}\n${Y} - Bullet item two${R}\n${Y} - Bullet item three${R}\n\n${Y} 1. Numbered item one${R}\n${Y} 2. Numbered item two${R}\n${Y} 3. Numbered item three${R}\n\n${Y} - [ ] Open todo task${R}\n${Y} - [x] Completed todo task${R}\n${Y} - [ ] Another open task #work${R} ${D}← tags work inside tasks${R}\n\n${C}${B} ━━━ BLOCKQUOTE ━━━${R}\n\n${Y} > Single line quote${R}\n\n${Y} > Multi-line quote${R}\n${Y} > continues with > prefix${R}\n${Y} > on each line${R}\n\n${C}${B} ━━━ DIVIDER ━━━${R}\n\n${Y} ---${R} ${D}← horizontal rule${R}\n\n${C}${B} ━━━ CODE BLOCK ━━━${R}\n\n${Y} \\`\\`\\`javascript${R}\n${Y} function greet(name) {${R}\n${Y} return \\`Hello, \\${name}!\\`;${R}\n${Y} }${R}\n${Y} \\`\\`\\`${R}\n\n${D} Languages: python, javascript, typescript, rust, go, java,${R}\n${D} c, cpp, csharp, ruby, php, swift, kotlin, sql, html, css,${R}\n${D} json, yaml, xml, markdown, bash, shell, dockerfile, graphql${R}\n\n${C}${B} ━━━ MERMAID DIAGRAM ━━━${R}\n${D} Use \\`\\`\\`mermaid to open, \\`\\`\\` to close. All Mermaid syntax works.${R}\n\n${D} Flowchart:${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} graph TD;${R}\n${Y} A[Start] --> B{Decision};${R}\n${Y} B -->|Yes| C[Do X];${R}\n${Y} B -->|No| D[Do Y];${R}\n${Y} C --> E[End];${R}\n${Y} D --> E;${R}\n${Y} \\`\\`\\`${R}\n\n${D} Sequence diagram:${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} sequenceDiagram${R}\n${Y} Client->>Server: Request${R}\n${Y} Server->>DB: Query${R}\n${Y} DB-->>Server: Result${R}\n${Y} Server-->>Client: Response${R}\n${Y} \\`\\`\\`${R}\n\n${D} ER diagram:${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} erDiagram${R}\n${Y} USER ||--o{ POST : writes${R}\n${Y} POST ||--o{ COMMENT : has${R}\n${Y} USER ||--o{ COMMENT : writes${R}\n${Y} \\`\\`\\`${R}\n\n${D} Class diagram:${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} classDiagram${R}\n${Y} class Animal {${R}\n${Y} +String name${R}\n${Y} +eat() void${R}\n${Y} }${R}\n${Y} Animal <|-- Dog${R}\n${Y} Animal <|-- Cat${R}\n${Y} \\`\\`\\`${R}\n\n${D} Also: gantt, pie, stateDiagram, flowchart, gitGraph, mindmap${R}\n\n${C}${B} ━━━ MATH (LaTeX) ━━━${R}\n\n${C} Inline math (within text):${R}\n${Y} The formula $E = mc^2$ is famous.${R}\n${Y} Solve for $x$ where $ax^2 + bx + c = 0$.${R}\n\n${C} Block math (standalone):${R}\n${D} Use $$ on its own line to open and close. KaTeX syntax.${R}\n\n${Y} $$${R}\n${Y} E = mc^2${R}\n${Y} $$${R}\n\n${Y} $$${R}\n${Y} \\\\frac{-b \\\\pm \\\\sqrt{b^2 - 4ac}}{2a}${R}\n${Y} $$${R}\n\n${Y} $$${R}\n${Y} \\\\sum_{i=1}^{n} i = \\\\frac{n(n+1)}{2}${R}\n${Y} $$${R}\n\n${Y} $$${R}\n${Y} \\\\int_0^\\\\infty e^{-x^2} dx = \\\\frac{\\\\sqrt{\\\\pi}}{2}${R}\n${Y} $$${R}\n\n${D} Common LaTeX: \\\\frac{a}{b} \\\\sqrt{x} x^{2} x_{i}${R}\n${D} \\\\sum \\\\prod \\\\int \\\\lim \\\\infty \\\\alpha \\\\beta \\\\pi${R}\n${D} \\\\text{label} \\\\mathbb{R} \\\\vec{v} \\\\hat{x} \\\\bar{x}${R}\n${D} Matrices: \\\\begin{pmatrix} a & b \\\\\\\\ c & d \\\\end{pmatrix}${R}\n\n${C}${B} ━━━ CALLOUT BLOCKS ━━━${R}\n${D} 4 variants: info, warning, error, tip${R}\n\n${Y} > [!info]${R}\n${Y} > This is an informational note.${R}\n\n${Y} > [!warning]${R}\n${Y} > Be careful about this.${R}\n\n${Y} > [!error]${R}\n${Y} > Something went wrong.${R}\n\n${Y} > [!tip]${R}\n${Y} > Helpful suggestion here.${R}\n\n${D} Multi-line callout:${R}\n${Y} > [!info]${R}\n${Y} > Line one of the callout.${R}\n${Y} > Line two continues here.${R}\n${Y} > Each line needs the > prefix.${R}\n\n${C}${B} ━━━ QUERY BLOCK (live search) ━━━${R}\n\n${Y} > [!query]${R}\n${Y} > type:todo status:open${R}\n\n${Y} > [!query]${R}\n${Y} > #work type:todo${R}\n\n${D} Queries: keyword, #tag, type:todo/code/heading, status:open/done${R}\n\n${C}${B} ━━━ INLINE LINK ━━━${R}\n\n${Y} [Link Text](https://example.com)${R}\n${D} Opens in new tab. Works in paragraphs, lists, todos, callouts.${R}\n\n${C}${B} ━━━ EMBED (link preview) ━━━${R}\n\n${Y} > [!embed]${R}\n${Y} > https://www.youtube.com/watch?v=VIDEO_ID${R}\n\n${Y} > [!embed]${R}\n${Y} > https://github.com/user/repo${R}\n${D} YouTube → embedded video player${R}\n${D} Other URLs → preview card with title, description, image${R}\n\n${C}${B} ━━━ IMAGE ━━━${R}\n\n${Y} ${R}\n\n${C}${B} ━━━ FILE ATTACHMENT ━━━${R}\n\n${Y} > [!file]${R}\n${Y} > [document.pdf](https://example.com/file.pdf)${R}\n${Y} > application/pdf 149780${R}\n\n${D} Format: > [filename](url) then > mimetype size_in_bytes${R}\n\n${D} ──────────────────────────────────────────────────────────${R}\n\n${C}${B} COMMANDS${R}\n ${G}vertex new \"Title\"${R} ${D}← create empty note${R}\n ${G}vertex edit \"Title\"${R} ${D}← edit in $EDITOR${R}\n ${G}vertex import file.md${R} ${D}← import markdown as new note${R}\n ${G}vertex import file.md -t \"T\"${R} ${D}← import with custom title${R}\n ${G}vertex export \"Title\"${R} ${D}← print as markdown${R}\n ${G}vertex export \"Title\" -o out.md${R} ${D}← save to file${R}\n ${G}vertex view \"Title\"${R} ${D}← quick view (same as export)${R}\n ${G}vertex syntax${R} ${D}← this reference${R}\n\n${C}${B} AI USAGE${R}\n${D} Any AI can create Vertex notes. Write a .md file using${R}\n${D} the syntax above, then:${R}\n\n ${G}vertex import note.md -t \"My Note\"${R}\n\n${D} Or edit an existing note directly:${R}\n\n ${G}vertex edit \"My Note\"${R}\n\n${D} The note will render with rich blocks (mermaid diagrams,${R}\n${D} LaTeX math, syntax-highlighted code, callouts, etc.)${R}\n${D} in the Vertex web app at ${P}https://vertex-alu.pages.dev${R}\n\n${C}${B} FULL EXAMPLE${R}\n${D} ──────────────────────────────────────────────────────────${R}\n${Y} # Project Notes${R}\n${Y} ${R}\n${Y} Overview of the #project with [[Related Note]] link.${R}\n${Y} ${R}\n${Y} ## Architecture${R}\n${Y} ${R}\n${Y} \\`\\`\\`mermaid${R}\n${Y} graph LR;${R}\n${Y} Client --> API --> DB;${R}\n${Y} \\`\\`\\`${R}\n${Y} ${R}\n${Y} ## Key Formula${R}\n${Y} ${R}\n${Y} $$${R}\n${Y} O(n \\\\log n)${R}\n${Y} $$${R}\n${Y} ${R}\n${Y} ## Code${R}\n${Y} ${R}\n${Y} \\`\\`\\`python${R}\n${Y} print(\"hello\")${R}\n${Y} \\`\\`\\`${R}\n${Y} ${R}\n${Y} > [!tip]${R}\n${Y} > Remember to test edge cases.${R}\n${Y} ${R}\n${Y} ## Tasks${R}\n${Y} ${R}\n${Y} - [x] Design complete${R}\n${Y} - [ ] Implementation pending #work${R}\n${D} ──────────────────────────────────────────────────────────${R}\n`);\n }\n}\n"],"mappings":";AAAA,SAAS,eAAe;AAExB,IAAM,IAAI;AACV,IAAM,IAAI;AACV,IAAM,IAAI;AACV,IAAM,IAAI;AACV,IAAM,IAAI;AACV,IAAM,IAAI;AACV,IAAM,IAAI;AAEV,IAAqB,SAArB,cAAoC,QAAQ;AAAA,EAC1C,OAAgB,cAAc;AAAA,EAE9B,MAAM,MAAqB;AACzB,SAAK,IAAI;AAAA,EACX,CAAC,GAAG,CAAC,qDAAgD,CAAC;AAAA,EACtD,CAAC,qEAAqE,CAAC;AAAA,EACvE,CAAC,iWAA+D,CAAC;AAAA;AAAA,EAEjE,CAAC,GAAG,CAAC,UAAU,CAAC;AAAA,EAChB,CAAC,wDAAmD,CAAC;AAAA,EACrD,CAAC,8DAAyD,CAAC;AAAA,EAC3D,CAAC,8DAAyD,CAAC;AAAA,EAC3D,CAAC,0EAAqE,CAAC;AAAA,EACvE,CAAC,wCAAmC,CAAC;AAAA;AAAA,EAErC,CAAC,GAAG,CAAC,0DAA4B,CAAC;AAAA;AAAA,EAElC,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,oBAAe,CAAC;AAAA,EAC5D,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,iBAAY,CAAC;AAAA,EACzD,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,oBAAe,CAAC;AAAA,EAC5D,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,uBAAkB,CAAC;AAAA;AAAA,EAE/D,CAAC,0BAA0B,CAAC,eAAe,CAAC,6BAAwB,CAAC;AAAA,EACrE,CAAC,0CAA0C,CAAC;AAAA;AAAA,EAE5C,CAAC,GAAG,CAAC,uDAAyB,CAAC;AAAA;AAAA,EAE/B,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,uCAAkC,CAAC;AAAA,EAC/E,CAAC,aAAa,CAAC,4BAA4B,CAAC,yCAAoC,CAAC;AAAA,EACjF,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,wCAAmC,CAAC;AAAA,EAChF,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,8CAAyC,CAAC;AAAA;AAAA,EAEtF,CAAC,GAAG,CAAC,gDAAkB,CAAC;AAAA;AAAA,EAExB,CAAC,sBAAsB,CAAC;AAAA,EACxB,CAAC,sBAAsB,CAAC;AAAA,EACxB,CAAC,wBAAwB,CAAC;AAAA;AAAA,EAE1B,CAAC,yBAAyB,CAAC;AAAA,EAC3B,CAAC,yBAAyB,CAAC;AAAA,EAC3B,CAAC,2BAA2B,CAAC;AAAA;AAAA,EAE7B,CAAC,yBAAyB,CAAC;AAAA,EAC3B,CAAC,8BAA8B,CAAC;AAAA,EAChC,CAAC,kCAAkC,CAAC,OAAO,CAAC,gCAA2B,CAAC;AAAA;AAAA,EAExE,CAAC,GAAG,CAAC,qDAAuB,CAAC;AAAA;AAAA,EAE7B,CAAC,wBAAwB,CAAC;AAAA;AAAA,EAE1B,CAAC,uBAAuB,CAAC;AAAA,EACzB,CAAC,8BAA8B,CAAC;AAAA,EAChC,CAAC,mBAAmB,CAAC;AAAA;AAAA,EAErB,CAAC,GAAG,CAAC,kDAAoB,CAAC;AAAA;AAAA,EAE1B,CAAC,QAAQ,CAAC,iCAAiC,CAAC,yBAAoB,CAAC;AAAA;AAAA,EAEjE,CAAC,GAAG,CAAC,qDAAuB,CAAC;AAAA;AAAA,EAE7B,CAAC,qBAAqB,CAAC;AAAA,EACvB,CAAC,2BAA2B,CAAC;AAAA,EAC7B,CAAC,mCAAmC,CAAC;AAAA,EACrC,CAAC,MAAM,CAAC;AAAA,EACR,CAAC,WAAW,CAAC;AAAA;AAAA,EAEb,CAAC,+DAA+D,CAAC;AAAA,EACjE,CAAC,8DAA8D,CAAC;AAAA,EAChE,CAAC,gEAAgE,CAAC;AAAA;AAAA,EAElE,CAAC,GAAG,CAAC,0DAA4B,CAAC;AAAA,EAClC,CAAC,0EAA0E,CAAC;AAAA;AAAA,EAE5E,CAAC,eAAe,CAAC;AAAA,EACjB,CAAC,kBAAkB,CAAC;AAAA,EACpB,CAAC,cAAc,CAAC;AAAA,EAChB,CAAC,kCAAkC,CAAC;AAAA,EACpC,CAAC,4BAA4B,CAAC;AAAA,EAC9B,CAAC,2BAA2B,CAAC;AAAA,EAC7B,CAAC,sBAAsB,CAAC;AAAA,EACxB,CAAC,iBAAiB,CAAC;AAAA,EACnB,CAAC,WAAW,CAAC;AAAA;AAAA,EAEb,CAAC,sBAAsB,CAAC;AAAA,EACxB,CAAC,kBAAkB,CAAC;AAAA,EACpB,CAAC,oBAAoB,CAAC;AAAA,EACtB,CAAC,iCAAiC,CAAC;AAAA,EACnC,CAAC,2BAA2B,CAAC;AAAA,EAC7B,CAAC,6BAA6B,CAAC;AAAA,EAC/B,CAAC,mCAAmC,CAAC;AAAA,EACrC,CAAC,WAAW,CAAC;AAAA;AAAA,EAEb,CAAC,gBAAgB,CAAC;AAAA,EAClB,CAAC,kBAAkB,CAAC;AAAA,EACpB,CAAC,cAAc,CAAC;AAAA,EAChB,CAAC,kCAAkC,CAAC;AAAA,EACpC,CAAC,kCAAkC,CAAC;AAAA,EACpC,CAAC,qCAAqC,CAAC;AAAA,EACvC,CAAC,WAAW,CAAC;AAAA;AAAA,EAEb,CAAC,mBAAmB,CAAC;AAAA,EACrB,CAAC,kBAAkB,CAAC;AAAA,EACpB,CAAC,iBAAiB,CAAC;AAAA,EACnB,CAAC,uBAAuB,CAAC;AAAA,EACzB,CAAC,yBAAyB,CAAC;AAAA,EAC3B,CAAC,wBAAwB,CAAC;AAAA,EAC1B,CAAC,UAAU,CAAC;AAAA,EACZ,CAAC,wBAAwB,CAAC;AAAA,EAC1B,CAAC,wBAAwB,CAAC;AAAA,EAC1B,CAAC,WAAW,CAAC;AAAA;AAAA,EAEb,CAAC,iEAAiE,CAAC;AAAA;AAAA,EAEnE,CAAC,GAAG,CAAC,uDAAyB,CAAC;AAAA;AAAA,EAE/B,CAAC,+BAA+B,CAAC;AAAA,EACjC,CAAC,sCAAsC,CAAC;AAAA,EACxC,CAAC,6CAA6C,CAAC;AAAA;AAAA,EAE/C,CAAC,6BAA6B,CAAC;AAAA,EAC/B,CAAC,4DAA4D,CAAC;AAAA;AAAA,EAE9D,CAAC,OAAO,CAAC;AAAA,EACT,CAAC,aAAa,CAAC;AAAA,EACf,CAAC,OAAO,CAAC;AAAA;AAAA,EAET,CAAC,OAAO,CAAC;AAAA,EACT,CAAC,0CAA0C,CAAC;AAAA,EAC5C,CAAC,OAAO,CAAC;AAAA;AAAA,EAET,CAAC,OAAO,CAAC;AAAA,EACT,CAAC,0CAA0C,CAAC;AAAA,EAC5C,CAAC,OAAO,CAAC;AAAA;AAAA,EAET,CAAC,OAAO,CAAC;AAAA,EACT,CAAC,0DAA0D,CAAC;AAAA,EAC5D,CAAC,OAAO,CAAC;AAAA;AAAA,EAET,CAAC,wDAAwD,CAAC;AAAA,EAC1D,CAAC,gEAAgE,CAAC;AAAA,EAClE,CAAC,6DAA6D,CAAC;AAAA,EAC/D,CAAC,+DAA+D,CAAC;AAAA;AAAA,EAEjE,CAAC,GAAG,CAAC,yDAA2B,CAAC;AAAA,EACjC,CAAC,0CAA0C,CAAC;AAAA;AAAA,EAE5C,CAAC,cAAc,CAAC;AAAA,EAChB,CAAC,qCAAqC,CAAC;AAAA;AAAA,EAEvC,CAAC,iBAAiB,CAAC;AAAA,EACnB,CAAC,6BAA6B,CAAC;AAAA;AAAA,EAE/B,CAAC,eAAe,CAAC;AAAA,EACjB,CAAC,4BAA4B,CAAC;AAAA;AAAA,EAE9B,CAAC,aAAa,CAAC;AAAA,EACf,CAAC,+BAA+B,CAAC;AAAA;AAAA,EAEjC,CAAC,wBAAwB,CAAC;AAAA,EAC1B,CAAC,cAAc,CAAC;AAAA,EAChB,CAAC,+BAA+B,CAAC;AAAA,EACjC,CAAC,+BAA+B,CAAC;AAAA,EACjC,CAAC,oCAAoC,CAAC;AAAA;AAAA,EAEtC,CAAC,GAAG,CAAC,oEAAsC,CAAC;AAAA;AAAA,EAE5C,CAAC,eAAe,CAAC;AAAA,EACjB,CAAC,4BAA4B,CAAC;AAAA;AAAA,EAE9B,CAAC,eAAe,CAAC;AAAA,EACjB,CAAC,sBAAsB,CAAC;AAAA;AAAA,EAExB,CAAC,qEAAqE,CAAC;AAAA;AAAA,EAEvE,CAAC,GAAG,CAAC,sDAAwB,CAAC;AAAA;AAAA,EAE9B,CAAC,qCAAqC,CAAC;AAAA,EACvC,CAAC,mEAAmE,CAAC;AAAA;AAAA,EAErE,CAAC,GAAG,CAAC,+DAAiC,CAAC;AAAA;AAAA,EAEvC,CAAC,eAAe,CAAC;AAAA,EACjB,CAAC,+CAA+C,CAAC;AAAA;AAAA,EAEjD,CAAC,eAAe,CAAC;AAAA,EACjB,CAAC,mCAAmC,CAAC;AAAA,EACrC,CAAC,yCAAoC,CAAC;AAAA,EACtC,CAAC,kEAA6D,CAAC;AAAA;AAAA,EAE/D,CAAC,GAAG,CAAC,gDAAkB,CAAC;AAAA;AAAA,EAExB,CAAC,+CAA+C,CAAC;AAAA;AAAA,EAEjD,CAAC,GAAG,CAAC,0DAA4B,CAAC;AAAA;AAAA,EAElC,CAAC,cAAc,CAAC;AAAA,EAChB,CAAC,mDAAmD,CAAC;AAAA,EACrD,CAAC,6BAA6B,CAAC;AAAA;AAAA,EAE/B,CAAC,8DAA8D,CAAC;AAAA;AAAA,EAEhE,CAAC,iWAA+D,CAAC;AAAA;AAAA,EAEjE,CAAC,GAAG,CAAC,aAAa,CAAC;AAAA,IACjB,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,2BAAsB,CAAC;AAAA,IACjE,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,yBAAoB,CAAC;AAAA,IAC/D,CAAC,wBAAwB,CAAC,eAAe,CAAC,qCAAgC,CAAC;AAAA,IAC3E,CAAC,+BAA+B,CAAC,QAAQ,CAAC,kCAA6B,CAAC;AAAA,IACxE,CAAC,wBAAwB,CAAC,eAAe,CAAC,2BAAsB,CAAC;AAAA,IACjE,CAAC,kCAAkC,CAAC,KAAK,CAAC,sBAAiB,CAAC;AAAA,IAC5D,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,qCAAgC,CAAC;AAAA,IAC3E,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,wBAAmB,CAAC;AAAA;AAAA,EAEhE,CAAC,GAAG,CAAC,aAAa,CAAC;AAAA,EACnB,CAAC,2DAA2D,CAAC;AAAA,EAC7D,CAAC,4BAA4B,CAAC;AAAA;AAAA,IAE5B,CAAC,qCAAqC,CAAC;AAAA;AAAA,EAEzC,CAAC,uCAAuC,CAAC;AAAA;AAAA,IAEvC,CAAC,wBAAwB,CAAC;AAAA;AAAA,EAE5B,CAAC,6DAA6D,CAAC;AAAA,EAC/D,CAAC,yDAAyD,CAAC;AAAA,EAC3D,CAAC,8BAA8B,CAAC,+BAA+B,CAAC;AAAA;AAAA,EAEhE,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAAA,EACvB,CAAC,iWAA+D,CAAC;AAAA,EACjE,CAAC,oBAAoB,CAAC;AAAA,EACtB,CAAC,KAAK,CAAC;AAAA,EACP,CAAC,yDAAyD,CAAC;AAAA,EAC3D,CAAC,KAAK,CAAC;AAAA,EACP,CAAC,oBAAoB,CAAC;AAAA,EACtB,CAAC,KAAK,CAAC;AAAA,EACP,CAAC,kBAAkB,CAAC;AAAA,EACpB,CAAC,cAAc,CAAC;AAAA,EAChB,CAAC,+BAA+B,CAAC;AAAA,EACjC,CAAC,WAAW,CAAC;AAAA,EACb,CAAC,KAAK,CAAC;AAAA,EACP,CAAC,mBAAmB,CAAC;AAAA,EACrB,CAAC,KAAK,CAAC;AAAA,EACP,CAAC,OAAO,CAAC;AAAA,EACT,CAAC,iBAAiB,CAAC;AAAA,EACnB,CAAC,OAAO,CAAC;AAAA,EACT,CAAC,KAAK,CAAC;AAAA,EACP,CAAC,YAAY,CAAC;AAAA,EACd,CAAC,KAAK,CAAC;AAAA,EACP,CAAC,iBAAiB,CAAC;AAAA,EACnB,CAAC,mBAAmB,CAAC;AAAA,EACrB,CAAC,WAAW,CAAC;AAAA,EACb,CAAC,KAAK,CAAC;AAAA,EACP,CAAC,aAAa,CAAC;AAAA,EACf,CAAC,mCAAmC,CAAC;AAAA,EACrC,CAAC,KAAK,CAAC;AAAA,EACP,CAAC,aAAa,CAAC;AAAA,EACf,CAAC,KAAK,CAAC;AAAA,EACP,CAAC,0BAA0B,CAAC;AAAA,EAC5B,CAAC,uCAAuC,CAAC;AAAA,EACzC,CAAC,iWAA+D,CAAC;AAAA,CAClE;AAAA,EACC;AACF;","names":[]}
|
package/dist/commands/tags.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
getUserTags
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
9
9
|
|
|
10
10
|
// src/commands/tags.ts
|
|
11
11
|
import { Command } from "@oclif/core";
|
package/dist/commands/today.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
listNotes
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
9
9
|
|
|
10
10
|
// src/commands/today.ts
|
|
11
11
|
import { Command } from "@oclif/core";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../../chunk-
|
|
4
|
+
} from "../../chunk-URRSVCB7.js";
|
|
5
5
|
import "../../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
emptyTrash
|
|
8
|
-
} from "../../chunk-
|
|
8
|
+
} from "../../chunk-EEEL6ZKK.js";
|
|
9
9
|
|
|
10
10
|
// src/commands/trash/empty.ts
|
|
11
11
|
import { Command } from "@oclif/core";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../../chunk-
|
|
4
|
+
} from "../../chunk-URRSVCB7.js";
|
|
5
5
|
import "../../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
listNotes
|
|
8
|
-
} from "../../chunk-
|
|
8
|
+
} from "../../chunk-EEEL6ZKK.js";
|
|
9
9
|
|
|
10
10
|
// src/commands/trash/index.ts
|
|
11
11
|
import { Command } from "@oclif/core";
|
package/dist/commands/view.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getClient,
|
|
3
3
|
getUserId
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-URRSVCB7.js";
|
|
5
5
|
import "../chunk-PBF5EE4Y.js";
|
|
6
6
|
import {
|
|
7
7
|
exportNoteAsMarkdown,
|
|
8
8
|
listNotes
|
|
9
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-EEEL6ZKK.js";
|
|
10
10
|
|
|
11
11
|
// src/commands/view.ts
|
|
12
12
|
import { Command, Args } from "@oclif/core";
|
package/dist/lib/client.js
CHANGED
package/dist/lib/md-to-tiptap.js
CHANGED
|
@@ -212,7 +212,7 @@ function markdownToTiptap(md) {
|
|
|
212
212
|
function parseInline(text) {
|
|
213
213
|
if (!text) return [];
|
|
214
214
|
const nodes = [];
|
|
215
|
-
const regex = /(\*\*(
|
|
215
|
+
const regex = /(\*\*([^*]+)\*\*|\*([^*]+)\*|`([^`]+)`|~~([^~]+)~~|\[\[([^\]]+)\]\]|#([a-zA-Z][a-zA-Z0-9_/-]*)|\[([^\]]+)\]\(([^)]+)\)|(?<!\$)\$([^\$\n]+)\$(?!\$))/g;
|
|
216
216
|
let lastIndex = 0;
|
|
217
217
|
let match;
|
|
218
218
|
while ((match = regex.exec(text)) !== null) {
|
|
@@ -233,6 +233,8 @@ function parseInline(text) {
|
|
|
233
233
|
nodes.push({ type: "text", text: `#${match[7]}` });
|
|
234
234
|
} else if (match[8] && match[9]) {
|
|
235
235
|
nodes.push({ type: "text", text: match[8], marks: [{ type: "link", attrs: { href: match[9], target: "_blank" } }] });
|
|
236
|
+
} else if (match[10]) {
|
|
237
|
+
nodes.push({ type: "inlineMath", attrs: { formula: match[10] } });
|
|
236
238
|
}
|
|
237
239
|
lastIndex = match.index + match[0].length;
|
|
238
240
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/md-to-tiptap.ts"],"sourcesContent":["interface TiptapNode {\n type: string;\n attrs?: Record<string, unknown>;\n content?: TiptapNode[];\n text?: string;\n marks?: Array<{ type: string; attrs?: Record<string, unknown> }>;\n}\n\nexport function markdownToTiptap(md: string): Record<string, unknown> {\n const lines = md.split(\"\\n\");\n const nodes: TiptapNode[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n if (line.match(/^#{1,4}\\s/)) {\n const match = line.match(/^(#{1,4})\\s(.*)$/);\n if (match) {\n nodes.push({\n type: \"heading\",\n attrs: { level: match[1].length },\n content: parseInline(match[2]),\n });\n }\n i++;\n continue;\n }\n\n if (line.match(/^```mermaid\\s*$/)) {\n const mermaidLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].match(/^```\\s*$/)) {\n mermaidLines.push(lines[i]);\n i++;\n }\n i++;\n nodes.push({\n type: \"mermaidBlock\",\n content: [{ type: \"text\", text: mermaidLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (line.match(/^```/)) {\n const langMatch = line.match(/^```(\\w*)$/);\n const language = langMatch?.[1] || \"plaintext\";\n const codeLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].match(/^```\\s*$/)) {\n codeLines.push(lines[i]);\n i++;\n }\n i++;\n nodes.push({\n type: \"codeBlock\",\n attrs: { language },\n content: [{ type: \"text\", text: codeLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (line.match(/^\\$\\$\\s*$/)) {\n const mathLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].match(/^\\$\\$\\s*$/)) {\n mathLines.push(lines[i]);\n i++;\n }\n i++;\n nodes.push({\n type: \"mathBlock\",\n content: [{ type: \"text\", text: mathLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (line.match(/^>\\s*\\[!(\\w+)\\]\\s*$/)) {\n const variantMatch = line.match(/^>\\s*\\[!(\\w+)\\]\\s*$/);\n const variant = variantMatch?.[1] ?? \"info\";\n\n if (variant === \"query\") {\n const queryLines: string[] = [];\n i++;\n while (i < lines.length && lines[i].match(/^>\\s/)) {\n queryLines.push(lines[i].replace(/^>\\s?/, \"\"));\n i++;\n }\n nodes.push({\n type: \"queryBlock\",\n content: [{ type: \"text\", text: queryLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (variant === \"embed\") {\n i++;\n const embedUrl = lines[i]?.replace(/^>\\s?/, \"\").trim() ?? \"\";\n i++;\n nodes.push({\n type: \"linkPreview\",\n attrs: { url: embedUrl },\n });\n continue;\n }\n\n if (variant === \"file\") {\n i++;\n const linkLine = lines[i]?.replace(/^>\\s?/, \"\") ?? \"\";\n const linkMatch = linkLine.match(/^\\[(.+?)\\]\\((.+?)\\)$/);\n i++;\n const metaLine = lines[i]?.replace(/^>\\s?/, \"\") ?? \"\";\n const metaParts = metaLine.split(\" \");\n i++;\n nodes.push({\n type: \"fileBlock\",\n attrs: {\n filename: linkMatch?.[1] ?? \"file\",\n src: linkMatch?.[2] ?? \"\",\n filetype: metaParts[0] ?? \"\",\n filesize: parseInt(metaParts[1] ?? \"0\", 10) || 0,\n },\n });\n continue;\n }\n\n const calloutLines: string[] = [];\n i++;\n while (i < lines.length && lines[i].match(/^>\\s/)) {\n calloutLines.push(lines[i].replace(/^>\\s?/, \"\"));\n i++;\n }\n nodes.push({\n type: \"calloutBlock\",\n attrs: { variant },\n content: [{ type: \"paragraph\", content: parseInline(calloutLines.join(\"\\n\")) }],\n });\n continue;\n }\n\n if (line.match(/^>\\s/)) {\n const quoteLines: string[] = [];\n while (i < lines.length && lines[i].match(/^>\\s?/)) {\n quoteLines.push(lines[i].replace(/^>\\s?/, \"\"));\n i++;\n }\n nodes.push({\n type: \"blockquote\",\n content: [{ type: \"paragraph\", content: parseInline(quoteLines.join(\"\\n\")) }],\n });\n continue;\n }\n\n if (line.match(/^---\\s*$/)) {\n nodes.push({ type: \"horizontalRule\" });\n i++;\n continue;\n }\n\n if (line.match(/^!\\[.*?\\]\\(.*?\\)$/)) {\n const imgMatch = line.match(/^!\\[(.*?)\\]\\((.*?)\\)$/);\n if (imgMatch) {\n nodes.push({\n type: \"image\",\n attrs: { src: imgMatch[2], alt: imgMatch[1] },\n });\n }\n i++;\n continue;\n }\n\n if (line.match(/^[-*]\\s\\[[ x]\\]\\s/)) {\n const taskItems: TiptapNode[] = [];\n while (i < lines.length && lines[i].match(/^[-*]\\s\\[[ x]\\]\\s/)) {\n const m = lines[i].match(/^[-*]\\s\\[([ x])\\]\\s(.*)$/);\n if (m) {\n taskItems.push({\n type: \"taskItem\",\n attrs: { checked: m[1] === \"x\" },\n content: [{ type: \"paragraph\", content: parseInline(m[2]) }],\n });\n }\n i++;\n }\n nodes.push({ type: \"taskList\", content: taskItems });\n continue;\n }\n\n if (line.match(/^[-*]\\s/)) {\n const items: TiptapNode[] = [];\n while (i < lines.length && lines[i].match(/^[-*]\\s/)) {\n const text = lines[i].replace(/^[-*]\\s/, \"\");\n items.push({\n type: \"listItem\",\n content: [{ type: \"paragraph\", content: parseInline(text) }],\n });\n i++;\n }\n nodes.push({ type: \"bulletList\", content: items });\n continue;\n }\n\n if (line.match(/^\\d+\\.\\s/)) {\n const items: TiptapNode[] = [];\n while (i < lines.length && lines[i].match(/^\\d+\\.\\s/)) {\n const text = lines[i].replace(/^\\d+\\.\\s/, \"\");\n items.push({\n type: \"listItem\",\n content: [{ type: \"paragraph\", content: parseInline(text) }],\n });\n i++;\n }\n nodes.push({ type: \"orderedList\", content: items });\n continue;\n }\n\n if (line.trim() === \"\") {\n i++;\n continue;\n }\n\n const paraLines: string[] = [];\n while (\n i < lines.length &&\n lines[i].trim() !== \"\" &&\n !lines[i].match(/^#{1,4}\\s/) &&\n !lines[i].match(/^```/) &&\n !lines[i].match(/^\\$\\$/) &&\n !lines[i].match(/^---\\s*$/) &&\n !lines[i].match(/^[-*]\\s/) &&\n !lines[i].match(/^\\d+\\.\\s/) &&\n !lines[i].match(/^>\\s/) &&\n !lines[i].match(/^!\\[/)\n ) {\n paraLines.push(lines[i]);\n i++;\n }\n nodes.push({\n type: \"paragraph\",\n content: parseInline(paraLines.join(\"\\n\")),\n });\n }\n\n if (nodes.length === 0) {\n nodes.push({ type: \"paragraph\" });\n }\n\n return { type: \"doc\", content: nodes };\n}\n\nfunction parseInline(text: string): TiptapNode[] {\n if (!text) return [];\n\n const nodes: TiptapNode[] = [];\n const regex = /(\\*\\*(.+?)\\*\\*|\\*(.+?)\\*|`(.+?)`|~~(.+?)~~|\\[\\[(.+?)\\]\\]|#([a-zA-Z][a-zA-Z0-9_/-]*)|\\[([^\\]]+?)\\]\\(([^)]+?)\\))/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n if (match.index > lastIndex) {\n nodes.push({ type: \"text\", text: text.slice(lastIndex, match.index) });\n }\n\n if (match[2]) {\n nodes.push({ type: \"text\", text: match[2], marks: [{ type: \"bold\" }] });\n } else if (match[3]) {\n nodes.push({ type: \"text\", text: match[3], marks: [{ type: \"italic\" }] });\n } else if (match[4]) {\n nodes.push({ type: \"text\", text: match[4], marks: [{ type: \"code\" }] });\n } else if (match[5]) {\n nodes.push({ type: \"text\", text: match[5], marks: [{ type: \"strike\" }] });\n } else if (match[6]) {\n nodes.push({ type: \"text\", text: `[[${match[6]}]]` });\n } else if (match[7]) {\n nodes.push({ type: \"text\", text: `#${match[7]}` });\n } else if (match[8] && match[9]) {\n nodes.push({ type: \"text\", text: match[8], marks: [{ type: \"link\", attrs: { href: match[9], target: \"_blank\" } }] });\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < text.length) {\n nodes.push({ type: \"text\", text: text.slice(lastIndex) });\n }\n\n return nodes.length > 0 ? nodes : [{ type: \"text\", text: text || \" \" }];\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/md-to-tiptap.ts"],"sourcesContent":["interface TiptapNode {\n type: string;\n attrs?: Record<string, unknown>;\n content?: TiptapNode[];\n text?: string;\n marks?: Array<{ type: string; attrs?: Record<string, unknown> }>;\n}\n\nexport function markdownToTiptap(md: string): Record<string, unknown> {\n const lines = md.split(\"\\n\");\n const nodes: TiptapNode[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n if (line.match(/^#{1,4}\\s/)) {\n const match = line.match(/^(#{1,4})\\s(.*)$/);\n if (match) {\n nodes.push({\n type: \"heading\",\n attrs: { level: match[1].length },\n content: parseInline(match[2]),\n });\n }\n i++;\n continue;\n }\n\n if (line.match(/^```mermaid\\s*$/)) {\n const mermaidLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].match(/^```\\s*$/)) {\n mermaidLines.push(lines[i]);\n i++;\n }\n i++;\n nodes.push({\n type: \"mermaidBlock\",\n content: [{ type: \"text\", text: mermaidLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (line.match(/^```/)) {\n const langMatch = line.match(/^```(\\w*)$/);\n const language = langMatch?.[1] || \"plaintext\";\n const codeLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].match(/^```\\s*$/)) {\n codeLines.push(lines[i]);\n i++;\n }\n i++;\n nodes.push({\n type: \"codeBlock\",\n attrs: { language },\n content: [{ type: \"text\", text: codeLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (line.match(/^\\$\\$\\s*$/)) {\n const mathLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].match(/^\\$\\$\\s*$/)) {\n mathLines.push(lines[i]);\n i++;\n }\n i++;\n nodes.push({\n type: \"mathBlock\",\n content: [{ type: \"text\", text: mathLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (line.match(/^>\\s*\\[!(\\w+)\\]\\s*$/)) {\n const variantMatch = line.match(/^>\\s*\\[!(\\w+)\\]\\s*$/);\n const variant = variantMatch?.[1] ?? \"info\";\n\n if (variant === \"query\") {\n const queryLines: string[] = [];\n i++;\n while (i < lines.length && lines[i].match(/^>\\s/)) {\n queryLines.push(lines[i].replace(/^>\\s?/, \"\"));\n i++;\n }\n nodes.push({\n type: \"queryBlock\",\n content: [{ type: \"text\", text: queryLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (variant === \"embed\") {\n i++;\n const embedUrl = lines[i]?.replace(/^>\\s?/, \"\").trim() ?? \"\";\n i++;\n nodes.push({\n type: \"linkPreview\",\n attrs: { url: embedUrl },\n });\n continue;\n }\n\n if (variant === \"file\") {\n i++;\n const linkLine = lines[i]?.replace(/^>\\s?/, \"\") ?? \"\";\n const linkMatch = linkLine.match(/^\\[(.+?)\\]\\((.+?)\\)$/);\n i++;\n const metaLine = lines[i]?.replace(/^>\\s?/, \"\") ?? \"\";\n const metaParts = metaLine.split(\" \");\n i++;\n nodes.push({\n type: \"fileBlock\",\n attrs: {\n filename: linkMatch?.[1] ?? \"file\",\n src: linkMatch?.[2] ?? \"\",\n filetype: metaParts[0] ?? \"\",\n filesize: parseInt(metaParts[1] ?? \"0\", 10) || 0,\n },\n });\n continue;\n }\n\n const calloutLines: string[] = [];\n i++;\n while (i < lines.length && lines[i].match(/^>\\s/)) {\n calloutLines.push(lines[i].replace(/^>\\s?/, \"\"));\n i++;\n }\n nodes.push({\n type: \"calloutBlock\",\n attrs: { variant },\n content: [{ type: \"paragraph\", content: parseInline(calloutLines.join(\"\\n\")) }],\n });\n continue;\n }\n\n if (line.match(/^>\\s/)) {\n const quoteLines: string[] = [];\n while (i < lines.length && lines[i].match(/^>\\s?/)) {\n quoteLines.push(lines[i].replace(/^>\\s?/, \"\"));\n i++;\n }\n nodes.push({\n type: \"blockquote\",\n content: [{ type: \"paragraph\", content: parseInline(quoteLines.join(\"\\n\")) }],\n });\n continue;\n }\n\n if (line.match(/^---\\s*$/)) {\n nodes.push({ type: \"horizontalRule\" });\n i++;\n continue;\n }\n\n if (line.match(/^!\\[.*?\\]\\(.*?\\)$/)) {\n const imgMatch = line.match(/^!\\[(.*?)\\]\\((.*?)\\)$/);\n if (imgMatch) {\n nodes.push({\n type: \"image\",\n attrs: { src: imgMatch[2], alt: imgMatch[1] },\n });\n }\n i++;\n continue;\n }\n\n if (line.match(/^[-*]\\s\\[[ x]\\]\\s/)) {\n const taskItems: TiptapNode[] = [];\n while (i < lines.length && lines[i].match(/^[-*]\\s\\[[ x]\\]\\s/)) {\n const m = lines[i].match(/^[-*]\\s\\[([ x])\\]\\s(.*)$/);\n if (m) {\n taskItems.push({\n type: \"taskItem\",\n attrs: { checked: m[1] === \"x\" },\n content: [{ type: \"paragraph\", content: parseInline(m[2]) }],\n });\n }\n i++;\n }\n nodes.push({ type: \"taskList\", content: taskItems });\n continue;\n }\n\n if (line.match(/^[-*]\\s/)) {\n const items: TiptapNode[] = [];\n while (i < lines.length && lines[i].match(/^[-*]\\s/)) {\n const text = lines[i].replace(/^[-*]\\s/, \"\");\n items.push({\n type: \"listItem\",\n content: [{ type: \"paragraph\", content: parseInline(text) }],\n });\n i++;\n }\n nodes.push({ type: \"bulletList\", content: items });\n continue;\n }\n\n if (line.match(/^\\d+\\.\\s/)) {\n const items: TiptapNode[] = [];\n while (i < lines.length && lines[i].match(/^\\d+\\.\\s/)) {\n const text = lines[i].replace(/^\\d+\\.\\s/, \"\");\n items.push({\n type: \"listItem\",\n content: [{ type: \"paragraph\", content: parseInline(text) }],\n });\n i++;\n }\n nodes.push({ type: \"orderedList\", content: items });\n continue;\n }\n\n if (line.trim() === \"\") {\n i++;\n continue;\n }\n\n const paraLines: string[] = [];\n while (\n i < lines.length &&\n lines[i].trim() !== \"\" &&\n !lines[i].match(/^#{1,4}\\s/) &&\n !lines[i].match(/^```/) &&\n !lines[i].match(/^\\$\\$/) &&\n !lines[i].match(/^---\\s*$/) &&\n !lines[i].match(/^[-*]\\s/) &&\n !lines[i].match(/^\\d+\\.\\s/) &&\n !lines[i].match(/^>\\s/) &&\n !lines[i].match(/^!\\[/)\n ) {\n paraLines.push(lines[i]);\n i++;\n }\n nodes.push({\n type: \"paragraph\",\n content: parseInline(paraLines.join(\"\\n\")),\n });\n }\n\n if (nodes.length === 0) {\n nodes.push({ type: \"paragraph\" });\n }\n\n return { type: \"doc\", content: nodes };\n}\n\nfunction parseInline(text: string): TiptapNode[] {\n if (!text) return [];\n\n const nodes: TiptapNode[] = [];\n const regex = /(\\*\\*([^*]+)\\*\\*|\\*([^*]+)\\*|`([^`]+)`|~~([^~]+)~~|\\[\\[([^\\]]+)\\]\\]|#([a-zA-Z][a-zA-Z0-9_/-]*)|\\[([^\\]]+)\\]\\(([^)]+)\\)|(?<!\\$)\\$([^\\$\\n]+)\\$(?!\\$))/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n if (match.index > lastIndex) {\n nodes.push({ type: \"text\", text: text.slice(lastIndex, match.index) });\n }\n\n if (match[2]) {\n nodes.push({ type: \"text\", text: match[2], marks: [{ type: \"bold\" }] });\n } else if (match[3]) {\n nodes.push({ type: \"text\", text: match[3], marks: [{ type: \"italic\" }] });\n } else if (match[4]) {\n nodes.push({ type: \"text\", text: match[4], marks: [{ type: \"code\" }] });\n } else if (match[5]) {\n nodes.push({ type: \"text\", text: match[5], marks: [{ type: \"strike\" }] });\n } else if (match[6]) {\n nodes.push({ type: \"text\", text: `[[${match[6]}]]` });\n } else if (match[7]) {\n nodes.push({ type: \"text\", text: `#${match[7]}` });\n } else if (match[8] && match[9]) {\n nodes.push({ type: \"text\", text: match[8], marks: [{ type: \"link\", attrs: { href: match[9], target: \"_blank\" } }] });\n } else if (match[10]) {\n nodes.push({ type: \"inlineMath\", attrs: { formula: match[10] } });\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < text.length) {\n nodes.push({ type: \"text\", text: text.slice(lastIndex) });\n }\n\n return nodes.length > 0 ? nodes : [{ type: \"text\", text: text || \" \" }];\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/client.ts","../../core/src/auth.ts","../../core/src/storage.ts","../../core/src/notes.ts","../../core/src/tags.ts","../../core/src/links.ts","../../core/src/blocks.ts","../../core/src/snapshots.ts","../../core/src/search.ts","../../core/src/graph.ts","../../core/src/templates.ts","../../core/src/export.ts","../../core/src/md-to-tiptap.ts","../../core/src/index.ts"],"sourcesContent":["import { createClient, type SupabaseClient } from \"@supabase/supabase-js\";\n\nexport type { SupabaseClient };\n\nlet defaultClient: SupabaseClient | null = null;\n\nexport function createSupabaseClient(\n url: string,\n anonKey: string,\n): SupabaseClient {\n return createClient(url, anonKey, {\n auth: {\n autoRefreshToken: true,\n persistSession: true,\n },\n });\n}\n\nexport function initSupabaseClient(url: string, anonKey: string): void {\n defaultClient = createSupabaseClient(url, anonKey);\n}\n\nexport function getSupabaseClient(): SupabaseClient {\n if (!defaultClient) {\n throw new Error(\n \"Supabase client not initialized. Call initSupabaseClient() first.\",\n );\n }\n return defaultClient;\n}\n","import type { SupabaseClient, User, Session } from \"@supabase/supabase-js\";\nimport type { Profile } from \"./types\";\n\nexport type { User, Session };\n\nexport type OAuthProvider = \"google\" | \"github\";\n\nexport async function signInWithOAuth(\n client: SupabaseClient,\n provider: OAuthProvider,\n redirectTo?: string,\n) {\n return client.auth.signInWithOAuth({\n provider,\n options: { redirectTo },\n });\n}\n\nexport async function signInWithEmail(\n client: SupabaseClient,\n email: string,\n password: string,\n) {\n return client.auth.signInWithPassword({ email, password });\n}\n\nexport async function signUpWithEmail(\n client: SupabaseClient,\n email: string,\n password: string,\n) {\n return client.auth.signUp({ email, password });\n}\n\nexport async function signOut(client: SupabaseClient) {\n return client.auth.signOut();\n}\n\nexport async function getUser(client: SupabaseClient) {\n return client.auth.getUser();\n}\n\nexport async function getSession(client: SupabaseClient) {\n return client.auth.getSession();\n}\n\nexport async function getProfile(\n client: SupabaseClient,\n userId: string,\n): Promise<Profile | null> {\n const { data, error } = await client\n .from(\"profiles\")\n .select(\"*\")\n .eq(\"id\", userId)\n .maybeSingle();\n\n if (error) return null;\n return data as Profile;\n}\n\nexport function onAuthStateChange(\n client: SupabaseClient,\n callback: (event: string, session: unknown) => void,\n) {\n return client.auth.onAuthStateChange(callback);\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\n\nexport const DEFAULT_STORAGE_CAP = 50 * 1024 * 1024;\n\nexport async function getStorageInfo(\n client: SupabaseClient,\n userId: string,\n): Promise<{ used: number; cap: number }> {\n const { data, error } = await client\n .from(\"profiles\")\n .select(\"storage_used, storage_cap\")\n .eq(\"id\", userId)\n .maybeSingle();\n if (error || !data) return { used: 0, cap: DEFAULT_STORAGE_CAP };\n return {\n used: (data.storage_used as number) ?? 0,\n cap: (data.storage_cap as number) ?? DEFAULT_STORAGE_CAP,\n };\n}\n\nexport async function getStorageUsed(\n client: SupabaseClient,\n userId: string,\n): Promise<number> {\n const { used } = await getStorageInfo(client, userId);\n return used;\n}\n\nexport async function getStorageCap(\n client: SupabaseClient,\n userId: string,\n): Promise<number> {\n const { cap } = await getStorageInfo(client, userId);\n return cap;\n}\n\nexport async function checkStorageCap(\n client: SupabaseClient,\n userId: string,\n fileSize: number,\n): Promise<{ allowed: boolean; used: number; cap: number }> {\n const { used, cap } = await getStorageInfo(client, userId);\n return { allowed: used + fileSize <= cap, used, cap };\n}\n\nexport async function incrementStorageUsed(\n client: SupabaseClient,\n userId: string,\n bytes: number,\n): Promise<void> {\n const used = await getStorageUsed(client, userId);\n await client\n .from(\"profiles\")\n .update({ storage_used: used + bytes })\n .eq(\"id\", userId);\n}\n\nexport async function decrementStorageUsed(\n client: SupabaseClient,\n userId: string,\n bytes: number,\n): Promise<void> {\n const used = await getStorageUsed(client, userId);\n await client\n .from(\"profiles\")\n .update({ storage_used: Math.max(0, used - bytes) })\n .eq(\"id\", userId);\n}\n\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Note, NoteType } from \"./types\";\nimport { decrementStorageUsed } from \"./storage\";\n\nexport type FileCleanupFn = (urls: Array<{ src: string; filesize: number }>) => Promise<void>;\n\nexport interface CreateNoteParams {\n user_id: string;\n title?: string;\n slug?: string;\n note_type?: NoteType;\n daily_date?: string;\n}\n\nasync function uniqueTitle(\n client: SupabaseClient,\n userId: string,\n title: string,\n excludeNoteId?: string,\n): Promise<string> {\n const { data } = await client\n .from(\"notes\")\n .select(\"title\")\n .eq(\"user_id\", userId)\n .is(\"deleted_at\", null);\n\n const existing = new Set(\n ((data ?? []) as Array<{ title: string }>)\n .filter(() => true)\n .map((n) => n.title),\n );\n\n if (excludeNoteId) {\n const { data: self } = await client\n .from(\"notes\")\n .select(\"title\")\n .eq(\"id\", excludeNoteId)\n .single();\n if (self) existing.delete((self as { title: string }).title);\n }\n\n if (!existing.has(title)) return title;\n\n let counter = 1;\n while (existing.has(`${title}(${counter})`)) counter++;\n return `${title}(${counter})`;\n}\n\nexport async function createNote(\n client: SupabaseClient,\n params: CreateNoteParams,\n): Promise<Note> {\n const title = await uniqueTitle(client, params.user_id, params.title ?? \"Untitled\");\n const { data, error } = await client\n .from(\"notes\")\n .insert({\n user_id: params.user_id,\n title,\n slug: params.slug ?? null,\n note_type: params.note_type ?? \"regular\",\n daily_date: params.daily_date ?? null,\n })\n .select()\n .single();\n\n if (error) throw error;\n return data as Note;\n}\n\nexport async function getNote(\n client: SupabaseClient,\n noteId: string,\n): Promise<Note | null> {\n const { data, error } = await client\n .from(\"notes\")\n .select(\"*\")\n .eq(\"id\", noteId)\n .is(\"deleted_at\", null)\n .single();\n\n if (error) return null;\n return data as Note;\n}\n\nexport async function updateNote(\n client: SupabaseClient,\n noteId: string,\n updates: Partial<Pick<Note, \"title\" | \"slug\" | \"is_pinned\">>,\n userId?: string,\n): Promise<Note> {\n const payload = { ...updates };\n if (payload.title && userId) {\n payload.title = await uniqueTitle(client, userId, payload.title, noteId);\n }\n const { data, error } = await client\n .from(\"notes\")\n .update(payload)\n .eq(\"id\", noteId)\n .select()\n .single();\n\n if (error) throw error;\n return data as Note;\n}\n\nexport async function softDeleteNote(\n client: SupabaseClient,\n noteId: string,\n): Promise<void> {\n const { error } = await client\n .from(\"notes\")\n .update({ deleted_at: new Date().toISOString() })\n .eq(\"id\", noteId);\n\n if (error) throw error;\n}\n\nexport async function restoreNote(\n client: SupabaseClient,\n noteId: string,\n): Promise<void> {\n const { error } = await client\n .from(\"notes\")\n .update({ deleted_at: null })\n .eq(\"id\", noteId);\n\n if (error) throw error;\n}\n\nexport async function hardDeleteNote(\n client: SupabaseClient,\n noteId: string,\n onFilesRemoved?: FileCleanupFn,\n): Promise<void> {\n const { data: blocks } = await client\n .from(\"blocks\")\n .select(\"type, metadata, user_id\")\n .eq(\"note_id\", noteId);\n\n const fileUrls: Array<{ src: string; filesize: number }> = [];\n let userId: string | null = null;\n\n for (const b of (blocks ?? []) as Array<{ type: string; metadata: Record<string, unknown>; user_id: string }>) {\n if (!userId) userId = b.user_id;\n const tiptap = b.metadata?.tiptap as Record<string, unknown> | undefined;\n const attrs = (tiptap?.attrs ?? {}) as Record<string, unknown>;\n const src = attrs.src as string | undefined;\n if (src && (b.type === \"file\" || b.type === \"image\") && !src.startsWith(\"data:\")) {\n fileUrls.push({ src, filesize: (attrs.filesize as number) ?? 0 });\n }\n }\n\n for (const file of fileUrls) {\n try {\n const parsed = new URL(file.src);\n if (parsed.pathname.includes(\"/storage/v1/object/public/\")) {\n const pathParts = parsed.pathname.split(\"/storage/v1/object/public/\");\n if (pathParts.length >= 2) {\n const fullPath = decodeURIComponent(pathParts[1]);\n const slashIdx = fullPath.indexOf(\"/\");\n if (slashIdx !== -1) {\n await client.storage.from(fullPath.substring(0, slashIdx)).remove([fullPath.substring(slashIdx + 1)]);\n }\n }\n }\n if (userId && file.filesize > 0) {\n await decrementStorageUsed(client, userId, file.filesize).catch(() => {});\n }\n } catch {\n // best-effort\n }\n }\n\n if (fileUrls.length > 0 && onFilesRemoved) {\n await onFilesRemoved(fileUrls).catch(() => {});\n }\n\n const { error } = await client\n .from(\"notes\")\n .delete()\n .eq(\"id\", noteId);\n\n if (error) throw error;\n\n if (userId) {\n await cleanupOrphanedTags(client, userId);\n }\n}\n\nasync function cleanupOrphanedTags(client: SupabaseClient, userId: string): Promise<void> {\n try {\n const { data: tags } = await client\n .from(\"tags\")\n .select(\"id\")\n .eq(\"user_id\", userId);\n\n if (!tags || tags.length === 0) return;\n\n for (const tag of tags) {\n const { count: blockCount } = await client\n .from(\"block_tags\")\n .select(\"*\", { count: \"exact\", head: true })\n .eq(\"tag_id\", tag.id);\n\n const { count: noteCount } = await client\n .from(\"note_tags\")\n .select(\"*\", { count: \"exact\", head: true })\n .eq(\"tag_id\", tag.id);\n\n if ((blockCount ?? 0) === 0 && (noteCount ?? 0) === 0) {\n await client.from(\"tag_edges\").delete().or(`parent_id.eq.${tag.id},child_id.eq.${tag.id}`);\n await client.from(\"tags\").delete().eq(\"id\", tag.id);\n }\n }\n } catch {\n // best-effort\n }\n}\n\nexport async function emptyTrash(\n client: SupabaseClient,\n userId: string,\n): Promise<number> {\n const { data } = await client\n .from(\"notes\")\n .select(\"id\")\n .eq(\"user_id\", userId)\n .not(\"deleted_at\", \"is\", null);\n\n if (!data || data.length === 0) return 0;\n\n const ids = (data as Array<{ id: string }>).map((n) => n.id);\n const { error } = await client\n .from(\"notes\")\n .delete()\n .in(\"id\", ids);\n\n if (error) throw error;\n return ids.length;\n}\n\nexport interface ListNotesParams {\n user_id: string;\n note_type?: NoteType;\n is_pinned?: boolean;\n include_deleted?: boolean;\n limit?: number;\n offset?: number;\n}\n\nexport async function listNotes(\n client: SupabaseClient,\n params: ListNotesParams,\n): Promise<Note[]> {\n let query = client\n .from(\"notes\")\n .select(\"*\")\n .eq(\"user_id\", params.user_id)\n .order(\"updated_at\", { ascending: false });\n\n if (!params.include_deleted) {\n query = query.is(\"deleted_at\", null);\n }\n if (params.note_type) {\n query = query.eq(\"note_type\", params.note_type);\n }\n if (params.is_pinned !== undefined) {\n query = query.eq(\"is_pinned\", params.is_pinned);\n }\n if (params.limit) {\n query = query.limit(params.limit);\n }\n if (params.offset) {\n query = query.range(params.offset, params.offset + (params.limit ?? 50) - 1);\n }\n\n const { data, error } = await query;\n if (error) throw error;\n return (data ?? []) as Note[];\n}\n\nexport async function getOrCreateDailyNote(\n client: SupabaseClient,\n userId: string,\n date: string,\n): Promise<Note> {\n const { data: existing } = await client\n .from(\"notes\")\n .select(\"*\")\n .eq(\"user_id\", userId)\n .eq(\"note_type\", \"daily\")\n .eq(\"daily_date\", date)\n .single();\n\n if (existing) return existing as Note;\n\n const dateObj = new Date(date + \"T00:00:00\");\n const title = dateObj.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n\n return createNote(client, {\n user_id: userId,\n title,\n slug: date,\n note_type: \"daily\",\n daily_date: date,\n });\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Tag, TagEdge } from \"./types\";\n\nexport async function createTag(\n client: SupabaseClient,\n userId: string,\n name: string,\n color?: string,\n): Promise<Tag> {\n const { data, error } = await client\n .from(\"tags\")\n .insert({ user_id: userId, name: name.toLowerCase(), color: color ?? null })\n .select()\n .single();\n\n if (error) throw error;\n return data as Tag;\n}\n\nexport async function getOrCreateTag(\n client: SupabaseClient,\n userId: string,\n name: string,\n color?: string,\n): Promise<Tag> {\n const normalized = name.toLowerCase();\n const { data: existing } = await client\n .from(\"tags\")\n .select(\"*\")\n .eq(\"user_id\", userId)\n .eq(\"name\", normalized)\n .single();\n\n if (existing) return existing as Tag;\n return createTag(client, userId, normalized, color);\n}\n\nexport async function getUserTags(\n client: SupabaseClient,\n userId: string,\n): Promise<Tag[]> {\n const { data, error } = await client\n .from(\"tags\")\n .select(\"*\")\n .eq(\"user_id\", userId)\n .order(\"name\");\n\n if (error) throw error;\n return (data ?? []) as Tag[];\n}\n\nexport async function updateTag(\n client: SupabaseClient,\n tagId: string,\n updates: Partial<Pick<Tag, \"name\" | \"color\">>,\n): Promise<Tag> {\n const payload: Record<string, unknown> = {};\n if (updates.name !== undefined) payload.name = updates.name.toLowerCase();\n if (updates.color !== undefined) payload.color = updates.color;\n\n const { data, error } = await client\n .from(\"tags\")\n .update(payload)\n .eq(\"id\", tagId)\n .select()\n .single();\n\n if (error) throw error;\n return data as Tag;\n}\n\nexport async function deleteTag(\n client: SupabaseClient,\n tagId: string,\n): Promise<void> {\n const { error } = await client.from(\"tags\").delete().eq(\"id\", tagId);\n if (error) throw error;\n}\n\nexport async function addTagEdge(\n client: SupabaseClient,\n userId: string,\n parentId: string,\n childId: string,\n): Promise<TagEdge> {\n const { data, error } = await client\n .from(\"tag_edges\")\n .insert({ parent_id: parentId, child_id: childId, user_id: userId })\n .select()\n .single();\n\n if (error) throw error;\n return data as TagEdge;\n}\n\nexport async function removeTagEdge(\n client: SupabaseClient,\n parentId: string,\n childId: string,\n): Promise<void> {\n const { error } = await client\n .from(\"tag_edges\")\n .delete()\n .eq(\"parent_id\", parentId)\n .eq(\"child_id\", childId);\n\n if (error) throw error;\n}\n\nexport async function getTagParents(\n client: SupabaseClient,\n tagId: string,\n): Promise<Tag[]> {\n const { data, error } = await client\n .from(\"tag_edges\")\n .select(\"parent_id\")\n .eq(\"child_id\", tagId);\n\n if (error) throw error;\n if (!data || data.length === 0) return [];\n\n const parentIds = data.map((e) => (e as TagEdge).parent_id);\n const { data: tags, error: tagErr } = await client\n .from(\"tags\")\n .select(\"*\")\n .in(\"id\", parentIds);\n\n if (tagErr) throw tagErr;\n return (tags ?? []) as Tag[];\n}\n\nexport async function getTagChildren(\n client: SupabaseClient,\n tagId: string,\n): Promise<Tag[]> {\n const { data, error } = await client\n .from(\"tag_edges\")\n .select(\"child_id\")\n .eq(\"parent_id\", tagId);\n\n if (error) throw error;\n if (!data || data.length === 0) return [];\n\n const childIds = data.map((e) => (e as TagEdge).child_id);\n const { data: tags, error: tagErr } = await client\n .from(\"tags\")\n .select(\"*\")\n .in(\"id\", childIds);\n\n if (tagErr) throw tagErr;\n return (tags ?? []) as Tag[];\n}\n\nexport async function getTagDescendants(\n client: SupabaseClient,\n tagId: string,\n): Promise<string[]> {\n const { data, error } = await client.rpc(\"get_tag_descendants\", {\n root_tag_id: tagId,\n });\n\n if (error) throw error;\n return ((data ?? []) as Array<{ tag_id: string }>).map((r) => r.tag_id);\n}\n\nexport async function addBlockTag(\n client: SupabaseClient,\n blockId: string,\n tagId: string,\n): Promise<void> {\n const { error } = await client\n .from(\"block_tags\")\n .upsert({ block_id: blockId, tag_id: tagId }, { onConflict: \"block_id,tag_id\" });\n\n if (error) throw error;\n}\n\nexport async function removeBlockTag(\n client: SupabaseClient,\n blockId: string,\n tagId: string,\n): Promise<void> {\n const { error } = await client\n .from(\"block_tags\")\n .delete()\n .eq(\"block_id\", blockId)\n .eq(\"tag_id\", tagId);\n\n if (error) throw error;\n}\n\nexport async function getBlocksByTag(\n client: SupabaseClient,\n userId: string,\n tagId: string,\n includeDescendants = true,\n): Promise<string[]> {\n let tagIds: string[];\n if (includeDescendants) {\n tagIds = await getTagDescendants(client, tagId);\n } else {\n tagIds = [tagId];\n }\n\n const { data, error } = await client\n .from(\"block_tags\")\n .select(\"block_id, blocks!inner(user_id)\")\n .in(\"tag_id\", tagIds);\n\n if (error) throw error;\n return ((data ?? []) as Array<{ block_id: string }>).map((r) => r.block_id);\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Link, LinkTargetType, BacklinkResult, Block } from \"./types\";\n\nexport async function createLink(\n client: SupabaseClient,\n userId: string,\n sourceBlockId: string,\n targetType: LinkTargetType,\n targetId: string,\n): Promise<Link> {\n const { data, error } = await client\n .from(\"links\")\n .insert({\n user_id: userId,\n source_block_id: sourceBlockId,\n target_type: targetType,\n target_id: targetId,\n })\n .select()\n .single();\n\n if (error) throw error;\n return data as Link;\n}\n\nexport async function deleteLinksForBlock(\n client: SupabaseClient,\n sourceBlockId: string,\n): Promise<void> {\n const { error } = await client\n .from(\"links\")\n .delete()\n .eq(\"source_block_id\", sourceBlockId);\n\n if (error) throw error;\n}\n\nexport async function getBacklinksForNote(\n client: SupabaseClient,\n noteId: string,\n): Promise<BacklinkResult[]> {\n const { data, error } = await client\n .from(\"links\")\n .select(\"source_block_id, blocks!inner(id, note_id, content, type, position, metadata, user_id, created_at, updated_at, deleted_at)\")\n .eq(\"target_type\", \"note\")\n .eq(\"target_id\", noteId);\n\n if (error) throw error;\n if (!data || data.length === 0) return [];\n\n const blockRows = data as unknown as Array<{ source_block_id: string; blocks: Record<string, unknown> }>;\n const noteIds = [...new Set(blockRows.map((r) => r.blocks.note_id as string))];\n\n const { data: notes } = await client\n .from(\"notes\")\n .select(\"id, title\")\n .in(\"id\", noteIds);\n\n const noteMap = new Map((notes ?? []).map((n: Record<string, unknown>) => [n.id as string, n.title as string]));\n\n return blockRows.map((r) => ({\n source_block: r.blocks as unknown as Block,\n source_note_title: noteMap.get(r.blocks.note_id as string) ?? \"Untitled\",\n }));\n}\n\nexport async function syncLinksForNote(\n client: SupabaseClient,\n userId: string,\n noteId: string,\n wikiLinks: Array<{ blockId?: string; targetNoteTitle: string }>,\n): Promise<void> {\n const { data: existingBlocks } = await client\n .from(\"blocks\")\n .select(\"id\")\n .eq(\"note_id\", noteId);\n\n if (existingBlocks) {\n const blockIds = existingBlocks.map((b: Record<string, unknown>) => b.id as string);\n if (blockIds.length > 0) {\n await client\n .from(\"links\")\n .delete()\n .in(\"source_block_id\", blockIds);\n }\n }\n\n if (wikiLinks.length === 0) return;\n\n const titles = [...new Set(wikiLinks.map((l) => l.targetNoteTitle))];\n const { data: targetNotes } = await client\n .from(\"notes\")\n .select(\"id, title\")\n .eq(\"user_id\", userId)\n .in(\"title\", titles);\n\n if (!targetNotes || targetNotes.length === 0) return;\n\n const titleToId = new Map(\n (targetNotes as Array<{ id: string; title: string }>).map((n) => [n.title, n.id]),\n );\n\n const newBlocks = await client\n .from(\"blocks\")\n .select(\"id\")\n .eq(\"note_id\", noteId)\n .order(\"position\");\n\n if (!newBlocks.data) return;\n const firstBlockId = (newBlocks.data[0] as Record<string, unknown>)?.id as string | undefined;\n\n const linksToInsert = wikiLinks\n .map((l) => {\n const targetId = titleToId.get(l.targetNoteTitle);\n if (!targetId) return null;\n return {\n user_id: userId,\n source_block_id: l.blockId ?? firstBlockId,\n target_type: \"note\" as LinkTargetType,\n target_id: targetId,\n };\n })\n .filter((l): l is NonNullable<typeof l> => l !== null && l.source_block_id !== undefined);\n\n if (linksToInsert.length > 0) {\n await client.from(\"links\").insert(linksToInsert);\n }\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Block, BlockType, BlockMetadata } from \"./types\";\nimport { getOrCreateTag, addTagEdge, addBlockTag } from \"./tags\";\nimport { syncLinksForNote } from \"./links\";\n\nexport interface CreateBlockParams {\n note_id: string;\n user_id: string;\n type?: BlockType;\n content?: string;\n position: number;\n metadata?: BlockMetadata;\n}\n\nexport async function createBlock(\n client: SupabaseClient,\n params: CreateBlockParams,\n): Promise<Block> {\n const { data, error } = await client\n .from(\"blocks\")\n .insert({\n note_id: params.note_id,\n user_id: params.user_id,\n type: params.type ?? \"text\",\n content: params.content ?? \"\",\n position: params.position,\n metadata: params.metadata ?? {},\n })\n .select()\n .single();\n\n if (error) throw error;\n return data as Block;\n}\n\nexport async function getBlocksForNote(\n client: SupabaseClient,\n noteId: string,\n): Promise<Block[]> {\n const { data, error } = await client\n .from(\"blocks\")\n .select(\"*\")\n .eq(\"note_id\", noteId)\n .is(\"deleted_at\", null)\n .order(\"position\", { ascending: true });\n\n if (error) throw error;\n return (data ?? []) as Block[];\n}\n\nexport async function updateBlock(\n client: SupabaseClient,\n blockId: string,\n updates: Partial<Pick<Block, \"content\" | \"type\" | \"position\" | \"metadata\">>,\n): Promise<Block> {\n const { data, error } = await client\n .from(\"blocks\")\n .update(updates)\n .eq(\"id\", blockId)\n .select()\n .single();\n\n if (error) throw error;\n return data as Block;\n}\n\nexport async function deleteBlock(\n client: SupabaseClient,\n blockId: string,\n): Promise<void> {\n const { error } = await client\n .from(\"blocks\")\n .update({ deleted_at: new Date().toISOString() })\n .eq(\"id\", blockId);\n\n if (error) throw error;\n}\n\nexport async function upsertBlocks(\n client: SupabaseClient,\n blocks: Array<{\n id?: string;\n note_id: string;\n user_id: string;\n type: BlockType;\n content: string;\n position: number;\n metadata: BlockMetadata;\n }>,\n): Promise<Block[]> {\n const { data, error } = await client\n .from(\"blocks\")\n .upsert(blocks, { onConflict: \"id\" })\n .select();\n\n if (error) throw error;\n return (data ?? []) as Block[];\n}\n\nconst saveLocks = new Map<string, Promise<void>>();\n\nexport async function saveNoteContent(\n client: SupabaseClient,\n noteId: string,\n userId: string,\n tiptapJson: Record<string, unknown>,\n): Promise<void> {\n const existing = saveLocks.get(noteId);\n const doSave = async () => {\n if (existing) await existing.catch(() => {});\n await _saveNoteContentInner(client, noteId, userId, tiptapJson);\n };\n const promise = doSave();\n saveLocks.set(noteId, promise);\n try {\n await promise;\n } finally {\n if (saveLocks.get(noteId) === promise) saveLocks.delete(noteId);\n }\n}\n\nasync function _saveNoteContentInner(\n client: SupabaseClient,\n noteId: string,\n userId: string,\n tiptapJson: Record<string, unknown>,\n): Promise<void> {\n const nodes = tiptapJson.content as Array<Record<string, unknown>> | undefined;\n if (!nodes) return;\n\n const blocksToInsert = nodes.map((node, index) => ({\n note_id: noteId,\n user_id: userId,\n type: mapTiptapTypeToBlockType(node.type as string),\n content: extractPlainText(node),\n position: (index + 1) * 1.0,\n metadata: { tiptap: node },\n }));\n\n if (blocksToInsert.length === 0) return;\n\n const { error } = await client\n .from(\"blocks\")\n .delete()\n .eq(\"note_id\", noteId);\n\n if (error) throw error;\n\n const { error: insertError } = await client\n .from(\"blocks\")\n .insert(blocksToInsert);\n\n if (insertError) throw insertError;\n\n const { data: insertedBlocks } = await client\n .from(\"blocks\")\n .select(\"id, content, type\")\n .eq(\"note_id\", noteId)\n .order(\"position\");\n\n const blockRows = (insertedBlocks ?? []) as Array<{ id: string; content: string; type: string }>;\n\n await client.from(\"block_tags\").delete().in(\"block_id\", blockRows.map((b) => b.id));\n await client.from(\"note_tags\").delete().eq(\"note_id\", noteId);\n\n const noteTagIds = new Set<string>();\n\n const SKIP_TAG_TYPES = new Set([\"code\", \"mermaid\", \"math\", \"image\", \"divider\", \"chart\", \"file\"]);\n\n for (const block of blockRows) {\n if (SKIP_TAG_TYPES.has(block.type)) continue;\n\n const leafTags = extractLeafTags(block.content);\n for (const tagName of leafTags) {\n const tag = await getOrCreateTag(client, userId, tagName);\n await addBlockTag(client, block.id, tag.id).catch(() => {});\n noteTagIds.add(tag.id);\n }\n\n const scopedTags = extractScopedTags(block.content);\n for (const { parent, child } of scopedTags) {\n const parentTag = await getOrCreateTag(client, userId, parent);\n const childTag = await getOrCreateTag(client, userId, child);\n await addTagEdge(client, userId, parentTag.id, childTag.id).catch(() => {});\n }\n }\n\n for (const tagId of noteTagIds) {\n await client\n .from(\"note_tags\")\n .upsert({ note_id: noteId, tag_id: tagId }, { onConflict: \"note_id,tag_id\" });\n }\n\n const fullText = blockRows.map((b) => b.content).join(\" \");\n\n const wikiLinkTitles = extractWikiLinks(fullText);\n if (wikiLinkTitles.length > 0) {\n await syncLinksForNote(client, userId, noteId, wikiLinkTitles.map((t) => ({ targetNoteTitle: t })));\n }\n}\n\nfunction mapTiptapTypeToBlockType(tiptapType: string): BlockType {\n const MAP: Record<string, BlockType> = {\n paragraph: \"text\",\n heading: \"heading\",\n codeBlock: \"code\",\n taskList: \"todo\",\n taskItem: \"todo\",\n blockquote: \"text\",\n bulletList: \"text\",\n orderedList: \"text\",\n image: \"image\",\n mermaidBlock: \"mermaid\",\n mathBlock: \"math\",\n calloutBlock: \"callout\",\n queryBlock: \"query\",\n horizontalRule: \"divider\",\n fileBlock: \"file\",\n linkPreview: \"text\",\n };\n return MAP[tiptapType] ?? \"text\";\n}\n\nfunction extractPlainText(node: Record<string, unknown>): string {\n if (typeof node.text === \"string\") return node.text;\n const content = node.content as Array<Record<string, unknown>> | undefined;\n if (!content) return \"\";\n return content.map(extractPlainText).join(\"\");\n}\n\nfunction extractLeafTags(text: string): string[] {\n const matches = text.match(/#([a-zA-Z][a-zA-Z0-9_-]*(?:\\/[a-zA-Z][a-zA-Z0-9_-]*)*)/g);\n if (!matches) return [];\n const tags = new Set<string>();\n for (const m of matches) {\n const full = m.slice(1).toLowerCase();\n if (full.includes(\"/\")) {\n const parts = full.split(\"/\");\n tags.add(parts[parts.length - 1]);\n } else {\n tags.add(full);\n }\n }\n return [...tags];\n}\n\nfunction extractScopedTags(text: string): Array<{ parent: string; child: string }> {\n const matches = text.match(/#([a-zA-Z][a-zA-Z0-9_-]*(?:\\/[a-zA-Z][a-zA-Z0-9_-]*)+)/g);\n if (!matches) return [];\n const edges: Array<{ parent: string; child: string }> = [];\n for (const m of matches) {\n const parts = m.slice(1).toLowerCase().split(\"/\");\n for (let i = 0; i < parts.length - 1; i++) {\n edges.push({ parent: parts[i], child: parts[i + 1] });\n }\n }\n return edges;\n}\n\nfunction extractWikiLinks(text: string): string[] {\n const matches = text.match(/\\[\\[([^\\]]+)\\]\\]/g);\n if (!matches) return [];\n return [...new Set(matches.map((m) => m.slice(2, -2)))];\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Snapshot } from \"./types\";\n\nfunction generateHash(): string {\n const chars = \"0123456789abcdef\";\n let hash = \"\";\n for (let i = 0; i < 8; i++) {\n hash += chars[Math.floor(Math.random() * chars.length)];\n }\n return hash;\n}\n\nexport async function createSnapshot(\n client: SupabaseClient,\n noteId: string,\n userId: string,\n content: Record<string, unknown>,\n message?: string,\n): Promise<Snapshot | null> {\n const latest = await getLatestSnapshot(client, noteId);\n if (latest && JSON.stringify(latest.content) === JSON.stringify(content)) {\n return null;\n }\n\n const { data, error } = await client\n .from(\"snapshots\")\n .insert({\n note_id: noteId,\n user_id: userId,\n content,\n hash: generateHash(),\n message: message ?? null,\n })\n .select()\n .single();\n\n if (error) throw error;\n return data as Snapshot;\n}\n\nexport async function listSnapshots(\n client: SupabaseClient,\n noteId: string,\n limit = 50,\n): Promise<Snapshot[]> {\n const { data, error } = await client\n .from(\"snapshots\")\n .select(\"*\")\n .eq(\"note_id\", noteId)\n .order(\"created_at\", { ascending: false })\n .limit(limit);\n\n if (error) throw error;\n return (data ?? []) as Snapshot[];\n}\n\nexport async function getSnapshot(\n client: SupabaseClient,\n snapshotId: string,\n): Promise<Snapshot | null> {\n const { data, error } = await client\n .from(\"snapshots\")\n .select(\"*\")\n .eq(\"id\", snapshotId)\n .single();\n\n if (error) return null;\n return data as Snapshot;\n}\n\nexport async function getLatestSnapshot(\n client: SupabaseClient,\n noteId: string,\n): Promise<Snapshot | null> {\n const { data, error } = await client\n .from(\"snapshots\")\n .select(\"*\")\n .eq(\"note_id\", noteId)\n .order(\"created_at\", { ascending: false })\n .limit(1)\n .single();\n\n if (error) return null;\n return data as Snapshot;\n}\n\nexport interface DiffResult {\n added: string[];\n removed: string[];\n unchanged: string[];\n}\n\nexport function diffSnapshots(\n older: Record<string, unknown>,\n newer: Record<string, unknown>,\n): DiffResult {\n const olderBlocks = extractBlockTexts(older);\n const newerBlocks = extractBlockTexts(newer);\n\n const olderSet = new Set(olderBlocks);\n const newerSet = new Set(newerBlocks);\n\n const added = newerBlocks.filter((b) => !olderSet.has(b));\n const removed = olderBlocks.filter((b) => !newerSet.has(b));\n const unchanged = newerBlocks.filter((b) => olderSet.has(b));\n\n return { added, removed, unchanged };\n}\n\nfunction extractBlockTexts(tiptapJson: Record<string, unknown>): string[] {\n const content = tiptapJson.content as Array<Record<string, unknown>> | undefined;\n if (!content) return [];\n return content.map((node) => {\n return extractText(node).trim();\n }).filter(Boolean);\n}\n\nfunction extractText(node: Record<string, unknown>): string {\n if (typeof node.text === \"string\") return node.text;\n const children = node.content as Array<Record<string, unknown>> | undefined;\n if (!children) return \"\";\n return children.map(extractText).join(\"\");\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Block, Note, BlockType } from \"./types\";\nimport { getTagDescendants } from \"./tags\";\n\nexport interface SearchResult {\n block: Block;\n noteId: string;\n noteTitle: string;\n matchType: \"text\" | \"tag\" | \"type\";\n}\n\nexport async function fullTextSearch(\n client: SupabaseClient,\n userId: string,\n query: string,\n limit = 30,\n): Promise<SearchResult[]> {\n const { data, error } = await client\n .from(\"blocks\")\n .select(\"*, notes!inner(id, title)\")\n .eq(\"user_id\", userId)\n .is(\"deleted_at\", null)\n .textSearch(\"content\", query, { type: \"websearch\" })\n .limit(limit);\n\n if (error) throw error;\n\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => {\n const notes = row.notes as Record<string, unknown>;\n return {\n block: row as unknown as Block,\n noteId: notes.id as string,\n noteTitle: notes.title as string,\n matchType: \"text\" as const,\n };\n });\n}\n\nexport async function searchByTag(\n client: SupabaseClient,\n userId: string,\n tagName: string,\n includeDescendants = true,\n): Promise<SearchResult[]> {\n const { data: tags } = await client\n .from(\"tags\")\n .select(\"id\")\n .eq(\"user_id\", userId)\n .eq(\"name\", tagName.toLowerCase())\n .single();\n\n if (!tags) return [];\n const tagId = (tags as Record<string, string>).id;\n\n let tagIds: string[];\n if (includeDescendants) {\n tagIds = await getTagDescendants(client, tagId);\n } else {\n tagIds = [tagId];\n }\n\n const { data, error } = await client\n .from(\"block_tags\")\n .select(\"block_id, blocks!inner(*, notes!inner(id, title))\")\n .in(\"tag_id\", tagIds);\n\n if (error) throw error;\n\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => {\n const block = row.blocks as Record<string, unknown>;\n const notes = block.notes as Record<string, unknown>;\n return {\n block: block as unknown as Block,\n noteId: notes.id as string,\n noteTitle: notes.title as string,\n matchType: \"tag\" as const,\n };\n });\n}\n\nexport async function searchByType(\n client: SupabaseClient,\n userId: string,\n blockType: BlockType,\n limit = 50,\n): Promise<SearchResult[]> {\n const { data, error } = await client\n .from(\"blocks\")\n .select(\"*, notes!inner(id, title)\")\n .eq(\"user_id\", userId)\n .eq(\"type\", blockType)\n .is(\"deleted_at\", null)\n .limit(limit);\n\n if (error) throw error;\n\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => {\n const notes = row.notes as Record<string, unknown>;\n return {\n block: row as unknown as Block,\n noteId: notes.id as string,\n noteTitle: notes.title as string,\n matchType: \"type\" as const,\n };\n });\n}\n\nexport interface QueryFilter {\n text?: string;\n tag?: string;\n type?: BlockType;\n status?: \"open\" | \"done\";\n hasLink?: boolean;\n}\n\nexport function parseQuery(input: string): QueryFilter {\n const filter: QueryFilter = {};\n const parts = input.trim().split(/\\s+/);\n const textParts: string[] = [];\n\n for (const part of parts) {\n if (part.startsWith(\"#\")) {\n const raw = part.slice(1).toLowerCase();\n filter.tag = raw.includes(\"/\") ? raw.split(\"/\").pop()! : raw;\n } else if (part.startsWith(\"type:\")) {\n filter.type = part.slice(5) as BlockType;\n } else if (part.startsWith(\"status:\")) {\n filter.status = part.slice(7) as \"open\" | \"done\";\n } else if (part === \"has:link\") {\n filter.hasLink = true;\n } else {\n textParts.push(part);\n }\n }\n\n if (textParts.length > 0) {\n filter.text = textParts.join(\" \");\n }\n\n return filter;\n}\n\nexport async function executeQuery(\n client: SupabaseClient,\n userId: string,\n input: string,\n limit = 30,\n): Promise<SearchResult[]> {\n const filter = parseQuery(input);\n let results: SearchResult[] = [];\n\n if (filter.tag) {\n results = await searchByTag(client, userId, filter.tag);\n } else if (filter.type) {\n results = await searchByType(client, userId, filter.type, limit);\n } else if (filter.text) {\n results = await fullTextSearch(client, userId, filter.text, limit);\n }\n\n if (filter.status && results.length > 0) {\n const isDone = filter.status === \"done\";\n results = results.filter((r) => {\n const meta = r.block.metadata as Record<string, unknown>;\n if (meta.status === filter.status) return true;\n const json = JSON.stringify(meta);\n if (isDone) return json.includes('\"checked\":true');\n return json.includes('\"checked\":false') || (json.includes('\"taskItem\"') && !json.includes('\"checked\":true'));\n });\n }\n\n return results;\n}\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\n\nexport interface GraphNode {\n id: string;\n label: string;\n type: \"note\" | \"tag\";\n color?: string;\n}\n\nexport interface GraphEdge {\n source: string;\n target: string;\n type: \"link\" | \"tag\";\n}\n\nexport interface GraphData {\n nodes: GraphNode[];\n edges: GraphEdge[];\n}\n\nexport async function getGraphData(\n client: SupabaseClient,\n userId: string,\n): Promise<GraphData> {\n const nodes: GraphNode[] = [];\n const edges: GraphEdge[] = [];\n\n const { data: notes } = await client\n .from(\"notes\")\n .select(\"id, title\")\n .eq(\"user_id\", userId)\n .is(\"deleted_at\", null);\n\n for (const n of (notes ?? []) as Array<{ id: string; title: string }>) {\n nodes.push({ id: n.id, label: n.title, type: \"note\" });\n }\n\n const { data: links } = await client\n .from(\"links\")\n .select(\"source_block_id, target_id, target_type, blocks!inner(note_id)\")\n .eq(\"user_id\", userId)\n .eq(\"target_type\", \"note\");\n\n for (const l of (links ?? []) as unknown as Array<{ target_id: string; blocks: { note_id: string } }>) {\n const sourceNoteId = l.blocks.note_id;\n const targetNoteId = l.target_id;\n if (sourceNoteId && targetNoteId && sourceNoteId !== targetNoteId) {\n edges.push({ source: sourceNoteId, target: targetNoteId, type: \"link\" });\n }\n }\n\n const { data: tags } = await client\n .from(\"tags\")\n .select(\"id, name, color\")\n .eq(\"user_id\", userId);\n\n for (const t of (tags ?? []) as Array<{ id: string; name: string; color: string | null }>) {\n nodes.push({ id: `tag-${t.id}`, label: `#${t.name}`, type: \"tag\", color: t.color ?? undefined });\n }\n\n const { data: noteTags } = await client\n .from(\"note_tags\")\n .select(\"note_id, tag_id\");\n\n for (const nt of (noteTags ?? []) as Array<{ note_id: string; tag_id: string }>) {\n edges.push({ source: nt.note_id, target: `tag-${nt.tag_id}`, type: \"tag\" });\n }\n\n const { data: tagEdges } = await client\n .from(\"tag_edges\")\n .select(\"parent_id, child_id\")\n .eq(\"user_id\", userId);\n\n for (const te of (tagEdges ?? []) as Array<{ parent_id: string; child_id: string }>) {\n edges.push({ source: `tag-${te.parent_id}`, target: `tag-${te.child_id}`, type: \"tag\" });\n }\n\n return { nodes, edges };\n}\n","export interface NoteTemplate {\n id: string;\n name: string;\n content: Record<string, unknown>;\n}\n\nexport const NOTE_TEMPLATES: NoteTemplate[] = [\n {\n id: \"blank\",\n name: \"Blank Note\",\n content: { type: \"doc\", content: [{ type: \"paragraph\" }] },\n },\n {\n id: \"meeting\",\n name: \"Meeting Notes\",\n content: {\n type: \"doc\",\n content: [\n { type: \"heading\", attrs: { level: 1 }, content: [{ type: \"text\", text: \"Meeting Notes\" }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Attendees\" }] },\n { type: \"paragraph\", content: [{ type: \"text\", text: \"- \" }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Agenda\" }] },\n { type: \"paragraph\", content: [{ type: \"text\", text: \"1. \" }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Discussion\" }] },\n { type: \"paragraph\" },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Action Items\" }] },\n { type: \"taskList\", content: [{ type: \"taskItem\", attrs: { checked: false }, content: [{ type: \"paragraph\" }] }] },\n ],\n },\n },\n {\n id: \"daily-standup\",\n name: \"Daily Standup\",\n content: {\n type: \"doc\",\n content: [\n { type: \"heading\", attrs: { level: 1 }, content: [{ type: \"text\", text: \"Daily Standup\" }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Yesterday\" }] },\n { type: \"taskList\", content: [{ type: \"taskItem\", attrs: { checked: true }, content: [{ type: \"paragraph\" }] }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Today\" }] },\n { type: \"taskList\", content: [{ type: \"taskItem\", attrs: { checked: false }, content: [{ type: \"paragraph\" }] }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Blockers\" }] },\n { type: \"paragraph\" },\n ],\n },\n },\n {\n id: \"project\",\n name: \"Project Plan\",\n content: {\n type: \"doc\",\n content: [\n { type: \"heading\", attrs: { level: 1 }, content: [{ type: \"text\", text: \"Project Name\" }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Overview\" }] },\n { type: \"paragraph\" },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Goals\" }] },\n { type: \"paragraph\", content: [{ type: \"text\", text: \"- \" }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Timeline\" }] },\n { type: \"paragraph\" },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Tasks\" }] },\n { type: \"taskList\", content: [{ type: \"taskItem\", attrs: { checked: false }, content: [{ type: \"paragraph\" }] }] },\n { type: \"heading\", attrs: { level: 2 }, content: [{ type: \"text\", text: \"Notes\" }] },\n { type: \"paragraph\" },\n ],\n },\n },\n];\n","import type { SupabaseClient } from \"@supabase/supabase-js\";\nimport type { Note } from \"./types\";\n\nfunction extractTextFromNode(node: Record<string, unknown>): string {\n if (typeof node.text === \"string\") return node.text;\n const content = node.content as Array<Record<string, unknown>> | undefined;\n if (!content) return \"\";\n return content.map(extractTextFromNode).join(\"\");\n}\n\nfunction extractInlineMarkdown(node: Record<string, unknown>): string {\n if (typeof node.text === \"string\") {\n const marks = (node.marks ?? []) as Array<{ type: string; attrs?: Record<string, unknown> }>;\n let text = node.text;\n const linkMark = marks.find((m) => m.type === \"link\");\n if (linkMark) {\n const href = (linkMark.attrs?.href as string) ?? \"\";\n return `[${text}](${href})`;\n }\n for (const mark of marks) {\n if (mark.type === \"bold\") text = `**${text}**`;\n else if (mark.type === \"italic\") text = `*${text}*`;\n else if (mark.type === \"code\") text = `\\`${text}\\``;\n else if (mark.type === \"strike\") text = `~~${text}~~`;\n }\n return text;\n }\n const content = node.content as Array<Record<string, unknown>> | undefined;\n if (!content) return \"\";\n return content.map(extractInlineMarkdown).join(\"\");\n}\n\nfunction tiptapNodeToMarkdown(node: Record<string, unknown>): string[] {\n const type = node.type as string;\n const attrs = (node.attrs ?? {}) as Record<string, unknown>;\n const content = (node.content ?? []) as Array<Record<string, unknown>>;\n const lines: string[] = [];\n\n switch (type) {\n case \"heading\": {\n const level = (attrs.level as number) ?? 1;\n lines.push(`${\"#\".repeat(level)} ${extractInlineMarkdown({ content } as Record<string, unknown>)}`);\n break;\n }\n case \"paragraph\": {\n lines.push(extractInlineMarkdown({ content } as Record<string, unknown>));\n break;\n }\n case \"taskList\": {\n for (const child of content) {\n const childAttrs = (child.attrs ?? {}) as Record<string, unknown>;\n const checked = childAttrs.checked ? \"x\" : \" \";\n const text = extractInlineMarkdown(child);\n lines.push(`- [${checked}] ${text}`);\n }\n break;\n }\n case \"taskItem\": {\n const checked = attrs.checked ? \"x\" : \" \";\n lines.push(`- [${checked}] ${extractInlineMarkdown({ content } as Record<string, unknown>)}`);\n break;\n }\n case \"bulletList\": {\n for (const child of content) {\n const text = extractInlineMarkdown(child);\n lines.push(`- ${text}`);\n }\n break;\n }\n case \"orderedList\": {\n content.forEach((child, i) => {\n const text = extractInlineMarkdown(child);\n lines.push(`${i + 1}. ${text}`);\n });\n break;\n }\n case \"codeBlock\": {\n const lang = (attrs.language as string) ?? \"\";\n lines.push(\"```\" + lang, extractTextFromNode(node), \"```\");\n break;\n }\n case \"mermaidBlock\": {\n lines.push(\"```mermaid\", extractTextFromNode(node), \"```\");\n break;\n }\n case \"mathBlock\": {\n lines.push(\"$$\", extractTextFromNode(node), \"$$\");\n break;\n }\n case \"calloutBlock\": {\n const variant = (attrs.variant as string) ?? \"info\";\n const text = extractInlineMarkdown({ content } as Record<string, unknown>);\n lines.push(`> [!${variant}]`, ...text.split(\"\\n\").map((l) => `> ${l}`));\n break;\n }\n case \"queryBlock\": {\n const text = extractTextFromNode(node).trim();\n lines.push(`> [!query]`, `> ${text}`);\n break;\n }\n case \"blockquote\": {\n const text = extractInlineMarkdown({ content } as Record<string, unknown>);\n lines.push(...text.split(\"\\n\").map((l) => `> ${l}`));\n break;\n }\n case \"horizontalRule\": {\n lines.push(\"---\");\n break;\n }\n case \"image\": {\n const src = attrs.src as string ?? \"\";\n const alt = (attrs.alt as string) ?? \"\";\n lines.push(``);\n break;\n }\n case \"linkPreview\": {\n const url = attrs.url as string ?? \"\";\n lines.push(`> [!embed]`, `> ${url}`);\n break;\n }\n case \"fileBlock\": {\n const src = attrs.src as string ?? \"\";\n const filename = (attrs.filename as string) ?? \"file\";\n const filesize = (attrs.filesize as number) ?? 0;\n const filetype = (attrs.filetype as string) ?? \"\";\n lines.push(`> [!file]`, `> [${filename}](${src})`, `> ${filetype} ${filesize}`);\n break;\n }\n default: {\n const text = extractTextFromNode(node);\n if (text.trim()) lines.push(text);\n break;\n }\n }\n\n return lines;\n}\n\nexport async function exportNoteAsJson(\n client: SupabaseClient,\n noteId: string,\n): Promise<string> {\n const { data: note } = await client\n .from(\"notes\")\n .select(\"*\")\n .eq(\"id\", noteId)\n .single();\n\n const { data: blocks } = await client\n .from(\"blocks\")\n .select(\"*\")\n .eq(\"note_id\", noteId)\n .is(\"deleted_at\", null)\n .order(\"position\");\n\n return JSON.stringify({ note, blocks }, null, 2);\n}\n\nexport async function exportNoteAsMarkdown(\n client: SupabaseClient,\n noteId: string,\n): Promise<string> {\n const { data: note } = await client\n .from(\"notes\")\n .select(\"title\")\n .eq(\"id\", noteId)\n .single();\n\n const { data: blocks } = await client\n .from(\"blocks\")\n .select(\"type, content, metadata\")\n .eq(\"note_id\", noteId)\n .is(\"deleted_at\", null)\n .order(\"position\");\n\n if (!blocks) return \"\";\n\n const title = (note as Record<string, string>)?.title ?? \"Untitled\";\n const lines: string[] = [`# ${title}`, \"\"];\n\n for (const block of blocks as Array<{ type: string; content: string; metadata: Record<string, unknown> }>) {\n const tiptap = block.metadata.tiptap as Record<string, unknown> | undefined;\n if (tiptap) {\n lines.push(...tiptapNodeToMarkdown(tiptap), \"\");\n } else {\n if (block.content.trim()) lines.push(block.content, \"\");\n }\n }\n\n return lines.join(\"\\n\");\n}\n","interface TiptapNode {\n type: string;\n attrs?: Record<string, unknown>;\n content?: TiptapNode[];\n text?: string;\n marks?: Array<{ type: string; attrs?: Record<string, unknown> }>;\n}\n\nexport function markdownToTiptap(md: string): Record<string, unknown> {\n const lines = md.split(\"\\n\");\n const nodes: TiptapNode[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n if (line.match(/^#{1,4}\\s/)) {\n const match = line.match(/^(#{1,4})\\s(.*)$/);\n if (match) {\n nodes.push({\n type: \"heading\",\n attrs: { level: match[1].length },\n content: parseInline(match[2]),\n });\n }\n i++;\n continue;\n }\n\n if (line.match(/^```mermaid\\s*$/)) {\n const mermaidLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].match(/^```\\s*$/)) {\n mermaidLines.push(lines[i]);\n i++;\n }\n i++;\n nodes.push({\n type: \"mermaidBlock\",\n content: [{ type: \"text\", text: mermaidLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (line.match(/^```/)) {\n const langMatch = line.match(/^```(\\w*)$/);\n const language = langMatch?.[1] || \"plaintext\";\n const codeLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].match(/^```\\s*$/)) {\n codeLines.push(lines[i]);\n i++;\n }\n i++;\n nodes.push({\n type: \"codeBlock\",\n attrs: { language },\n content: [{ type: \"text\", text: codeLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (line.match(/^\\$\\$\\s*$/)) {\n const mathLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].match(/^\\$\\$\\s*$/)) {\n mathLines.push(lines[i]);\n i++;\n }\n i++;\n nodes.push({\n type: \"mathBlock\",\n content: [{ type: \"text\", text: mathLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (line.match(/^>\\s*\\[!(\\w+)\\]\\s*$/)) {\n const variantMatch = line.match(/^>\\s*\\[!(\\w+)\\]\\s*$/);\n const variant = variantMatch?.[1] ?? \"info\";\n\n if (variant === \"query\") {\n const queryLines: string[] = [];\n i++;\n while (i < lines.length && lines[i].match(/^>\\s/)) {\n queryLines.push(lines[i].replace(/^>\\s?/, \"\"));\n i++;\n }\n nodes.push({\n type: \"queryBlock\",\n content: [{ type: \"text\", text: queryLines.join(\"\\n\") }],\n });\n continue;\n }\n\n if (variant === \"embed\") {\n i++;\n const embedUrl = lines[i]?.replace(/^>\\s?/, \"\").trim() ?? \"\";\n i++;\n nodes.push({\n type: \"linkPreview\",\n attrs: { url: embedUrl },\n });\n continue;\n }\n\n if (variant === \"file\") {\n i++;\n const linkLine = lines[i]?.replace(/^>\\s?/, \"\") ?? \"\";\n const linkMatch = linkLine.match(/^\\[(.+?)\\]\\((.+?)\\)$/);\n i++;\n const metaLine = lines[i]?.replace(/^>\\s?/, \"\") ?? \"\";\n const metaParts = metaLine.split(\" \");\n i++;\n nodes.push({\n type: \"fileBlock\",\n attrs: {\n filename: linkMatch?.[1] ?? \"file\",\n src: linkMatch?.[2] ?? \"\",\n filetype: metaParts[0] ?? \"\",\n filesize: parseInt(metaParts[1] ?? \"0\", 10) || 0,\n },\n });\n continue;\n }\n\n const calloutLines: string[] = [];\n i++;\n while (i < lines.length && lines[i].match(/^>\\s/)) {\n calloutLines.push(lines[i].replace(/^>\\s?/, \"\"));\n i++;\n }\n nodes.push({\n type: \"calloutBlock\",\n attrs: { variant },\n content: [{ type: \"paragraph\", content: parseInline(calloutLines.join(\"\\n\")) }],\n });\n continue;\n }\n\n if (line.match(/^>\\s/)) {\n const quoteLines: string[] = [];\n while (i < lines.length && lines[i].match(/^>\\s?/)) {\n quoteLines.push(lines[i].replace(/^>\\s?/, \"\"));\n i++;\n }\n nodes.push({\n type: \"blockquote\",\n content: [{ type: \"paragraph\", content: parseInline(quoteLines.join(\"\\n\")) }],\n });\n continue;\n }\n\n if (line.match(/^---\\s*$/)) {\n nodes.push({ type: \"horizontalRule\" });\n i++;\n continue;\n }\n\n if (line.match(/^!\\[.*?\\]\\(.*?\\)$/)) {\n const imgMatch = line.match(/^!\\[(.*?)\\]\\((.*?)\\)$/);\n if (imgMatch) {\n nodes.push({\n type: \"image\",\n attrs: { src: imgMatch[2], alt: imgMatch[1] },\n });\n }\n i++;\n continue;\n }\n\n if (line.match(/^[-*]\\s\\[[ x]\\]\\s/)) {\n const taskItems: TiptapNode[] = [];\n while (i < lines.length && lines[i].match(/^[-*]\\s\\[[ x]\\]\\s/)) {\n const m = lines[i].match(/^[-*]\\s\\[([ x])\\]\\s(.*)$/);\n if (m) {\n taskItems.push({\n type: \"taskItem\",\n attrs: { checked: m[1] === \"x\" },\n content: [{ type: \"paragraph\", content: parseInline(m[2]) }],\n });\n }\n i++;\n }\n nodes.push({ type: \"taskList\", content: taskItems });\n continue;\n }\n\n if (line.match(/^[-*]\\s/)) {\n const items: TiptapNode[] = [];\n while (i < lines.length && lines[i].match(/^[-*]\\s/)) {\n const text = lines[i].replace(/^[-*]\\s/, \"\");\n items.push({\n type: \"listItem\",\n content: [{ type: \"paragraph\", content: parseInline(text) }],\n });\n i++;\n }\n nodes.push({ type: \"bulletList\", content: items });\n continue;\n }\n\n if (line.match(/^\\d+\\.\\s/)) {\n const items: TiptapNode[] = [];\n while (i < lines.length && lines[i].match(/^\\d+\\.\\s/)) {\n const text = lines[i].replace(/^\\d+\\.\\s/, \"\");\n items.push({\n type: \"listItem\",\n content: [{ type: \"paragraph\", content: parseInline(text) }],\n });\n i++;\n }\n nodes.push({ type: \"orderedList\", content: items });\n continue;\n }\n\n if (line.trim() === \"\") {\n i++;\n continue;\n }\n\n const paraLines: string[] = [];\n while (\n i < lines.length &&\n lines[i].trim() !== \"\" &&\n !lines[i].match(/^#{1,4}\\s/) &&\n !lines[i].match(/^```/) &&\n !lines[i].match(/^\\$\\$/) &&\n !lines[i].match(/^---\\s*$/) &&\n !lines[i].match(/^[-*]\\s/) &&\n !lines[i].match(/^\\d+\\.\\s/) &&\n !lines[i].match(/^>\\s/) &&\n !lines[i].match(/^!\\[/)\n ) {\n paraLines.push(lines[i]);\n i++;\n }\n nodes.push({\n type: \"paragraph\",\n content: parseInline(paraLines.join(\"\\n\")),\n });\n }\n\n if (nodes.length === 0) {\n nodes.push({ type: \"paragraph\" });\n }\n\n return { type: \"doc\", content: nodes };\n}\n\nfunction parseInline(text: string): TiptapNode[] {\n if (!text) return [];\n\n const nodes: TiptapNode[] = [];\n const regex = /(\\*\\*(.+?)\\*\\*|\\*(.+?)\\*|`(.+?)`|~~(.+?)~~|\\[\\[(.+?)\\]\\]|#([a-zA-Z][a-zA-Z0-9_/-]*)|\\[([^\\]]+?)\\]\\(([^)]+?)\\))/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n if (match.index > lastIndex) {\n nodes.push({ type: \"text\", text: text.slice(lastIndex, match.index) });\n }\n\n if (match[2]) {\n nodes.push({ type: \"text\", text: match[2], marks: [{ type: \"bold\" }] });\n } else if (match[3]) {\n nodes.push({ type: \"text\", text: match[3], marks: [{ type: \"italic\" }] });\n } else if (match[4]) {\n nodes.push({ type: \"text\", text: match[4], marks: [{ type: \"code\" }] });\n } else if (match[5]) {\n nodes.push({ type: \"text\", text: match[5], marks: [{ type: \"strike\" }] });\n } else if (match[6]) {\n nodes.push({ type: \"text\", text: `[[${match[6]}]]` });\n } else if (match[7]) {\n nodes.push({ type: \"text\", text: `#${match[7]}` });\n } else if (match[8] && match[9]) {\n nodes.push({ type: \"text\", text: match[8], marks: [{ type: \"link\", attrs: { href: match[9], target: \"_blank\" } }] });\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < text.length) {\n nodes.push({ type: \"text\", text: text.slice(lastIndex) });\n }\n\n return nodes.length > 0 ? nodes : [{ type: \"text\", text: text || \" \" }];\n}\n","export const VERTEX_VERSION = \"0.1.0\";\n\nexport {\n createSupabaseClient,\n initSupabaseClient,\n getSupabaseClient,\n type SupabaseClient,\n} from \"./client\";\n\nexport type {\n NoteType,\n BlockType,\n LinkTargetType,\n Priority,\n TodoStatus,\n CalloutVariant,\n ChartType,\n Profile,\n UserPreferences,\n Note,\n Block,\n BlockMetadata,\n TodoMetadata,\n CodeMetadata,\n HeadingMetadata,\n ImageMetadata,\n FileMetadata,\n MermaidMetadata,\n ChartMetadata,\n CalloutMetadata,\n QueryMetadata,\n ScopeMetadata,\n Tag,\n TagEdge,\n BlockTag,\n NoteTag,\n Link,\n Snapshot,\n SrsCard,\n TagWithCounts,\n NoteWithTags,\n BlockWithTags,\n BacklinkResult,\n} from \"./types\";\n\nexport {\n signInWithOAuth,\n signInWithEmail,\n signUpWithEmail,\n signOut,\n getUser,\n getSession,\n getProfile,\n onAuthStateChange,\n type OAuthProvider,\n type User,\n type Session,\n} from \"./auth\";\n\nexport {\n createNote,\n getNote,\n updateNote,\n softDeleteNote,\n restoreNote,\n hardDeleteNote,\n emptyTrash,\n listNotes,\n getOrCreateDailyNote,\n type CreateNoteParams,\n type ListNotesParams,\n type FileCleanupFn,\n} from \"./notes\";\n\nexport {\n createBlock,\n getBlocksForNote,\n updateBlock,\n deleteBlock,\n upsertBlocks,\n saveNoteContent,\n type CreateBlockParams,\n} from \"./blocks\";\n\nexport {\n createTag,\n getOrCreateTag,\n getUserTags,\n updateTag,\n deleteTag,\n addTagEdge,\n removeTagEdge,\n getTagParents,\n getTagChildren,\n getTagDescendants,\n addBlockTag,\n removeBlockTag,\n getBlocksByTag,\n} from \"./tags\";\n\nexport {\n createLink,\n deleteLinksForBlock,\n getBacklinksForNote,\n syncLinksForNote,\n} from \"./links\";\n\nexport {\n createSnapshot,\n listSnapshots,\n getSnapshot,\n getLatestSnapshot,\n diffSnapshots,\n type DiffResult,\n} from \"./snapshots\";\n\nexport {\n fullTextSearch,\n searchByTag,\n searchByType,\n parseQuery,\n executeQuery,\n type SearchResult,\n type QueryFilter,\n} from \"./search\";\n\nexport {\n getGraphData,\n type GraphNode,\n type GraphEdge,\n type GraphData,\n} from \"./graph\";\n\nexport { NOTE_TEMPLATES, type NoteTemplate } from \"./templates\";\n\nexport {\n exportNoteAsJson,\n exportNoteAsMarkdown,\n} from \"./export\";\n\nexport { markdownToTiptap } from \"./md-to-tiptap\";\n\nexport {\n DEFAULT_STORAGE_CAP,\n getStorageInfo,\n getStorageUsed,\n getStorageCap,\n checkStorageCap,\n incrementStorageUsed,\n decrementStorageUsed,\n formatFileSize,\n} from \"./storage\";\n"],"mappings":"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","names":[]}
|
|
File without changes
|