feat: brainstorm sessions, PDF document Q&A, embedding fixes, and UI improvements
All checks were successful
Deploy to Production / Build and Deploy (push) Successful in 7s
All checks were successful
Deploy to Production / Build and Deploy (push) Successful in 7s
- Add brainstorm feature with collaborative canvas, AI idea generation, live cursors, playback, and export - Add PDF upload/extraction/ingestion pipeline with pgvector document search (RAG) - Add document Q&A overlay with streaming chat and PDF preview - Add note attachments UI with status polling, grid layout, and auto-scroll - Add task extraction AI tool and agent executor improvements - Fix NoteEmbedding missing updatedAt column, re-index 66 notes with 1536-dim embeddings - Fix brainstorm 'Create Note' button: add success toast and redirect to created note - Fix memory echo notification infinite polling - Fix chat route to always include document_search tool - Add brainstorm i18n keys across all 14 locales - Add socket server for real-time brainstorm collaboration - Add hierarchical notebook selector and organize notebook dialog improvements - Add sidebar brainstorm section with session management - Update prisma schema with brainstorm tables, attachments, and document chunks
This commit is contained in:
@@ -23,7 +23,7 @@ import '../tools'
|
||||
|
||||
// --- Types ---
|
||||
|
||||
export type AgentType = 'scraper' | 'researcher' | 'monitor' | 'custom' | 'slide-generator' | 'excalidraw-generator'
|
||||
export type AgentType = 'scraper' | 'researcher' | 'monitor' | 'custom' | 'slide-generator' | 'excalidraw-generator' | 'task-extractor'
|
||||
|
||||
export interface AgentExecutionResult {
|
||||
success: boolean
|
||||
@@ -941,6 +941,28 @@ IMPERATIVE DESIGN RULES:
|
||||
- Concise points (max 100 chars), punchy and short titles
|
||||
- Strict JSON for generate_pptx, no text outside JSON.`,
|
||||
},
|
||||
'task-extractor': {
|
||||
fr: `Tu es un expert en gestion de tâches et extraction d'action items. Tu analyses des notes et documents pour identifier toutes les tâches, TODOs, et actions à accomplir.
|
||||
|
||||
Utilise OBLIGATOIREMENT l'outil task_extract. Ne réponds PAS avec du texte, appelle directement l'outil.
|
||||
|
||||
## RÈGLES
|
||||
- Identifie TOUTES les tâches explicites et implicites
|
||||
- Pour chaque tâche, détermine: priorité (High/Medium/Low), assigné, deadline, statut
|
||||
- Les priorités High = urgent/dates proches, Medium = important, Low = Nice to have
|
||||
- Regroupe par priorité dans la note de synthèse
|
||||
- Utilise le format Markdown avec une table récapitulative`,
|
||||
en: `You are a task extraction specialist. You analyze notes and documents to identify ALL action items, TODOs, and tasks to accomplish.
|
||||
|
||||
You MUST use the task_extract tool. Do NOT respond with text, call the tool directly.
|
||||
|
||||
## RULES
|
||||
- Identify ALL explicit and implicit tasks
|
||||
- For each task, determine: priority (High/Medium/Low), assignee, deadline, status
|
||||
- High priority = urgent/close deadlines, Medium = important, Low = Nice to have
|
||||
- Group by priority in the synthesis note
|
||||
- Use Markdown format with a summary table`,
|
||||
},
|
||||
}
|
||||
|
||||
// --- Tool-Use Agent ---
|
||||
@@ -1172,6 +1194,38 @@ async function executeToolUseAgent(
|
||||
}
|
||||
break
|
||||
}
|
||||
case 'task-extractor': {
|
||||
const untitled = lang === 'fr' ? 'Sans titre' : 'Untitled'
|
||||
const dateLocale = lang === 'fr' ? 'fr-FR' : 'en-US'
|
||||
let notes: any[] = []
|
||||
if (agent.sourceNotebookId) {
|
||||
notes = await prisma.note.findMany({
|
||||
where: { notebookId: agent.sourceNotebookId, userId: agent.userId, isArchived: false, trashedAt: null },
|
||||
orderBy: { createdAt: 'desc' }, take: 20,
|
||||
select: { id: true, title: true, content: true, createdAt: true }
|
||||
})
|
||||
} else {
|
||||
notes = await prisma.note.findMany({
|
||||
where: { userId: agent.userId, isArchived: false, trashedAt: null },
|
||||
orderBy: { updatedAt: 'desc' }, take: 20,
|
||||
select: { id: true, title: true, content: true, createdAt: true }
|
||||
})
|
||||
}
|
||||
const notebookId = agent.sourceNotebookId || agent.targetNotebookId || null
|
||||
prompt = lang === 'fr'
|
||||
? `Analyse les notes suivantes et extrais TOUS les action items, tâches et TODOs. Utilise l'outil task_extract pour créer une note de synthèse.${notebookId ? ` Passe notebookId="${notebookId}" à task_extract.` : ''}`
|
||||
: `Analyze the following notes and extract ALL action items, tasks and TODOs. Use the task_extract tool to create a synthesis note.${notebookId ? ` Pass notebookId="${notebookId}" to task_extract.` : ''}`
|
||||
if (notes.length > 0) {
|
||||
const notesContext = notes.map(n =>
|
||||
`### ${n.title || untitled} (${n.createdAt.toLocaleDateString(dateLocale)})\n${n.content.substring(0, 500)}`
|
||||
).join('\n\n')
|
||||
prompt += `\n\n${lang === 'fr' ? 'Notes à analyser' : 'Notes to analyze'}:\n\n${notesContext}`
|
||||
}
|
||||
prompt += `\n\n${lang === 'fr'
|
||||
? 'IMPORTANT : Utilise OBLIGATOIREMENT l\'outil task_extract. Ne réponds pas avec du texte, appelle directement l\'outil.'
|
||||
: 'IMPORTANT: You MUST use the task_extract tool. Do NOT respond with text, call the tool directly.'}`
|
||||
break
|
||||
}
|
||||
default: {
|
||||
const urls: string[] = agent.sourceUrls ? JSON.parse(agent.sourceUrls) : []
|
||||
prompt = agent.role || (lang === 'fr' ? 'Accomplis la tâche demandée en utilisant les outils disponibles.' : 'Accomplish the requested task using available tools.')
|
||||
|
||||
Reference in New Issue
Block a user