fix: agent notes default to markdown, add convert-to-rich-text option
All checks were successful
Deploy to Production / Build and Deploy (push) Successful in 45s

- Agent-created notes are now type 'markdown' by default (raw markdown content)
- Switching note type from markdown → richtext auto-converts content to HTML
  via /api/ai/convert-markdown endpoint using the existing markdownToHtml utility
- Users can freely switch between markdown and richtext in the note type selector

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Sepehr Ramezani
2026-05-01 16:32:49 +02:00
parent dbd49d6fcb
commit fcb5932d33
4 changed files with 55 additions and 9 deletions

View File

@@ -0,0 +1,22 @@
import { NextRequest, NextResponse } from 'next/server'
import { auth } from '@/auth'
import { markdownToHtml } from '@/lib/markdown-to-html'
export async function POST(request: NextRequest) {
try {
const session = await auth()
if (!session?.user?.id) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
}
const { content } = await request.json()
if (!content || typeof content !== 'string') {
return NextResponse.json({ error: 'Content is required' }, { status: 400 })
}
const html = markdownToHtml(content)
return NextResponse.json({ html })
} catch (error: any) {
return NextResponse.json({ error: error.message || 'Conversion failed' }, { status: 500 })
}
}

View File

@@ -495,10 +495,36 @@ export function NoteInlineEditor({
<NoteTypeSelector
value={noteType}
onChange={(newType) => {
onChange={async (newType) => {
const oldType = noteType
setNoteType(newType)
if (newType === 'markdown') setShowMarkdownPreview(true)
else setShowMarkdownPreview(false)
// When switching from markdown to richtext, convert content to HTML
if (oldType === 'markdown' && newType === 'richtext') {
try {
const res = await fetch('/api/ai/convert-markdown', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ content }),
})
if (res.ok) {
const { html } = await res.json()
setContent(html)
saveInline(note.id, {
type: 'richtext',
isMarkdown: false,
content: html,
}).catch(() => {})
onChange?.(note.id, { type: 'richtext', isMarkdown: false, content: html })
return
}
} catch {
// Fall through to save without conversion
}
}
// Persist both type and isMarkdown immediately
saveInline(note.id, {
type: newType,

View File

@@ -43,13 +43,12 @@ async function createAgentNote(data: {
notebookId: string | null
autoGenerated?: boolean
}) {
const htmlContent = markdownToHtml(data.content)
return prisma.note.create({
data: {
title: data.title,
content: htmlContent,
type: 'richtext',
isMarkdown: false,
content: data.content,
type: 'markdown',
isMarkdown: true,
autoGenerated: data.autoGenerated ?? true,
userId: data.userId,
notebookId: data.notebookId,

View File

@@ -51,13 +51,12 @@ toolRegistry.register({
}),
execute: async ({ title, content, notebookId, images }) => {
try {
const htmlContent = markdownToHtml(content)
const note = await prisma.note.create({
data: {
title,
content: htmlContent,
type: 'richtext',
isMarkdown: false,
content,
type: 'markdown',
isMarkdown: true,
autoGenerated: true,
userId: ctx.userId,
notebookId: notebookId || null,