feat(agents): add search/filter, "New" badge, and duplicate name resolution
- Add search bar with real-time filtering on agent name and description - Add type filter chips (All, Veilleur, Chercheur, Surveillant, Personnalisé) - Add "New" badge on agents created within the last 24h (hydration-safe) - Auto-increment template names on duplicate install (e.g. "Veille Tech 2") - Add i18n keys for new UI elements in both fr and en locales Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -5,8 +5,8 @@
|
|||||||
* Main client component for the agents page.
|
* Main client component for the agents page.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { useState, useCallback } from 'react'
|
import { useState, useCallback, useMemo } from 'react'
|
||||||
import { Plus, Bot } from 'lucide-react'
|
import { Plus, Bot, LifeBuoy, Search } from 'lucide-react'
|
||||||
import { toast } from 'sonner'
|
import { toast } from 'sonner'
|
||||||
import { useLanguage } from '@/lib/i18n'
|
import { useLanguage } from '@/lib/i18n'
|
||||||
|
|
||||||
@@ -14,6 +14,7 @@ import { AgentCard } from '@/components/agents/agent-card'
|
|||||||
import { AgentForm } from '@/components/agents/agent-form'
|
import { AgentForm } from '@/components/agents/agent-form'
|
||||||
import { AgentTemplates } from '@/components/agents/agent-templates'
|
import { AgentTemplates } from '@/components/agents/agent-templates'
|
||||||
import { AgentRunLog } from '@/components/agents/agent-run-log'
|
import { AgentRunLog } from '@/components/agents/agent-run-log'
|
||||||
|
import { AgentHelp } from '@/components/agents/agent-help'
|
||||||
import {
|
import {
|
||||||
createAgent,
|
createAgent,
|
||||||
updateAgent,
|
updateAgent,
|
||||||
@@ -40,7 +41,11 @@ interface AgentItem {
|
|||||||
frequency: string
|
frequency: string
|
||||||
isEnabled: boolean
|
isEnabled: boolean
|
||||||
lastRun: string | Date | null
|
lastRun: string | Date | null
|
||||||
|
createdAt: string | Date
|
||||||
updatedAt: string | Date
|
updatedAt: string | Date
|
||||||
|
tools?: string | null
|
||||||
|
maxSteps?: number
|
||||||
|
notifyEmail?: boolean
|
||||||
_count: { actions: number }
|
_count: { actions: number }
|
||||||
actions: { id: string; status: string; createdAt: string | Date }[]
|
actions: { id: string; status: string; createdAt: string | Date }[]
|
||||||
notebook?: { id: string; name: string; icon?: string | null } | null
|
notebook?: { id: string; name: string; icon?: string | null } | null
|
||||||
@@ -51,6 +56,14 @@ interface AgentsPageClientProps {
|
|||||||
notebooks: Notebook[]
|
notebooks: Notebook[]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const typeFilterOptions = [
|
||||||
|
{ value: '', labelKey: 'agents.filterAll' },
|
||||||
|
{ value: 'scraper', labelKey: 'agents.types.scraper' },
|
||||||
|
{ value: 'researcher', labelKey: 'agents.types.researcher' },
|
||||||
|
{ value: 'monitor', labelKey: 'agents.types.monitor' },
|
||||||
|
{ value: 'custom', labelKey: 'agents.types.custom' },
|
||||||
|
] as const
|
||||||
|
|
||||||
// --- Component ---
|
// --- Component ---
|
||||||
|
|
||||||
export function AgentsPageClient({
|
export function AgentsPageClient({
|
||||||
@@ -62,6 +75,9 @@ export function AgentsPageClient({
|
|||||||
const [showForm, setShowForm] = useState(false)
|
const [showForm, setShowForm] = useState(false)
|
||||||
const [editingAgent, setEditingAgent] = useState<AgentItem | null>(null)
|
const [editingAgent, setEditingAgent] = useState<AgentItem | null>(null)
|
||||||
const [logAgent, setLogAgent] = useState<{ id: string; name: string } | null>(null)
|
const [logAgent, setLogAgent] = useState<{ id: string; name: string } | null>(null)
|
||||||
|
const [showHelp, setShowHelp] = useState(false)
|
||||||
|
const [searchQuery, setSearchQuery] = useState('')
|
||||||
|
const [typeFilter, setTypeFilter] = useState('')
|
||||||
|
|
||||||
const refreshAgents = useCallback(async () => {
|
const refreshAgents = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
@@ -99,6 +115,9 @@ export function AgentsPageClient({
|
|||||||
sourceNotebookId: (formData.get('sourceNotebookId') as string) || undefined,
|
sourceNotebookId: (formData.get('sourceNotebookId') as string) || undefined,
|
||||||
targetNotebookId: (formData.get('targetNotebookId') as string) || undefined,
|
targetNotebookId: (formData.get('targetNotebookId') as string) || undefined,
|
||||||
frequency: formData.get('frequency') as string,
|
frequency: formData.get('frequency') as string,
|
||||||
|
tools: formData.get('tools') ? JSON.parse(formData.get('tools') as string) : undefined,
|
||||||
|
maxSteps: formData.get('maxSteps') ? Number(formData.get('maxSteps')) : undefined,
|
||||||
|
notifyEmail: formData.get('notifyEmail') === 'true',
|
||||||
}
|
}
|
||||||
|
|
||||||
if (editingAgent) {
|
if (editingAgent) {
|
||||||
@@ -111,9 +130,23 @@ export function AgentsPageClient({
|
|||||||
|
|
||||||
setShowForm(false)
|
setShowForm(false)
|
||||||
setEditingAgent(null)
|
setEditingAgent(null)
|
||||||
refreshAgents()
|
await refreshAgents()
|
||||||
}, [editingAgent, refreshAgents, t])
|
}, [editingAgent, refreshAgents, t])
|
||||||
|
|
||||||
|
const filteredAgents = useMemo(() => {
|
||||||
|
return agents.filter(agent => {
|
||||||
|
const matchesType = !typeFilter || (agent.type || 'scraper') === typeFilter
|
||||||
|
if (!searchQuery.trim()) return matchesType
|
||||||
|
const q = searchQuery.toLowerCase()
|
||||||
|
const matchesSearch =
|
||||||
|
(agent.name || '').toLowerCase().includes(q) ||
|
||||||
|
(agent.description && agent.description.toLowerCase().includes(q))
|
||||||
|
return matchesType && matchesSearch
|
||||||
|
})
|
||||||
|
}, [agents, searchQuery, typeFilter])
|
||||||
|
|
||||||
|
const existingAgentNames = useMemo(() => agents.map(a => a.name), [agents])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
@@ -129,8 +162,15 @@ export function AgentsPageClient({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Create button */}
|
{/* Action buttons */}
|
||||||
<div className="flex justify-end mb-6">
|
<div className="flex items-center justify-between mb-6">
|
||||||
|
<button
|
||||||
|
onClick={() => setShowHelp(true)}
|
||||||
|
className="flex items-center gap-2 px-4 py-2 text-sm font-medium text-primary bg-primary/10 border border-primary/20 rounded-lg hover:bg-primary/15 transition-colors"
|
||||||
|
>
|
||||||
|
<LifeBuoy className="w-4 h-4" />
|
||||||
|
{t('agents.help.btnLabel')}
|
||||||
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={handleCreate}
|
onClick={handleCreate}
|
||||||
className="flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-primary rounded-lg hover:bg-primary/90 transition-colors"
|
className="flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-primary rounded-lg hover:bg-primary/90 transition-colors"
|
||||||
@@ -146,17 +186,54 @@ export function AgentsPageClient({
|
|||||||
<h3 className="text-sm font-semibold text-slate-500 uppercase tracking-wider mb-3">
|
<h3 className="text-sm font-semibold text-slate-500 uppercase tracking-wider mb-3">
|
||||||
{t('agents.myAgents')}
|
{t('agents.myAgents')}
|
||||||
</h3>
|
</h3>
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
||||||
{agents.map(agent => (
|
{/* Search and filter */}
|
||||||
<AgentCard
|
<div className="flex flex-col sm:flex-row items-start sm:items-center gap-3 mb-4">
|
||||||
key={agent.id}
|
<div className="relative flex-1 w-full sm:max-w-xs">
|
||||||
agent={agent}
|
<Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400" />
|
||||||
onEdit={handleEdit}
|
<input
|
||||||
onRefresh={refreshAgents}
|
type="text"
|
||||||
onToggle={handleToggle}
|
value={searchQuery}
|
||||||
|
onChange={e => setSearchQuery(e.target.value)}
|
||||||
|
placeholder={t('agents.searchPlaceholder')}
|
||||||
|
className="w-full pl-9 pr-3 py-2 text-sm bg-white border border-slate-200 rounded-lg outline-none focus:border-primary/40 focus:ring-2 focus:ring-primary/10 transition-all"
|
||||||
/>
|
/>
|
||||||
))}
|
</div>
|
||||||
|
<div className="flex items-center gap-1.5 flex-wrap">
|
||||||
|
{typeFilterOptions.map(opt => (
|
||||||
|
<button
|
||||||
|
key={opt.value}
|
||||||
|
onClick={() => setTypeFilter(opt.value)}
|
||||||
|
className={`px-3 py-1.5 text-xs font-medium rounded-full transition-colors ${
|
||||||
|
typeFilter === opt.value
|
||||||
|
? 'bg-primary text-white'
|
||||||
|
: 'bg-slate-100 text-slate-600 hover:bg-slate-200'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{t(opt.labelKey)}
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{filteredAgents.length > 0 ? (
|
||||||
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
||||||
|
{filteredAgents.map(agent => (
|
||||||
|
<AgentCard
|
||||||
|
key={agent.id}
|
||||||
|
agent={agent}
|
||||||
|
onEdit={handleEdit}
|
||||||
|
onRefresh={refreshAgents}
|
||||||
|
onToggle={handleToggle}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<div className="flex flex-col items-center justify-center py-12 text-center">
|
||||||
|
<Search className="w-10 h-10 text-slate-300 mb-3" />
|
||||||
|
<p className="text-sm text-slate-400">{t('agents.noResults')}</p>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
@@ -172,7 +249,7 @@ export function AgentsPageClient({
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{/* Templates */}
|
{/* Templates */}
|
||||||
<AgentTemplates onInstalled={refreshAgents} />
|
<AgentTemplates onInstalled={refreshAgents} existingAgentNames={existingAgentNames} />
|
||||||
|
|
||||||
{/* Form modal */}
|
{/* Form modal */}
|
||||||
{showForm && (
|
{showForm && (
|
||||||
@@ -192,6 +269,11 @@ export function AgentsPageClient({
|
|||||||
onClose={() => setLogAgent(null)}
|
onClose={() => setLogAgent(null)}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* Help modal */}
|
||||||
|
{showHelp && (
|
||||||
|
<AgentHelp onClose={() => setShowHelp(false)} />
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* Displays a single agent with status, actions, and metadata.
|
* Displays a single agent with status, actions, and metadata.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { useState } from 'react'
|
import { useState, useEffect } from 'react'
|
||||||
import { formatDistanceToNow } from 'date-fns'
|
import { formatDistanceToNow } from 'date-fns'
|
||||||
import { fr } from 'date-fns/locale/fr'
|
import { fr } from 'date-fns/locale/fr'
|
||||||
import { enUS } from 'date-fns/locale/en-US'
|
import { enUS } from 'date-fns/locale/en-US'
|
||||||
@@ -25,6 +25,7 @@ import {
|
|||||||
} from 'lucide-react'
|
} from 'lucide-react'
|
||||||
import { toast } from 'sonner'
|
import { toast } from 'sonner'
|
||||||
import { useLanguage } from '@/lib/i18n'
|
import { useLanguage } from '@/lib/i18n'
|
||||||
|
import { getNotebookIcon } from '@/lib/notebook-icon'
|
||||||
|
|
||||||
// --- Types ---
|
// --- Types ---
|
||||||
|
|
||||||
@@ -37,6 +38,7 @@ interface AgentCardProps {
|
|||||||
isEnabled: boolean
|
isEnabled: boolean
|
||||||
frequency: string
|
frequency: string
|
||||||
lastRun: string | Date | null
|
lastRun: string | Date | null
|
||||||
|
createdAt: string | Date
|
||||||
updatedAt: string | Date
|
updatedAt: string | Date
|
||||||
_count: { actions: number }
|
_count: { actions: number }
|
||||||
actions: { id: string; status: string; createdAt: string | Date }[]
|
actions: { id: string; status: string; createdAt: string | Date }[]
|
||||||
@@ -78,11 +80,16 @@ export function AgentCard({ agent, onEdit, onRefresh, onToggle }: AgentCardProps
|
|||||||
const [isRunning, setIsRunning] = useState(false)
|
const [isRunning, setIsRunning] = useState(false)
|
||||||
const [isDeleting, setIsDeleting] = useState(false)
|
const [isDeleting, setIsDeleting] = useState(false)
|
||||||
const [isToggling, setIsToggling] = useState(false)
|
const [isToggling, setIsToggling] = useState(false)
|
||||||
|
const [mounted, setMounted] = useState(false)
|
||||||
|
|
||||||
|
// Prevent hydration mismatch for date formatting
|
||||||
|
useEffect(() => { setMounted(true) }, [])
|
||||||
|
|
||||||
const config = typeConfig[agent.type || 'scraper'] || typeConfig.custom
|
const config = typeConfig[agent.type || 'scraper'] || typeConfig.custom
|
||||||
const Icon = config.icon
|
const Icon = config.icon
|
||||||
const lastAction = agent.actions[0]
|
const lastAction = agent.actions[0]
|
||||||
const dateLocale = language === 'fr' ? fr : enUS
|
const dateLocale = language === 'fr' ? fr : enUS
|
||||||
|
const isNew = Date.now() - new Date(agent.createdAt).getTime() < 24 * 60 * 60 * 1000
|
||||||
|
|
||||||
const handleRun = async () => {
|
const handleRun = async () => {
|
||||||
setIsRunning(true)
|
setIsRunning(true)
|
||||||
@@ -147,7 +154,14 @@ export function AgentCard({ agent, onEdit, onRefresh, onToggle }: AgentCardProps
|
|||||||
<Icon className={`w-4 h-4 ${config.color}`} />
|
<Icon className={`w-4 h-4 ${config.color}`} />
|
||||||
</div>
|
</div>
|
||||||
<div className="min-w-0">
|
<div className="min-w-0">
|
||||||
<h3 className="font-semibold text-slate-800 truncate">{agent.name}</h3>
|
<div className="flex items-center gap-2">
|
||||||
|
<h3 className="font-semibold text-slate-800 truncate">{agent.name}</h3>
|
||||||
|
{mounted && isNew && (
|
||||||
|
<span className="flex-shrink-0 px-1.5 py-0.5 text-[10px] font-bold uppercase tracking-wider bg-emerald-100 text-emerald-700 rounded">
|
||||||
|
{t('agents.newBadge')}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
<span className={`text-xs font-medium ${config.color}`}>
|
<span className={`text-xs font-medium ${config.color}`}>
|
||||||
{t(`agents.types.${agent.type || 'custom'}`)}
|
{t(`agents.types.${agent.type || 'custom'}`)}
|
||||||
</span>
|
</span>
|
||||||
@@ -173,7 +187,10 @@ export function AgentCard({ agent, onEdit, onRefresh, onToggle }: AgentCardProps
|
|||||||
</span>
|
</span>
|
||||||
{agent.notebook && (
|
{agent.notebook && (
|
||||||
<span className="flex items-center gap-1">
|
<span className="flex items-center gap-1">
|
||||||
{agent.notebook.icon || '📁'} {agent.notebook.name}
|
{(() => {
|
||||||
|
const Icon = getNotebookIcon(agent.notebook.icon)
|
||||||
|
return <Icon className="w-3 h-3" />
|
||||||
|
})()} {agent.notebook.name}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
<span>{t('agents.metadata.executions', { count: agent._count.actions })}</span>
|
<span>{t('agents.metadata.executions', { count: agent._count.actions })}</span>
|
||||||
@@ -191,7 +208,9 @@ export function AgentCard({ agent, onEdit, onRefresh, onToggle }: AgentCardProps
|
|||||||
{lastAction.status === 'running' && <Loader2 className="w-3 h-3 animate-spin" />}
|
{lastAction.status === 'running' && <Loader2 className="w-3 h-3 animate-spin" />}
|
||||||
{t(statusKeys[lastAction.status] || lastAction.status)}
|
{t(statusKeys[lastAction.status] || lastAction.status)}
|
||||||
{' - '}
|
{' - '}
|
||||||
{formatDistanceToNow(new Date(lastAction.createdAt), { addSuffix: true, locale: dateLocale })}
|
{mounted
|
||||||
|
? formatDistanceToNow(new Date(lastAction.createdAt), { addSuffix: true, locale: dateLocale })
|
||||||
|
: new Date(lastAction.createdAt).toISOString().split('T')[0]}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|||||||
150
keep-notes/components/agents/agent-templates.tsx
Normal file
150
keep-notes/components/agents/agent-templates.tsx
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
'use client'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Agent Templates Gallery
|
||||||
|
* Pre-built agent configurations that users can install in one click.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { useState } from 'react'
|
||||||
|
import {
|
||||||
|
Globe,
|
||||||
|
Search,
|
||||||
|
Eye,
|
||||||
|
Settings,
|
||||||
|
Plus,
|
||||||
|
Loader2,
|
||||||
|
} from 'lucide-react'
|
||||||
|
import { toast } from 'sonner'
|
||||||
|
import { useLanguage } from '@/lib/i18n'
|
||||||
|
|
||||||
|
interface AgentTemplatesProps {
|
||||||
|
onInstalled: () => void
|
||||||
|
existingAgentNames: string[]
|
||||||
|
}
|
||||||
|
|
||||||
|
const templateConfig = [
|
||||||
|
{ id: 'veilleAI', type: 'scraper', roleKey: 'agents.defaultRoles.scraper', urls: [
|
||||||
|
'https://www.theverge.com/rss/ai-artificial-intelligence/index.xml',
|
||||||
|
'https://techcrunch.com/category/artificial-intelligence/feed/',
|
||||||
|
'https://feeds.arstechnica.com/arstechnica/technology-lab',
|
||||||
|
'https://www.technologyreview.com/feed/',
|
||||||
|
'https://www.wired.com/feed/',
|
||||||
|
'https://korben.info/feed',
|
||||||
|
], frequency: 'weekly' },
|
||||||
|
{ id: 'veilleTech', type: 'scraper', roleKey: 'agents.defaultRoles.scraper', urls: [
|
||||||
|
'https://news.ycombinator.com/rss',
|
||||||
|
'https://dev.to/feed',
|
||||||
|
'https://www.producthunt.com/feed',
|
||||||
|
], frequency: 'daily' },
|
||||||
|
{ id: 'veilleDev', type: 'scraper', roleKey: 'agents.defaultRoles.scraper', urls: [
|
||||||
|
'https://dev.to/feed/tag/javascript',
|
||||||
|
'https://dev.to/feed/tag/typescript',
|
||||||
|
'https://dev.to/feed/tag/react',
|
||||||
|
], frequency: 'weekly' },
|
||||||
|
{ id: 'surveillant', type: 'monitor', roleKey: 'agents.defaultRoles.monitor', urls: [], frequency: 'weekly' },
|
||||||
|
{ id: 'chercheur', type: 'researcher', roleKey: 'agents.defaultRoles.researcher', urls: [], frequency: 'manual' },
|
||||||
|
] as const
|
||||||
|
|
||||||
|
const typeIcons: Record<string, typeof Globe> = {
|
||||||
|
scraper: Globe,
|
||||||
|
researcher: Search,
|
||||||
|
monitor: Eye,
|
||||||
|
custom: Settings,
|
||||||
|
}
|
||||||
|
|
||||||
|
const typeColors: Record<string, string> = {
|
||||||
|
scraper: 'text-blue-600 bg-blue-50',
|
||||||
|
researcher: 'text-purple-600 bg-purple-50',
|
||||||
|
monitor: 'text-amber-600 bg-amber-50',
|
||||||
|
custom: 'text-green-600 bg-green-50',
|
||||||
|
}
|
||||||
|
|
||||||
|
export function AgentTemplates({ onInstalled, existingAgentNames }: AgentTemplatesProps) {
|
||||||
|
const { t } = useLanguage()
|
||||||
|
const [installingId, setInstallingId] = useState<string | null>(null)
|
||||||
|
|
||||||
|
const handleInstall = async (tpl: typeof templateConfig[number]) => {
|
||||||
|
setInstallingId(tpl.id)
|
||||||
|
try {
|
||||||
|
const { createAgent } = await import('@/app/actions/agent-actions')
|
||||||
|
const nameKey = `agents.templates.${tpl.id}.name` as const
|
||||||
|
const descKey = `agents.templates.${tpl.id}.description` as const
|
||||||
|
const baseName = t(nameKey)
|
||||||
|
let resolvedName = baseName
|
||||||
|
if (existingAgentNames.includes(baseName)) {
|
||||||
|
let n = 2
|
||||||
|
while (existingAgentNames.includes(`${baseName} ${n}`)) n++
|
||||||
|
resolvedName = `${baseName} ${n}`
|
||||||
|
}
|
||||||
|
await createAgent({
|
||||||
|
name: resolvedName,
|
||||||
|
description: t(descKey),
|
||||||
|
type: tpl.type,
|
||||||
|
role: t(tpl.roleKey),
|
||||||
|
sourceUrls: tpl.urls.length > 0 ? [...tpl.urls] : undefined,
|
||||||
|
frequency: tpl.frequency,
|
||||||
|
tools: tpl.type === 'scraper'
|
||||||
|
? ['web_scrape', 'note_create']
|
||||||
|
: tpl.type === 'researcher'
|
||||||
|
? ['web_search', 'web_scrape', 'note_search', 'note_create']
|
||||||
|
: tpl.type === 'monitor'
|
||||||
|
? ['note_search', 'note_read', 'note_create']
|
||||||
|
: [],
|
||||||
|
})
|
||||||
|
toast.success(t('agents.toasts.installSuccess', { name: resolvedName }))
|
||||||
|
onInstalled()
|
||||||
|
} catch {
|
||||||
|
toast.error(t('agents.toasts.installError'))
|
||||||
|
} finally {
|
||||||
|
setInstallingId(null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h3 className="text-sm font-semibold text-slate-500 uppercase tracking-wider mb-3">
|
||||||
|
{t('agents.templates.title')}
|
||||||
|
</h3>
|
||||||
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3">
|
||||||
|
{templateConfig.map(tpl => {
|
||||||
|
const Icon = typeIcons[tpl.type] || Settings
|
||||||
|
const isInstalling = installingId === tpl.id
|
||||||
|
const nameKey = `agents.templates.${tpl.id}.name`
|
||||||
|
const descKey = `agents.templates.${tpl.id}.description`
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
key={tpl.id}
|
||||||
|
className="border-2 border-dashed border-slate-200 rounded-xl p-4 hover:border-primary/30 hover:bg-primary/[0.02] transition-all group"
|
||||||
|
>
|
||||||
|
<div className="flex items-center gap-2.5 mb-2">
|
||||||
|
<div className={`p-1.5 rounded-lg ${typeColors[tpl.type]}`}>
|
||||||
|
<Icon className="w-4 h-4" />
|
||||||
|
</div>
|
||||||
|
<h4 className="font-medium text-sm text-slate-700">{t(nameKey)}</h4>
|
||||||
|
</div>
|
||||||
|
<p className="text-xs text-slate-400 mb-3 line-clamp-2">{t(descKey)}</p>
|
||||||
|
<button
|
||||||
|
onClick={() => handleInstall(tpl)}
|
||||||
|
disabled={isInstalling}
|
||||||
|
className="flex items-center gap-1.5 text-xs font-medium text-primary hover:text-primary/80 transition-colors disabled:opacity-50"
|
||||||
|
>
|
||||||
|
{isInstalling ? (
|
||||||
|
<>
|
||||||
|
<Loader2 className="w-3.5 h-3.5 animate-spin" />
|
||||||
|
{t('agents.templates.installing')}
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<Plus className="w-3.5 h-3.5" />
|
||||||
|
{t('agents.templates.install')}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -85,6 +85,8 @@
|
|||||||
"itemOrMediaRequired": "Please add at least one item or media",
|
"itemOrMediaRequired": "Please add at least one item or media",
|
||||||
"noteCreated": "Note created successfully",
|
"noteCreated": "Note created successfully",
|
||||||
"noteCreateFailed": "Failed to create note",
|
"noteCreateFailed": "Failed to create note",
|
||||||
|
"deleted": "Note deleted",
|
||||||
|
"deleteFailed": "Failed to delete note",
|
||||||
"aiAssistant": "AI Assistant",
|
"aiAssistant": "AI Assistant",
|
||||||
"changeSize": "Change size",
|
"changeSize": "Change size",
|
||||||
"backgroundOptions": "Background options",
|
"backgroundOptions": "Background options",
|
||||||
@@ -143,7 +145,7 @@
|
|||||||
"undoShortcut": "Undo (Ctrl+Z)",
|
"undoShortcut": "Undo (Ctrl+Z)",
|
||||||
"viewCards": "Cards View",
|
"viewCards": "Cards View",
|
||||||
"viewCardsTooltip": "Card grid with drag-and-drop reorder",
|
"viewCardsTooltip": "Card grid with drag-and-drop reorder",
|
||||||
"viewTabs": "Tabs View",
|
"viewTabs": "List View",
|
||||||
"viewTabsTooltip": "Tabs on top, note below — drag tabs to reorder",
|
"viewTabsTooltip": "Tabs on top, note below — drag tabs to reorder",
|
||||||
"viewModeGroup": "Notes display mode",
|
"viewModeGroup": "Notes display mode",
|
||||||
"reorderTabs": "Reorder tab",
|
"reorderTabs": "Reorder tab",
|
||||||
@@ -282,7 +284,9 @@
|
|||||||
"createNewLabel": "Create this new label and add it",
|
"createNewLabel": "Create this new label and add it",
|
||||||
"new": "(new)",
|
"new": "(new)",
|
||||||
"create": "Create",
|
"create": "Create",
|
||||||
"creating": "Creating labels..."
|
"creating": "Creating labels...",
|
||||||
|
"notesCount": "{count} notes",
|
||||||
|
"typeForSuggestions": "Type content to get label suggestions..."
|
||||||
},
|
},
|
||||||
"batchOrganization": {
|
"batchOrganization": {
|
||||||
"title": "Organize with AI",
|
"title": "Organize with AI",
|
||||||
@@ -301,7 +305,8 @@
|
|||||||
},
|
},
|
||||||
"notebookSummary": {
|
"notebookSummary": {
|
||||||
"regenerate": "Regenerate Summary",
|
"regenerate": "Regenerate Summary",
|
||||||
"regenerating": "Regenerating summary..."
|
"regenerating": "Regenerating summary...",
|
||||||
|
"exportPDF": "Export as PDF"
|
||||||
},
|
},
|
||||||
"clarifyDesc": "Make the text clearer and easier to understand",
|
"clarifyDesc": "Make the text clearer and easier to understand",
|
||||||
"shortenDesc": "Summarize the text and get to the point",
|
"shortenDesc": "Summarize the text and get to the point",
|
||||||
@@ -453,7 +458,10 @@
|
|||||||
"myLibrary": "My Library",
|
"myLibrary": "My Library",
|
||||||
"favorites": "Favorites",
|
"favorites": "Favorites",
|
||||||
"recent": "Recent",
|
"recent": "Recent",
|
||||||
"proPlan": "Pro Plan"
|
"proPlan": "Pro Plan",
|
||||||
|
"chat": "AI Chat",
|
||||||
|
"lab": "The Lab",
|
||||||
|
"agents": "Agents"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"title": "Settings",
|
"title": "Settings",
|
||||||
@@ -467,11 +475,15 @@
|
|||||||
"notifications": "Notifications",
|
"notifications": "Notifications",
|
||||||
"language": "Language",
|
"language": "Language",
|
||||||
"selectLanguage": "Select language",
|
"selectLanguage": "Select language",
|
||||||
"privacy": "Privacy",
|
|
||||||
"security": "Security",
|
"security": "Security",
|
||||||
"about": "About",
|
"about": "About",
|
||||||
"version": "Version",
|
"version": "Version",
|
||||||
"settingsSaved": "Settings saved",
|
"settingsSaved": "Settings saved",
|
||||||
|
"cardSizeMode": "Note Size",
|
||||||
|
"cardSizeModeDescription": "Choose between variable sizes or uniform size",
|
||||||
|
"selectCardSizeMode": "Select display mode",
|
||||||
|
"cardSizeVariable": "Variable sizes (small/medium/large)",
|
||||||
|
"cardSizeUniform": "Uniform size",
|
||||||
"settingsError": "Error saving settings",
|
"settingsError": "Error saving settings",
|
||||||
"maintenance": "Maintenance",
|
"maintenance": "Maintenance",
|
||||||
"maintenanceDescription": "Tools to maintain your database health",
|
"maintenanceDescription": "Tools to maintain your database health",
|
||||||
@@ -492,10 +504,7 @@
|
|||||||
"emailNotificationsDesc": "Receive important notifications by email",
|
"emailNotificationsDesc": "Receive important notifications by email",
|
||||||
"desktopNotifications": "Desktop notifications",
|
"desktopNotifications": "Desktop notifications",
|
||||||
"desktopNotificationsDesc": "Receive notifications in your browser",
|
"desktopNotificationsDesc": "Receive notifications in your browser",
|
||||||
"anonymousAnalytics": "Anonymous analytics",
|
"notificationsDesc": "Manage your notification preferences"
|
||||||
"anonymousAnalyticsDesc": "Share anonymous usage data to help improve the app",
|
|
||||||
"notificationsDesc": "Manage your notification preferences",
|
|
||||||
"privacyDesc": "Control your data and privacy"
|
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
"title": "Profile",
|
"title": "Profile",
|
||||||
@@ -652,7 +661,7 @@
|
|||||||
"removingReminder": "Failed to remove reminder"
|
"removingReminder": "Failed to remove reminder"
|
||||||
},
|
},
|
||||||
"notebookSuggestion": {
|
"notebookSuggestion": {
|
||||||
"title": "Move to {icon} {name}?",
|
"title": "Move to {name}?",
|
||||||
"description": "This note seems to belong to this notebook",
|
"description": "This note seems to belong to this notebook",
|
||||||
"move": "Move",
|
"move": "Move",
|
||||||
"dismiss": "Dismiss",
|
"dismiss": "Dismiss",
|
||||||
@@ -663,7 +672,10 @@
|
|||||||
"admin": {
|
"admin": {
|
||||||
"title": "Admin Dashboard",
|
"title": "Admin Dashboard",
|
||||||
"userManagement": "User Management",
|
"userManagement": "User Management",
|
||||||
"aiTesting": "AI Testing",
|
"chat": "AI Chat",
|
||||||
|
"lab": "The Lab",
|
||||||
|
"agents": "Agents",
|
||||||
|
"workspace": "Workspace",
|
||||||
"settings": "Admin Settings",
|
"settings": "Admin Settings",
|
||||||
"security": {
|
"security": {
|
||||||
"title": "Security Settings",
|
"title": "Security Settings",
|
||||||
@@ -680,6 +692,8 @@
|
|||||||
"tagsGenerationDescription": "AI provider for automatic tag suggestions. Recommended: Ollama (free, local).",
|
"tagsGenerationDescription": "AI provider for automatic tag suggestions. Recommended: Ollama (free, local).",
|
||||||
"embeddingsProvider": "Embeddings Provider",
|
"embeddingsProvider": "Embeddings Provider",
|
||||||
"embeddingsDescription": "AI provider for semantic search embeddings. Recommended: OpenAI (best quality).",
|
"embeddingsDescription": "AI provider for semantic search embeddings. Recommended: OpenAI (best quality).",
|
||||||
|
"chatProvider": "Chat Provider",
|
||||||
|
"chatDescription": "AI provider for the chat assistant. Falls back to Tags provider if not configured.",
|
||||||
"provider": "Provider",
|
"provider": "Provider",
|
||||||
"baseUrl": "Base URL",
|
"baseUrl": "Base URL",
|
||||||
"model": "Model",
|
"model": "Model",
|
||||||
@@ -704,9 +718,25 @@
|
|||||||
"bestQuality": "Best quality",
|
"bestQuality": "Best quality",
|
||||||
"saved": "(Saved)"
|
"saved": "(Saved)"
|
||||||
},
|
},
|
||||||
|
"resend": {
|
||||||
|
"title": "Resend (Recommended)",
|
||||||
|
"description": "Send emails via Resend API. Takes priority over SMTP if configured.",
|
||||||
|
"apiKey": "Resend API Key",
|
||||||
|
"apiKeyHint": "Get your API key from resend.com. Used for agent notifications and password resets.",
|
||||||
|
"saveSettings": "Save Resend Settings",
|
||||||
|
"updateSuccess": "Resend settings updated",
|
||||||
|
"updateFailed": "Failed to update Resend settings",
|
||||||
|
"configured": "Resend is configured and active"
|
||||||
|
},
|
||||||
|
"email": {
|
||||||
|
"title": "Email Configuration",
|
||||||
|
"description": "Configure email delivery for agent notifications and password resets.",
|
||||||
|
"provider": "Email Provider",
|
||||||
|
"saveSettings": "Save Email Settings"
|
||||||
|
},
|
||||||
"smtp": {
|
"smtp": {
|
||||||
"title": "SMTP Configuration",
|
"title": "SMTP Configuration",
|
||||||
"description": "Configure email server for password resets.",
|
"description": "Configure email server for password resets. Fallback if Resend is not configured.",
|
||||||
"host": "Host",
|
"host": "Host",
|
||||||
"port": "Port",
|
"port": "Port",
|
||||||
"username": "Username",
|
"username": "Username",
|
||||||
@@ -794,16 +824,35 @@
|
|||||||
"dashboard": "Dashboard",
|
"dashboard": "Dashboard",
|
||||||
"users": "Users",
|
"users": "Users",
|
||||||
"aiManagement": "AI Management",
|
"aiManagement": "AI Management",
|
||||||
|
"chat": "AI Chat",
|
||||||
|
"lab": "The Lab (Ideas)",
|
||||||
|
"agents": "Agents",
|
||||||
"settings": "Settings"
|
"settings": "Settings"
|
||||||
},
|
},
|
||||||
"metrics": {
|
"metrics": {
|
||||||
"vsLastPeriod": "vs last period"
|
"vsLastPeriod": "vs last period"
|
||||||
|
},
|
||||||
|
"tools": {
|
||||||
|
"title": "Agent Tools",
|
||||||
|
"description": "Configure external tools for agent tool-use: web search, web scraping, and API access.",
|
||||||
|
"searchProvider": "Web Search Provider",
|
||||||
|
"searxng": "SearXNG (Self-hosted)",
|
||||||
|
"brave": "Brave Search API",
|
||||||
|
"both": "Both (SearXNG primary, Brave fallback)",
|
||||||
|
"searxngUrl": "SearXNG URL",
|
||||||
|
"braveKey": "Brave Search API Key",
|
||||||
|
"jinaKey": "Jina Reader API Key",
|
||||||
|
"jinaKeyOptional": "Optional — works without but with rate limits",
|
||||||
|
"jinaKeyDescription": "Used for web scraping. Works without a key but with rate limits.",
|
||||||
|
"saveSettings": "Save Tools Settings",
|
||||||
|
"updateSuccess": "Tools settings updated successfully",
|
||||||
|
"updateFailed": "Failed to update tools settings"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"about": {
|
"about": {
|
||||||
"title": "About",
|
"title": "About",
|
||||||
"description": "Information about the application",
|
"description": "Information about the application",
|
||||||
"appName": "Keep Notes",
|
"appName": "Memento",
|
||||||
"appDescription": "A powerful note-taking application with AI-powered features",
|
"appDescription": "A powerful note-taking application with AI-powered features",
|
||||||
"version": "Version",
|
"version": "Version",
|
||||||
"buildDate": "Build Date",
|
"buildDate": "Build Date",
|
||||||
@@ -980,8 +1029,17 @@
|
|||||||
"trash": {
|
"trash": {
|
||||||
"title": "Trash",
|
"title": "Trash",
|
||||||
"empty": "The trash is empty",
|
"empty": "The trash is empty",
|
||||||
|
"emptyDescription": "Deleted notes will appear here",
|
||||||
"restore": "Restore",
|
"restore": "Restore",
|
||||||
"deletePermanently": "Delete Permanently"
|
"deletePermanently": "Delete Permanently",
|
||||||
|
"noteTrashed": "Note moved to trash",
|
||||||
|
"noteRestored": "Note restored",
|
||||||
|
"notePermanentlyDeleted": "Note permanently deleted",
|
||||||
|
"emptyTrash": "Empty Trash",
|
||||||
|
"emptyTrashConfirm": "Permanently delete all notes in the trash?",
|
||||||
|
"emptyTrashSuccess": "Trash emptied",
|
||||||
|
"permanentDelete": "Delete Permanently",
|
||||||
|
"permanentDeleteConfirm": "This note will be permanently deleted. This action cannot be undone."
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"privacy": "Privacy",
|
"privacy": "Privacy",
|
||||||
@@ -1066,7 +1124,7 @@
|
|||||||
"description": "Manage API keys and configure external tools",
|
"description": "Manage API keys and configure external tools",
|
||||||
"whatIsMcp": {
|
"whatIsMcp": {
|
||||||
"title": "What is MCP?",
|
"title": "What is MCP?",
|
||||||
"description": "The Model Context Protocol (MCP) is an open protocol that enables AI models to securely interact with external tools and data sources. With MCP, you can connect tools like Claude Code, Cursor, or N8N to your Keep Notes instance to read, create, and organize your notes programmatically.",
|
"description": "The Model Context Protocol (MCP) is an open protocol that enables AI models to securely interact with external tools and data sources. With MCP, you can connect tools like Claude Code, Cursor, or N8N to your Memento instance to read, create, and organize your notes programmatically.",
|
||||||
"learnMore": "Learn more about MCP"
|
"learnMore": "Learn more about MCP"
|
||||||
},
|
},
|
||||||
"serverStatus": {
|
"serverStatus": {
|
||||||
@@ -1120,5 +1178,221 @@
|
|||||||
"description": "Use these credentials in your N8N MCP node:"
|
"description": "Use these credentials in your N8N MCP node:"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"agents": {
|
||||||
|
"title": "Agents",
|
||||||
|
"subtitle": "Automate your monitoring and research tasks",
|
||||||
|
"newAgent": "New Agent",
|
||||||
|
"myAgents": "My Agents",
|
||||||
|
"searchPlaceholder": "Search agents...",
|
||||||
|
"filterAll": "All",
|
||||||
|
"newBadge": "New",
|
||||||
|
"noResults": "No agents match your search.",
|
||||||
|
"noAgents": "No agents",
|
||||||
|
"noAgentsDescription": "Create your first agent or install a template below to automate your monitoring tasks.",
|
||||||
|
"types": {
|
||||||
|
"scraper": "Monitor",
|
||||||
|
"researcher": "Researcher",
|
||||||
|
"monitor": "Observer",
|
||||||
|
"custom": "Custom"
|
||||||
|
},
|
||||||
|
"typeDescriptions": {
|
||||||
|
"scraper": "Scrapes multiple sites and creates a summary",
|
||||||
|
"researcher": "Searches for information on a topic",
|
||||||
|
"monitor": "Watches a notebook and analyzes notes",
|
||||||
|
"custom": "Free agent with your own prompt"
|
||||||
|
},
|
||||||
|
"form": {
|
||||||
|
"agentType": "Agent type",
|
||||||
|
"name": "Name",
|
||||||
|
"namePlaceholder": "e.g. Tuesday AI Watch",
|
||||||
|
"description": "Description (optional)",
|
||||||
|
"descriptionPlaceholder": "Weekly AI news summary",
|
||||||
|
"urlsLabel": "URLs to scrape",
|
||||||
|
"urlsOptional": "(optional)",
|
||||||
|
"sourceNotebook": "Notebook to watch",
|
||||||
|
"selectNotebook": "Select a notebook...",
|
||||||
|
"targetNotebook": "Target notebook",
|
||||||
|
"inbox": "Inbox",
|
||||||
|
"instructions": "AI Instructions",
|
||||||
|
"instructionsPlaceholder": "Describe the agent's behavior...",
|
||||||
|
"frequency": "Frequency",
|
||||||
|
"cancel": "Cancel",
|
||||||
|
"saving": "Saving...",
|
||||||
|
"save": "Save",
|
||||||
|
"create": "Create agent",
|
||||||
|
"editTitle": "Edit agent",
|
||||||
|
"createTitle": "New agent",
|
||||||
|
"nameRequired": "Name is required",
|
||||||
|
"addUrl": "Add URL",
|
||||||
|
"advancedMode": "Advanced mode",
|
||||||
|
"instructionsHint": "replaces automatic prompt",
|
||||||
|
"researchTopic": "Research topic",
|
||||||
|
"researchTopicPlaceholder": "e.g. Latest advances in quantum computing",
|
||||||
|
"notifyEmail": "Email notification",
|
||||||
|
"notifyEmailHint": "Receive an email with the agent's results after each run"
|
||||||
|
},
|
||||||
|
"frequencies": {
|
||||||
|
"manual": "Manual",
|
||||||
|
"hourly": "Hourly",
|
||||||
|
"daily": "Daily",
|
||||||
|
"weekly": "Weekly",
|
||||||
|
"monthly": "Monthly"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"success": "Succeeded",
|
||||||
|
"failure": "Failed",
|
||||||
|
"running": "Running",
|
||||||
|
"pending": "Pending"
|
||||||
|
},
|
||||||
|
"actions": {
|
||||||
|
"edit": "Edit",
|
||||||
|
"run": "Run",
|
||||||
|
"delete": "Delete",
|
||||||
|
"deleteConfirm": "Delete agent \"{name}\"?",
|
||||||
|
"toggleOn": "Agent enabled",
|
||||||
|
"toggleOff": "Agent disabled"
|
||||||
|
},
|
||||||
|
"toasts": {
|
||||||
|
"created": "Agent created",
|
||||||
|
"updated": "Agent updated",
|
||||||
|
"deleted": "\"{name}\" deleted",
|
||||||
|
"deleteError": "Error deleting",
|
||||||
|
"runSuccess": "\"{name}\" executed successfully",
|
||||||
|
"runError": "Error: {error}",
|
||||||
|
"runFailed": "Execution failed",
|
||||||
|
"runGenericError": "Error during execution",
|
||||||
|
"toggleError": "Error toggling agent",
|
||||||
|
"installSuccess": "\"{name}\" installed",
|
||||||
|
"installError": "Error during installation",
|
||||||
|
"saveError": "Error saving"
|
||||||
|
},
|
||||||
|
"templates": {
|
||||||
|
"title": "Templates",
|
||||||
|
"install": "Install",
|
||||||
|
"installing": "Installing...",
|
||||||
|
"veilleAI": {
|
||||||
|
"name": "AI Watch",
|
||||||
|
"description": "Scrapes RSS feeds from 6 AI sites (The Verge, TechCrunch, Ars Technica, MIT Tech Review, WIRED, Korben) and generates a weekly summary."
|
||||||
|
},
|
||||||
|
"veilleTech": {
|
||||||
|
"name": "Tech Watch",
|
||||||
|
"description": "Scrapes tech RSS feeds (Hacker News, DEV, Product Hunt) and creates a daily news summary."
|
||||||
|
},
|
||||||
|
"veilleDev": {
|
||||||
|
"name": "Dev Watch",
|
||||||
|
"description": "Scrapes dev RSS feeds (JavaScript, TypeScript, React) and summarizes new tech and frameworks."
|
||||||
|
},
|
||||||
|
"surveillant": {
|
||||||
|
"name": "Note Observer",
|
||||||
|
"description": "Analyzes recent notes from a notebook and suggests complements, references and links."
|
||||||
|
},
|
||||||
|
"chercheur": {
|
||||||
|
"name": "Topic Researcher",
|
||||||
|
"description": "Searches for in-depth information on a topic and creates a structured note with references."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runLog": {
|
||||||
|
"title": "History",
|
||||||
|
"noHistory": "No executions yet",
|
||||||
|
"toolTrace": "{count} tool calls",
|
||||||
|
"step": "Step {num}"
|
||||||
|
},
|
||||||
|
"tools": {
|
||||||
|
"title": "Agent Tools",
|
||||||
|
"webSearch": "Web Search",
|
||||||
|
"webScrape": "Web Scrape",
|
||||||
|
"noteSearch": "Note Search",
|
||||||
|
"noteRead": "Read Note",
|
||||||
|
"noteCreate": "Create Note",
|
||||||
|
"urlFetch": "Fetch URL",
|
||||||
|
"memorySearch": "Memory",
|
||||||
|
"configNeeded": "config",
|
||||||
|
"selected": "{count} selected",
|
||||||
|
"maxSteps": "Max iterations"
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"executions": "{count} exec."
|
||||||
|
},
|
||||||
|
"defaultRoles": {
|
||||||
|
"scraper": "You are a monitoring assistant. Your role is to synthesize articles from different websites into a clear, structured and useful summary. Use section headings, bullet points and concise sentences.",
|
||||||
|
"researcher": "You are a rigorous researcher. For the requested topic, produce a research note with: context, key points, debates, references.",
|
||||||
|
"monitor": "You are an analytical assistant. Your role is to analyze provided notes and for each detected theme, suggest: leads to explore, references or articles to read, connections between notes.",
|
||||||
|
"custom": "You are a helpful assistant."
|
||||||
|
},
|
||||||
|
"help": {
|
||||||
|
"title": "Agents Guide",
|
||||||
|
"btnLabel": "Help",
|
||||||
|
"close": "Close",
|
||||||
|
"whatIsAgent": "What is an agent?",
|
||||||
|
"whatIsAgentContent": "An **agent** is an AI assistant that runs automatically to perform tasks for you. It has access to **tools** (web search, web scraping, note reading...) and produces a **note** with its results.\n\nThink of it as a small autonomous worker: you give it a mission, it researches or scrapes information, then writes a structured note you can read later.\n\nAgents respond in your language (French or English) based on your settings.",
|
||||||
|
"howToUse": "How to use an agent?",
|
||||||
|
"howToUseContent": "1. Click **\"New Agent\"** (or start from a **Template** at the bottom of the page)\n2. Choose an **agent type** (Researcher, Monitor, Observer, Custom)\n3. Give it a **name** and fill in the type-specific fields\n4. Optionally pick a **target notebook** where results will be saved\n5. Choose a **frequency** (Manual = you trigger it yourself)\n6. Click **Create**, then hit the **Run** button on the agent card\n7. Once finished, a new note appears in your target notebook",
|
||||||
|
"types": "Agent types",
|
||||||
|
"typesContent": "### Researcher\nSearches the web on a **topic you define** and creates a structured note with sources and references.\n\n- **Fields:** name, research topic (e.g. \"Latest advances in quantum computing\")\n- **Default tools:** web search, web scraping, note search, note creation\n- **Requirements:** a web search provider must be configured (SearXNG or Brave Search)\n\n### Monitor (Scraper)\nScrapes a **list of URLs** you specify and produces a summary of their content.\n\n- **Fields:** name, list of URLs (websites or RSS feeds)\n- **Default tools:** web scraping, note creation\n- **RSS tip:** Use RSS feed URLs (e.g. `site.com/feed`) to automatically scrape individual articles instead of listing pages\n- **Use case:** weekly tech watch, competitor monitoring, blog roundups\n\n### Observer (Notebook Monitor)\nReads notes from a **notebook you select** and produces analysis, connections, and suggestions.\n\n- **Fields:** name, source notebook (the one to analyze)\n- **Default tools:** note search, note read, note creation\n- **Use case:** find connections between your notes, get reading suggestions, detect recurring themes\n\n### Custom\nA blank canvas: you write your own **prompt** and pick your own **tools**.\n\n- **Fields:** name, description, custom instructions (in Advanced mode)\n- **No default tools** — you choose exactly what the agent needs\n- **Use case:** anything creative or specific that doesn't fit the other types",
|
||||||
|
"advanced": "Advanced mode (AI Instructions, Max iterations)",
|
||||||
|
"advancedContent": "Click **\"Advanced mode\"** at the bottom of the form to access additional settings.\n\n### AI Instructions\n\nThis field lets you **replace the default system prompt** for the agent. If left empty, the agent uses an automatic prompt adapted to its type.\n\n**Why use it?** You want to control exactly how the agent behaves. For example:\n- \"Write the summary in English, even if sources are in French\"\n- \"Structure the note with sections: Context, Key Points, Personal Opinion\"\n- \"Ignore articles older than 30 days and focus on recent news\"\n- \"For each detected theme, suggest 3 follow-up leads with links\"\n\n> **Note:** Your instructions replace the defaults, they don't add to them.\n\n### Max iterations\n\nThis is the **maximum number of cycles** the agent can perform. One cycle = the agent thinks, calls a tool, reads the result, then decides the next action.\n\n- **3-5 iterations:** for simple tasks (scraping a single page)\n- **10 iterations (default):** good balance for most cases\n- **15-25 iterations:** for deep research where the agent needs to explore multiple leads\n\n> **Warning:** More iterations = more time and potentially higher API costs.",
|
||||||
|
"tools": "Available tools (full details)",
|
||||||
|
"toolsContent": "When advanced mode is enabled, you can choose exactly which tools the agent can use.\n\n### Web Search\nAllows the agent to **search the internet** via SearXNG or Brave Search.\n\n- **What it does:** The agent formulates a query, gets search results, and can then scrape the most relevant pages.\n- **When to enable:** When the agent needs to find information on a topic (Researcher or Custom type).\n- **Configuration required:** SearXNG (with JSON format enabled) or a Brave Search API key. Configurable in **Admin > Agent Tools**.\n- **Example:** The agent searches \"React Server Components best practices 2025\", gets 10 results, then scrapes the top 3.\n\n### Web Scrape\nAllows the agent to **extract text content from a web page** given its URL.\n\n- **What it does:** The agent visits a URL and retrieves the structured text (headings, paragraphs, lists). Ads, menus and footers are typically filtered out.\n- **RSS/Atom support:** If the URL is an RSS feed, the tool automatically detects it, parses the feed and scrapes the 5 latest articles individually. Use RSS feed URLs for much richer content than listing pages.\n- **When to enable:** For the Monitor type (mandatory), or any agent that needs to read web pages.\n- **Configuration:** Works out of the box, but a **Jina Reader API key** improves quality and removes rate limits. Configurable in **Admin > Agent Tools**.\n- **Example:** The agent scrapes the RSS feed at `techcrunch.com/feed/` and gets the 5 latest full articles.\n\n### Note Search\nAllows the agent to **search your existing notes**.\n\n- **What it does:** The agent performs a text search across all your notes (or a specific notebook).\n- **When to enable:** For Observer-type agents, or any agent that needs to cross-reference information with your notes.\n- **Configuration:** None — works immediately.\n- **Example:** The agent searches all notes containing \"machine learning\" to see what you've already written on the topic.\n\n### Read Note\nAllows the agent to **read the full content of a specific note**.\n\n- **What it does:** After finding a note (via Note Search), the agent can read its entire content to analyze or use it.\n- **When to enable:** As a companion to Note Search. Enable both together so the agent can search AND read.\n- **Configuration:** None.\n- **Example:** The agent finds 5 notes about \"productivity\", reads them all, and writes a synthesis.\n\n### Create Note\nAllows the agent to **write a new note** in your target notebook.\n\n- **What it does:** The agent creates a note with a title and content. This is how results end up in your notebooks.\n- **When to enable:** Almost always — without this tool, the agent cannot save its results. **Leave it enabled by default.**\n- **Configuration:** None.\n- **Example:** The agent creates a note \"Tech Watch - Week 16\" with a summary of 5 articles.\n\n### Fetch URL\nAllows the agent to **download the raw content of a URL** (HTML, JSON, text...).\n\n- **What it does:** Unlike scraping which extracts clean text, Fetch URL retrieves raw content. Useful for APIs, JSON files, or non-standard pages.\n- **When to enable:** When the agent needs to query REST APIs, read RSS feeds, or access raw data.\n- **Configuration:** None.\n- **Example:** The agent queries the GitHub API to list the latest commits of a project.\n\n### Memory\nAllows the agent to **access its previous execution history**.\n\n- **What it does:** The agent can search through results from past runs. This lets it compare, track changes, or avoid repeating the same information.\n- **When to enable:** For agents that run regularly and need to maintain continuity between executions.\n- **Configuration:** None.\n- **Example:** The agent compares this week's news with last week's and highlights what's new.",
|
||||||
|
"frequency": "Frequency & scheduling",
|
||||||
|
"frequencyContent": "| Frequency | Behavior\n|-----------|----------\n| **Manual** | You click \"Run\" yourself — no automatic scheduling\n| **Hourly** | Runs every hour\n| **Daily** | Runs once per day\n| **Weekly** | Runs once per week\n| **Monthly** | Runs once per month\n\n> **Tip:** Start with \"Manual\" to test your agent, then switch to an automatic frequency once you're satisfied with the results.",
|
||||||
|
"targetNotebook": "Target notebook",
|
||||||
|
"targetNotebookContent": "When an agent finishes its task, it **creates a note**. The **target notebook** determines where that note goes:\n\n- **Inbox** (default) — the note goes to your general notes\n- **Specific notebook** — choose a notebook to keep agent results organized\n\n> **Tip:** Create a dedicated notebook like \"Agent Reports\" to keep all automated content in one place.",
|
||||||
|
"templates": "Templates",
|
||||||
|
"templatesContent": "Templates are pre-configured agents ready to install in one click. You'll find them at the **bottom of the Agents page**.\n\nAvailable templates:\n\n- **AI Watch** — weekly roundup via RSS feeds from 6 AI sites (The Verge, TechCrunch, Ars Technica, MIT Tech Review, WIRED, Korben)\n- **Tech Watch** — daily summary via RSS feeds from Hacker News, DEV Community, Product Hunt\n- **Dev Watch** — developer news via RSS feeds from DEV (JavaScript, TypeScript, React)\n- **Note Observer** — analyzes a notebook and suggests connections\n- **Topic Researcher** — deep research on a specific topic\n\nTemplates come with the right tools pre-configured. You can customize them after installation.",
|
||||||
|
"tips": "Tips & troubleshooting",
|
||||||
|
"tipsContent": "- **Start with a template** and customize it — it's the fastest way to get a working agent\n- **Test with \"Manual\"** frequency before enabling automatic scheduling\n- **Use RSS feed URLs** instead of listing pages for much richer content (e.g. `techcrunch.com/feed/` instead of `techcrunch.com/category/ai/`)\n- **A \"Researcher\" agent requires a web search provider** — configure SearXNG (JSON format) or Brave Search in **Admin > Agent Tools**\n- **If an agent fails**, click on its card then **History** to see the execution log and tool traces\n- **The \"Enabled/Disabled\" toggle** lets you pause an agent without deleting it\n- **Web scraping quality** improves with a Jina Reader API key (optional, in Admin > Agent Tools)\n- **Combine \"Note Search\" + \"Read Note\"** so the agent can find AND analyze your notes' content\n- **Enable \"Memory\"** if your agent runs regularly — it will avoid repeating the same information across runs\n- **Agents respond in your language** — switch between French and English in settings",
|
||||||
|
"tooltips": {
|
||||||
|
"agentType": "Choose the type of task the agent will perform. Each type has different capabilities and fields.",
|
||||||
|
"researchTopic": "The subject the agent will research on the web. Be specific for better results.",
|
||||||
|
"description": "A short description of what this agent does. Helps you remember its purpose.",
|
||||||
|
"urls": "List of URLs to scrape. Supports RSS feeds — use feed URLs for richer content (e.g. site.com/feed).",
|
||||||
|
"sourceNotebook": "The notebook the agent will analyze. It reads notes from this notebook to find connections and themes.",
|
||||||
|
"targetNotebook": "Where the agent's result note will be saved. Choose Inbox or a specific notebook.",
|
||||||
|
"frequency": "How often the agent runs automatically. Start with Manual to test.",
|
||||||
|
"instructions": "Custom instructions that replace the default AI prompt. Leave empty to use the automatic prompt.",
|
||||||
|
"tools": "Select which tools the agent can use. Each tool gives the agent a specific capability.",
|
||||||
|
"maxSteps": "Maximum number of reasoning cycles. More steps = deeper analysis but takes longer."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"chat": {
|
||||||
|
"title": "AI Chat",
|
||||||
|
"subtitle": "Chat with your notes and AI agents",
|
||||||
|
"newConversation": "New conversation",
|
||||||
|
"noHistory": "No history",
|
||||||
|
"untitled": "Untitled conversation",
|
||||||
|
"deleteConfirm": "Delete this conversation?",
|
||||||
|
"yes": "Yes",
|
||||||
|
"placeholder": "Send a message to the assistant...",
|
||||||
|
"allNotebooks": "All notebooks",
|
||||||
|
"inAllNotebooks": "In all notebooks",
|
||||||
|
"active": "ACTIVE",
|
||||||
|
"disclaimer": "AI can make mistakes. Verify important information.",
|
||||||
|
"assistantError": "Assistant error",
|
||||||
|
"loadError": "Error loading conversation",
|
||||||
|
"createError": "Error creating conversation",
|
||||||
|
"deleteError": "Error deleting",
|
||||||
|
"renamed": "Conversation renamed",
|
||||||
|
"renameError": "Error renaming",
|
||||||
|
"welcome": "I'm here to help you synthesize your notes, generate new ideas, or discuss your notebooks.",
|
||||||
|
"searching": "Searching..."
|
||||||
|
},
|
||||||
|
"labHeader": {
|
||||||
|
"title": "The Lab",
|
||||||
|
"live": "Live",
|
||||||
|
"currentProject": "Current Project",
|
||||||
|
"choose": "Choose...",
|
||||||
|
"yourSpaces": "Your Spaces",
|
||||||
|
"updated": "Updated",
|
||||||
|
"newSpace": "New Thought Space",
|
||||||
|
"new": "New",
|
||||||
|
"renamed": "Space renamed",
|
||||||
|
"renameError": "Error renaming",
|
||||||
|
"created": "New space created",
|
||||||
|
"createFailed": "Creation failed",
|
||||||
|
"deleteSpace": "Delete space",
|
||||||
|
"deleted": "Space deleted",
|
||||||
|
"deleteError": "Error deleting"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"about": {
|
"about": {
|
||||||
"appDescription": "Une application de prise de notes puissante avec des fonctionnalités IA",
|
"appDescription": "Une application de prise de notes puissante avec des fonctionnalités IA",
|
||||||
"appName": "Keep Notes",
|
"appName": "Memento",
|
||||||
"buildDate": "Date de build",
|
"buildDate": "Date de build",
|
||||||
"description": "Informations sur l'application",
|
"description": "Informations sur l'application",
|
||||||
"features": {
|
"features": {
|
||||||
@@ -48,6 +48,8 @@
|
|||||||
"description": "Configurez les fournisseurs IA pour l'étiquetage auto et la recherche sémantique. Utilisez différents fournisseurs pour des performances optimales.",
|
"description": "Configurez les fournisseurs IA pour l'étiquetage auto et la recherche sémantique. Utilisez différents fournisseurs pour des performances optimales.",
|
||||||
"embeddingsDescription": "Fournisseur IA pour la recherche sémantique. Recommandé : OpenAI (meilleure qualité).",
|
"embeddingsDescription": "Fournisseur IA pour la recherche sémantique. Recommandé : OpenAI (meilleure qualité).",
|
||||||
"embeddingsProvider": "Fournisseur d'embeddings",
|
"embeddingsProvider": "Fournisseur d'embeddings",
|
||||||
|
"chatProvider": "Fournisseur de chat",
|
||||||
|
"chatDescription": "Fournisseur IA pour l'assistant chat. Utilise le fournisseur d'étiquettes si non configuré.",
|
||||||
"model": "Modèle",
|
"model": "Modèle",
|
||||||
"modelRecommendations": "gpt-4o-mini = Meilleur rapport qualité/prix • gpt-4o = Meilleure qualité",
|
"modelRecommendations": "gpt-4o-mini = Meilleur rapport qualité/prix • gpt-4o = Meilleure qualité",
|
||||||
"openAIKeyDescription": "Votre clé API OpenAI depuis platform.openai.com",
|
"openAIKeyDescription": "Votre clé API OpenAI depuis platform.openai.com",
|
||||||
@@ -114,12 +116,30 @@
|
|||||||
"dashboard": "Tableau de bord",
|
"dashboard": "Tableau de bord",
|
||||||
"users": "Utilisateurs",
|
"users": "Utilisateurs",
|
||||||
"aiManagement": "Gestion IA",
|
"aiManagement": "Gestion IA",
|
||||||
|
"chat": "Chat IA",
|
||||||
|
"lab": "Le Lab (Idées)",
|
||||||
|
"agents": "Agents",
|
||||||
"settings": "Paramètres"
|
"settings": "Paramètres"
|
||||||
},
|
},
|
||||||
"metrics": {
|
"metrics": {
|
||||||
"vsLastPeriod": "vs période précédente"
|
"vsLastPeriod": "vs période précédente"
|
||||||
},
|
},
|
||||||
"aiTesting": "Test IA",
|
"tools": {
|
||||||
|
"title": "Outils Agents",
|
||||||
|
"description": "Configurer les outils externes pour le tool-use des agents : recherche web, scraping et accès API.",
|
||||||
|
"searchProvider": "Fournisseur de recherche web",
|
||||||
|
"searxng": "SearXNG (Auto-hébergé)",
|
||||||
|
"brave": "Brave Search API",
|
||||||
|
"both": "Les deux (SearXNG principal, Brave secours)",
|
||||||
|
"searxngUrl": "URL SearXNG",
|
||||||
|
"braveKey": "Clé API Brave Search",
|
||||||
|
"jinaKey": "Clé API Jina Reader",
|
||||||
|
"jinaKeyOptional": "Optionnel — fonctionne sans mais avec des limites",
|
||||||
|
"jinaKeyDescription": "Utilisée pour le scraping web. Fonctionne sans clé mais avec des limites de débit.",
|
||||||
|
"saveSettings": "Enregistrer les paramètres outils",
|
||||||
|
"updateSuccess": "Paramètres outils mis à jour avec succès",
|
||||||
|
"updateFailed": "Échec de la mise à jour des paramètres outils"
|
||||||
|
},
|
||||||
"security": {
|
"security": {
|
||||||
"allowPublicRegistration": "Autoriser l'inscription publique",
|
"allowPublicRegistration": "Autoriser l'inscription publique",
|
||||||
"allowPublicRegistrationDescription": "Si désactivé, les nouveaux utilisateurs ne peuvent être ajoutés que par un administrateur via la page de gestion des utilisateurs.",
|
"allowPublicRegistrationDescription": "Si désactivé, les nouveaux utilisateurs ne peuvent être ajoutés que par un administrateur via la page de gestion des utilisateurs.",
|
||||||
@@ -129,8 +149,24 @@
|
|||||||
"updateSuccess": "Paramètres de sécurité mis à jour"
|
"updateSuccess": "Paramètres de sécurité mis à jour"
|
||||||
},
|
},
|
||||||
"settings": "Paramètres administrateur",
|
"settings": "Paramètres administrateur",
|
||||||
|
"resend": {
|
||||||
|
"title": "Resend (Recommandé)",
|
||||||
|
"description": "Envoyez des emails via l'API Resend. Prioritaire sur SMTP si configuré.",
|
||||||
|
"apiKey": "Clé API Resend",
|
||||||
|
"apiKeyHint": "Obtenez votre clé API sur resend.com. Utilisée pour les notifications d'agents et les réinitialisations de mot de passe.",
|
||||||
|
"saveSettings": "Enregistrer les paramètres Resend",
|
||||||
|
"updateSuccess": "Paramètres Resend mis à jour",
|
||||||
|
"updateFailed": "Échec de la mise à jour des paramètres Resend",
|
||||||
|
"configured": "Resend est configuré et actif"
|
||||||
|
},
|
||||||
|
"email": {
|
||||||
|
"title": "Configuration Email",
|
||||||
|
"description": "Configurez l'envoi d'emails pour les notifications d'agents et les réinitialisations de mot de passe.",
|
||||||
|
"provider": "Fournisseur Email",
|
||||||
|
"saveSettings": "Enregistrer les paramètres"
|
||||||
|
},
|
||||||
"smtp": {
|
"smtp": {
|
||||||
"description": "Configurez le serveur email pour les réinitialisations de mot de passe.",
|
"description": "Configurez le serveur email pour les réinitialisations de mot de passe. Utilisé si Resend n'est pas configuré.",
|
||||||
"forceSSL": "Forcer SSL/TLS (généralement pour le port 465)",
|
"forceSSL": "Forcer SSL/TLS (généralement pour le port 465)",
|
||||||
"fromEmail": "Email d'expédition",
|
"fromEmail": "Email d'expédition",
|
||||||
"host": "Hôte",
|
"host": "Hôte",
|
||||||
@@ -329,38 +365,10 @@
|
|||||||
"signOut": "Déconnexion",
|
"signOut": "Déconnexion",
|
||||||
"signUp": "S'inscrire"
|
"signUp": "S'inscrire"
|
||||||
},
|
},
|
||||||
"autoLabels": {
|
|
||||||
"analyzing": "Analyse de vos notes...",
|
|
||||||
"createNewLabel": "Créer cette nouvelle étiquette et l'ajouter",
|
|
||||||
"created": "{count} étiquettes créées avec succès",
|
|
||||||
"description": "J'ai détecté des thèmes récurrents dans \"{notebookName}\" ({totalNotes} notes). Créer des étiquettes pour eux ?",
|
|
||||||
"error": "Échec de la récupération des suggestions d'étiquettes",
|
|
||||||
"new": "(nouveau)",
|
|
||||||
"noLabelsSelected": "Aucune étiquette sélectionnée",
|
|
||||||
"note": "note",
|
|
||||||
"notes": "notes",
|
|
||||||
"title": "Nouvelles suggestions d'étiquettes",
|
|
||||||
"typeContent": "Tapez du contenu pour obtenir des suggestions d'étiquettes..."
|
|
||||||
},
|
|
||||||
"batch": {
|
"batch": {
|
||||||
"organize": "Organiser",
|
"organize": "Organiser",
|
||||||
"organizeWithAI": "Organiser avec l'IA"
|
"organizeWithAI": "Organiser avec l'IA"
|
||||||
},
|
},
|
||||||
"batchOrganization": {
|
|
||||||
"analyzing": "Analyse de vos notes...",
|
|
||||||
"apply": "Appliquer ({count})",
|
|
||||||
"applying": "Application...",
|
|
||||||
"confidence": "confiance",
|
|
||||||
"description": "L'IA analysera vos notes et suggérera de les organiser dans des carnets.",
|
|
||||||
"error": "Échec de la création du plan d'organisation",
|
|
||||||
"noNotebooks": "Aucun carnet disponible. Créez d'abord des carnets pour organiser vos notes.",
|
|
||||||
"noNotesSelected": "Aucune note sélectionnée",
|
|
||||||
"noSuggestions": "L'IA n'a pas trouvé de bonne manière d'organiser ces notes.",
|
|
||||||
"notesToOrganize": "{count} notes à organiser",
|
|
||||||
"selected": "{count} sélectionné",
|
|
||||||
"title": "Organiser avec l'IA",
|
|
||||||
"unorganized": "{count} notes n'ont pas pu être catégorisées et resteront dans les Notes générales."
|
|
||||||
},
|
|
||||||
"collaboration": {
|
"collaboration": {
|
||||||
"accessRevoked": "L'accès a été révoqué",
|
"accessRevoked": "L'accès a été révoqué",
|
||||||
"addCollaborator": "Ajouter un collaborateur",
|
"addCollaborator": "Ajouter un collaborateur",
|
||||||
@@ -693,6 +701,9 @@
|
|||||||
"supportDevelopment": "Supporter le développement de Memento ☕",
|
"supportDevelopment": "Supporter le développement de Memento ☕",
|
||||||
"trash": "Corbeille",
|
"trash": "Corbeille",
|
||||||
"userManagement": "Gestion des utilisateurs",
|
"userManagement": "Gestion des utilisateurs",
|
||||||
|
"chat": "Chat IA",
|
||||||
|
"lab": "Le Lab",
|
||||||
|
"agents": "Agents",
|
||||||
"workspace": "Espace de travail"
|
"workspace": "Espace de travail"
|
||||||
},
|
},
|
||||||
"notebook": {
|
"notebook": {
|
||||||
@@ -732,7 +743,7 @@
|
|||||||
"generalNotes": "Notes générales",
|
"generalNotes": "Notes générales",
|
||||||
"move": "Déplacer",
|
"move": "Déplacer",
|
||||||
"moveToNotebook": "Déplacer vers un carnet",
|
"moveToNotebook": "Déplacer vers un carnet",
|
||||||
"title": "Déplacer vers {icon} {name} ?"
|
"title": "Déplacer vers {name} ?"
|
||||||
},
|
},
|
||||||
"notebooks": {
|
"notebooks": {
|
||||||
"allNotebooks": "Tous les carnets",
|
"allNotebooks": "Tous les carnets",
|
||||||
@@ -800,6 +811,8 @@
|
|||||||
"noNotesFound": "Aucune note trouvée",
|
"noNotesFound": "Aucune note trouvée",
|
||||||
"noteCreateFailed": "Échec de la création de la note",
|
"noteCreateFailed": "Échec de la création de la note",
|
||||||
"noteCreated": "Note créée avec succès",
|
"noteCreated": "Note créée avec succès",
|
||||||
|
"deleted": "Note supprimée",
|
||||||
|
"deleteFailed": "Échec de la suppression de la note",
|
||||||
"others": "Autres",
|
"others": "Autres",
|
||||||
"pin": "Épingler",
|
"pin": "Épingler",
|
||||||
"pinned": "Épinglées",
|
"pinned": "Épinglées",
|
||||||
@@ -844,7 +857,7 @@
|
|||||||
"view": "Voir la note",
|
"view": "Voir la note",
|
||||||
"viewCards": "Vue par cartes",
|
"viewCards": "Vue par cartes",
|
||||||
"viewCardsTooltip": "Grille de cartes et réorganisation par glisser-déposer",
|
"viewCardsTooltip": "Grille de cartes et réorganisation par glisser-déposer",
|
||||||
"viewTabs": "Vue par onglets",
|
"viewTabs": "Vue en liste",
|
||||||
"viewTabsTooltip": "Onglets en haut, contenu dessous — glisser les onglets pour réordonner",
|
"viewTabsTooltip": "Onglets en haut, contenu dessous — glisser les onglets pour réordonner",
|
||||||
"viewModeGroup": "Mode d'affichage des notes",
|
"viewModeGroup": "Mode d'affichage des notes",
|
||||||
"reorderTabs": "Réordonner l'onglet",
|
"reorderTabs": "Réordonner l'onglet",
|
||||||
@@ -966,7 +979,6 @@
|
|||||||
"maintenance": "Maintenance",
|
"maintenance": "Maintenance",
|
||||||
"maintenanceDescription": "Outils pour maintenir la santé de votre base de données",
|
"maintenanceDescription": "Outils pour maintenir la santé de votre base de données",
|
||||||
"notifications": "Notifications",
|
"notifications": "Notifications",
|
||||||
"privacy": "Confidentialité",
|
|
||||||
"profile": "Profil",
|
"profile": "Profil",
|
||||||
"searchNoResults": "Aucun paramètre trouvé",
|
"searchNoResults": "Aucun paramètre trouvé",
|
||||||
"security": "Sécurité",
|
"security": "Sécurité",
|
||||||
@@ -975,6 +987,11 @@
|
|||||||
"semanticIndexingDescription": "Générer des vecteurs pour toutes les notes afin de permettre la recherche par intention",
|
"semanticIndexingDescription": "Générer des vecteurs pour toutes les notes afin de permettre la recherche par intention",
|
||||||
"settingsError": "Erreur lors de la sauvegarde des paramètres",
|
"settingsError": "Erreur lors de la sauvegarde des paramètres",
|
||||||
"settingsSaved": "Paramètres enregistrés",
|
"settingsSaved": "Paramètres enregistrés",
|
||||||
|
"cardSizeMode": "Taille des notes",
|
||||||
|
"cardSizeModeDescription": "Choisir entre des notes de tailles différentes ou uniformes",
|
||||||
|
"selectCardSizeMode": "Sélectionner le mode d'affichage",
|
||||||
|
"cardSizeVariable": "Tailles variables (small/medium/large)",
|
||||||
|
"cardSizeUniform": "Taille uniforme",
|
||||||
"theme": "Thème",
|
"theme": "Thème",
|
||||||
"themeDark": "Sombre",
|
"themeDark": "Sombre",
|
||||||
"themeLight": "Clair",
|
"themeLight": "Clair",
|
||||||
@@ -985,10 +1002,7 @@
|
|||||||
"emailNotificationsDesc": "Recevoir des notifications importantes par email",
|
"emailNotificationsDesc": "Recevoir des notifications importantes par email",
|
||||||
"desktopNotifications": "Notifications bureau",
|
"desktopNotifications": "Notifications bureau",
|
||||||
"desktopNotificationsDesc": "Recevoir des notifications dans votre navigateur",
|
"desktopNotificationsDesc": "Recevoir des notifications dans votre navigateur",
|
||||||
"anonymousAnalytics": "Analyses anonymes",
|
"notificationsDesc": "Gérez vos préférences de notifications"
|
||||||
"anonymousAnalyticsDesc": "Partager des données d'utilisation anonymes pour améliorer l'application",
|
|
||||||
"notificationsDesc": "Gérez vos préférences de notifications",
|
|
||||||
"privacyDesc": "Contrôlez vos données et votre confidentialité"
|
|
||||||
},
|
},
|
||||||
"reminders": {
|
"reminders": {
|
||||||
"title": "Rappels",
|
"title": "Rappels",
|
||||||
@@ -1081,10 +1095,19 @@
|
|||||||
"thanksFeedbackImproving": "Merci ! Nous l'utiliserons pour nous améliorer."
|
"thanksFeedbackImproving": "Merci ! Nous l'utiliserons pour nous améliorer."
|
||||||
},
|
},
|
||||||
"trash": {
|
"trash": {
|
||||||
"deletePermanently": "Supprimer définitivement",
|
"title": "Corbeille",
|
||||||
"empty": "La corbeille est vide",
|
"empty": "La corbeille est vide",
|
||||||
|
"emptyDescription": "Les notes supprimées apparaîtront ici",
|
||||||
"restore": "Restaurer",
|
"restore": "Restaurer",
|
||||||
"title": "Corbeille"
|
"deletePermanently": "Supprimer définitivement",
|
||||||
|
"noteTrashed": "Note déplacée dans la corbeille",
|
||||||
|
"noteRestored": "Note restaurée",
|
||||||
|
"notePermanentlyDeleted": "Note supprimée définitivement",
|
||||||
|
"emptyTrash": "Vider la corbeille",
|
||||||
|
"emptyTrashConfirm": "Supprimer définitivement toutes les notes de la corbeille ?",
|
||||||
|
"emptyTrashSuccess": "Corbeille vidée",
|
||||||
|
"permanentDelete": "Supprimer définitivement",
|
||||||
|
"permanentDeleteConfirm": "Cette note sera supprimée définitivement. Cette action est irréversible."
|
||||||
},
|
},
|
||||||
"ui": {
|
"ui": {
|
||||||
"close": "Fermer",
|
"close": "Fermer",
|
||||||
@@ -1097,7 +1120,7 @@
|
|||||||
"description": "Gérez vos clés API et configurez les outils externes",
|
"description": "Gérez vos clés API et configurez les outils externes",
|
||||||
"whatIsMcp": {
|
"whatIsMcp": {
|
||||||
"title": "Qu'est-ce que MCP ?",
|
"title": "Qu'est-ce que MCP ?",
|
||||||
"description": "Le Model Context Protocol (MCP) est un protocole ouvert qui permet aux modèles IA d'interagir de manière sécurisée avec des outils et sources de données externes. Avec MCP, vous pouvez connecter des outils comme Claude Code, Cursor ou N8N à votre instance Keep Notes pour lire, créer et organiser vos notes par programmation.",
|
"description": "Le Model Context Protocol (MCP) est un protocole ouvert qui permet aux modèles IA d'interagir de manière sécurisée avec des outils et sources de données externes. Avec MCP, vous pouvez connecter des outils comme Claude Code, Cursor ou N8N à votre instance Memento pour lire, créer et organiser vos notes par programmation.",
|
||||||
"learnMore": "En savoir plus sur MCP"
|
"learnMore": "En savoir plus sur MCP"
|
||||||
},
|
},
|
||||||
"serverStatus": {
|
"serverStatus": {
|
||||||
@@ -1151,5 +1174,221 @@
|
|||||||
"description": "Utilisez ces identifiants dans votre nœud MCP N8N :"
|
"description": "Utilisez ces identifiants dans votre nœud MCP N8N :"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"agents": {
|
||||||
|
"title": "Agents",
|
||||||
|
"subtitle": "Automatisez vos tâches de veille et de recherche",
|
||||||
|
"newAgent": "Nouvel Agent",
|
||||||
|
"myAgents": "Mes Agents",
|
||||||
|
"searchPlaceholder": "Rechercher un agent...",
|
||||||
|
"filterAll": "Tous",
|
||||||
|
"newBadge": "Nouveau",
|
||||||
|
"noResults": "Aucun agent ne correspond à votre recherche.",
|
||||||
|
"noAgents": "Aucun agent",
|
||||||
|
"noAgentsDescription": "Créez votre premier agent ou installez un template ci-dessous pour automatiser vos tâches de veille.",
|
||||||
|
"types": {
|
||||||
|
"scraper": "Veilleur",
|
||||||
|
"researcher": "Chercheur",
|
||||||
|
"monitor": "Surveillant",
|
||||||
|
"custom": "Personnalisé"
|
||||||
|
},
|
||||||
|
"typeDescriptions": {
|
||||||
|
"scraper": "Scrape plusieurs sites et crée un résumé",
|
||||||
|
"researcher": "Recherche des informations sur un sujet",
|
||||||
|
"monitor": "Surveille un carnet et analyse les notes",
|
||||||
|
"custom": "Agent libre avec votre propre prompt"
|
||||||
|
},
|
||||||
|
"form": {
|
||||||
|
"agentType": "Type d'agent",
|
||||||
|
"name": "Nom",
|
||||||
|
"namePlaceholder": "Ex : Veille IA du mardi",
|
||||||
|
"description": "Description (optionnel)",
|
||||||
|
"descriptionPlaceholder": "Résumé hebdo des actus IA",
|
||||||
|
"urlsLabel": "URLs à scraper",
|
||||||
|
"urlsOptional": "(optionnel)",
|
||||||
|
"sourceNotebook": "Carnet à surveiller",
|
||||||
|
"selectNotebook": "Sélectionner un carnet...",
|
||||||
|
"targetNotebook": "Carnet cible",
|
||||||
|
"inbox": "Boîte de réception",
|
||||||
|
"instructions": "Instructions IA",
|
||||||
|
"instructionsPlaceholder": "Décrivez le comportement de l'agent...",
|
||||||
|
"frequency": "Fréquence",
|
||||||
|
"cancel": "Annuler",
|
||||||
|
"saving": "Sauvegarde...",
|
||||||
|
"save": "Sauvegarder",
|
||||||
|
"create": "Créer l'agent",
|
||||||
|
"editTitle": "Modifier l'agent",
|
||||||
|
"createTitle": "Nouvel agent",
|
||||||
|
"nameRequired": "Le nom est requis",
|
||||||
|
"addUrl": "Ajouter une URL",
|
||||||
|
"advancedMode": "Mode avancé",
|
||||||
|
"instructionsHint": "remplace le prompt automatique",
|
||||||
|
"researchTopic": "Sujet de recherche",
|
||||||
|
"researchTopicPlaceholder": "ex: Les dernières avancées en intelligence artificielle",
|
||||||
|
"notifyEmail": "Notification par email",
|
||||||
|
"notifyEmailHint": "Recevez un email avec les résultats de l'agent après chaque exécution"
|
||||||
|
},
|
||||||
|
"frequencies": {
|
||||||
|
"manual": "Manuel",
|
||||||
|
"hourly": "Toutes les heures",
|
||||||
|
"daily": "Quotidien",
|
||||||
|
"weekly": "Hebdomadaire",
|
||||||
|
"monthly": "Mensuel"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"success": "Réussi",
|
||||||
|
"failure": "Échoué",
|
||||||
|
"running": "En cours",
|
||||||
|
"pending": "En attente"
|
||||||
|
},
|
||||||
|
"actions": {
|
||||||
|
"edit": "Modifier",
|
||||||
|
"run": "Exécuter",
|
||||||
|
"delete": "Supprimer",
|
||||||
|
"deleteConfirm": "Supprimer l'agent \"{name}\" ?",
|
||||||
|
"toggleOn": "Agent activé",
|
||||||
|
"toggleOff": "Agent désactivé"
|
||||||
|
},
|
||||||
|
"toasts": {
|
||||||
|
"created": "Agent créé",
|
||||||
|
"updated": "Agent mis à jour",
|
||||||
|
"deleted": "\"{name}\" supprimé",
|
||||||
|
"deleteError": "Erreur lors de la suppression",
|
||||||
|
"runSuccess": "\"{name}\" exécuté avec succès",
|
||||||
|
"runError": "Erreur : {error}",
|
||||||
|
"runFailed": "Exécution échouée",
|
||||||
|
"runGenericError": "Erreur lors de l'exécution",
|
||||||
|
"toggleError": "Erreur lors du changement",
|
||||||
|
"installSuccess": "\"{name}\" installé",
|
||||||
|
"installError": "Erreur lors de l'installation",
|
||||||
|
"saveError": "Erreur lors de la sauvegarde"
|
||||||
|
},
|
||||||
|
"templates": {
|
||||||
|
"title": "Templates",
|
||||||
|
"install": "Installer",
|
||||||
|
"installing": "Installation...",
|
||||||
|
"veilleAI": {
|
||||||
|
"name": "Veille IA",
|
||||||
|
"description": "Scrape les flux RSS de 6 sites IA (The Verge, TechCrunch, Ars Technica, MIT Tech Review, WIRED, Korben) et génère un résumé hebdomadaire."
|
||||||
|
},
|
||||||
|
"veilleTech": {
|
||||||
|
"name": "Veille Tech",
|
||||||
|
"description": "Scrape les flux RSS tech (Hacker News, DEV, Product Hunt) et crée un résumé quotidien."
|
||||||
|
},
|
||||||
|
"veilleDev": {
|
||||||
|
"name": "Veille Dev",
|
||||||
|
"description": "Scrape les flux RSS dev (JavaScript, TypeScript, React) et résume les nouvelles techs."
|
||||||
|
},
|
||||||
|
"surveillant": {
|
||||||
|
"name": "Surveillant de Notes",
|
||||||
|
"description": "Analyse les notes récentes d'un carnet et suggère des compléments, références et liens."
|
||||||
|
},
|
||||||
|
"chercheur": {
|
||||||
|
"name": "Chercheur de Sujet",
|
||||||
|
"description": "Recherche des informations approfondies sur un sujet et crée une note structurée avec références."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runLog": {
|
||||||
|
"title": "Historique",
|
||||||
|
"noHistory": "Aucune exécution pour le moment",
|
||||||
|
"toolTrace": "{count} appels d'outils",
|
||||||
|
"step": "Étape {num}"
|
||||||
|
},
|
||||||
|
"tools": {
|
||||||
|
"title": "Outils de l'agent",
|
||||||
|
"webSearch": "Recherche web",
|
||||||
|
"webScrape": "Scraping web",
|
||||||
|
"noteSearch": "Recherche notes",
|
||||||
|
"noteRead": "Lire une note",
|
||||||
|
"noteCreate": "Créer une note",
|
||||||
|
"urlFetch": "Fetch URL",
|
||||||
|
"memorySearch": "Mémoire",
|
||||||
|
"configNeeded": "config",
|
||||||
|
"selected": "{count} sélectionné(s)",
|
||||||
|
"maxSteps": "Itérations max"
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"executions": "{count} exéc."
|
||||||
|
},
|
||||||
|
"defaultRoles": {
|
||||||
|
"scraper": "Tu es un assistant de veille. Ton rôle est de synthétiser des articles provenant de différents sites web en un résumé clair, structuré et utile en français. Utilise des titres de section, des listes à puces et des phrases concises.",
|
||||||
|
"researcher": "Tu es un chercheur rigoureux. Pour le sujet demandé, produit une note de recherche avec : contexte, points clés, débats, références. Réponds en français.",
|
||||||
|
"monitor": "Tu es un assistant analytique. Analyse les notes fournies et pour chaque thème détecté, propose : des pistes d'approfondissement, des références ou articles à lire, des connexions entre les notes. Réponds en français.",
|
||||||
|
"custom": "Tu es un assistant utile. Réponds en français."
|
||||||
|
},
|
||||||
|
"help": {
|
||||||
|
"title": "Guide des Agents",
|
||||||
|
"btnLabel": "Aide",
|
||||||
|
"close": "Fermer",
|
||||||
|
"whatIsAgent": "Qu'est-ce qu'un agent ?",
|
||||||
|
"whatIsAgentContent": "Un **agent** est un assistant IA qui travaille automatiquement pour vous. Il dispose d'**outils** (recherche web, scraping de pages, lecture de notes...) et produit une **note** avec ses résultats.\n\nImaginez-le comme un petit travailleur autonome : vous lui confiez une mission, il recherche ou extrait des informations, puis rédige une note structurée que vous pourrez lire ensuite.\n\nLes agents répondent dans votre langue (français ou anglais) en fonction de vos paramètres.",
|
||||||
|
"howToUse": "Comment utiliser un agent ?",
|
||||||
|
"howToUseContent": "1. Cliquez sur **\"Nouvel Agent\"** (ou commencez par un **Template** en bas de page)\n2. Choisissez un **type d'agent** (Chercheur, Veilleur, Surveillant, Personnalise)\n3. Donnez-lui un **nom** et remplissez les champs specifiques au type\n4. Choisissez optionnellement un **carnet cible** ou sauvegarder les resultats\n5. Selectionnez une **frequence** (Manuel = vous le lancez vous-meme)\n6. Cliquez sur **Creer**, puis appuyez sur le bouton **Executer** sur la carte de l'agent\n7. Une fois termine, une nouvelle note apparait dans votre carnet cible",
|
||||||
|
"types": "Types d'agents",
|
||||||
|
"typesContent": "### Chercheur\nRecherche le web sur un **sujet que vous definissez** et cree une note structuree avec des sources et references.\n\n- **Champs :** nom, sujet de recherche (ex : \"Dernieres avancees en intelligence artificielle\")\n- **Outils par defaut :** recherche web, scraping web, recherche de notes, creation de note\n- **Prerequis :** un fournisseur de recherche web doit etre configure (SearXNG ou Brave Search)\n\n### Veilleur (Scraper)\nScrape une **liste d'URLs** que vous spécifiez et produit un résumé de leur contenu.\n\n- **Champs :** nom, liste d'URLs (sites web ou flux RSS)\n- **Outils par défaut :** scraping web, création de note\n- **Astuce RSS :** Utilisez des URLs de flux RSS (ex: `site.com/feed`) pour scraper automatiquement les articles individuels au lieu des pages de liste\n- **Cas d'usage :** veille hebdomadaire tech, surveillance de concurrents, revue de blogs\n\n### Surveillant (Observateur de carnet)\nLit les notes d'un **carnet que vous selectionnez** et produit une analyse, des connexions et des suggestions.\n\n- **Champs :** nom, carnet source (celui a analyser)\n- **Outils par defaut :** recherche de notes, lecture de note, creation de note\n- **Cas d'usage :** trouver des connexions entre vos notes, obtenir des suggestions de lecture, detecter des themes recurrents\n\n### Personnalise\nUne toile vierge : vous ecrivez votre propre **prompt** et choisissez vos **outils**.\n\n- **Champs :** nom, description, instructions personnalisees (en mode avance)\n- **Aucun outil par defaut** — vous choisissez exactement ce dont l'agent a besoin\n- **Cas d'usage :** tout projet creatif ou specifique qui ne rentre pas dans les autres types",
|
||||||
|
"advanced": "Mode avance (Instructions IA, Iterations max)",
|
||||||
|
"advancedContent": "Cliquez sur **\"Mode avance\"** en bas du formulaire pour acceder aux reglages supplementaires.\n\n### Instructions IA\n\nCe champ vous permet de **remplacer le prompt systeme par defaut** de l'agent. Si vous le laissez vide, l'agent utilise un prompt automatique adapte a son type.\n\n**Pourquoi l'utiliser ?** Vous voulez controler exactement le comportement de l'agent. Par exemple :\n- \"Redige le resume en anglais, meme si les sources sont en francais\"\n- \"Structure la note avec les sections : Contexte, Points cles, Opinion personnelle\"\n- \"Ignore les articles de plus de 30 jours et concentre-toi sur l'actualite recente\"\n- \"Pour chaque theme detecte, propose 3 pistes d'approfondissement avec des liens\"\n\n> **Note :** Vos instructions remplacent celles par defaut, pas qu'elles s'y ajoutent.\n\n### Iterations max\n\nC'est le **nombre maximum de cycles** que l'agent peut effectuer. Un cycle = l'agent reflechit, appelle un outil, lit le resultat, puis decide de la prochaine action.\n\n- **3-5 iterations :** pour des taches simples (scraping d'une seule page)\n- **10 iterations (defaut) :** bon equilibre pour la plupart des cas\n- **15-25 iterations :** pour des recherches profondes ou l'agent doit explorer plusieurs pistes\n\n> **Attention :** Plus d'iterations = plus de temps et potentiellement plus de couts API.",
|
||||||
|
"tools": "Outils disponibles (detail complet)",
|
||||||
|
"toolsContent": "Quand le mode avance est active, vous pouvez choisir precisement quels outils l'agent peut utiliser.\n\n### Recherche web\nPermet a l'agent de **lancer des recherches sur internet** via SearXNG ou Brave Search.\n\n- **Ce que ca fait :** L'agent formule une requete, obtient des resultats de recherche, et peut ensuite scraper les pages les plus pertinentes.\n- **Quand l'activer :** Quand l'agent doit trouver des informations sur un sujet (type Chercheur ou Personnalise).\n- **Configuration requise :** SearXNG (avec format JSON active) ou une cle API Brave Search. Configurable dans **Admin > Outils Agents**.\n- **Exemple :** L'agent cherche \"React Server Components best practices 2025\" et obtient 10 resultats, puis scrape les 3 plus pertinents.\n\n### Scraping web\nPermet à l'agent d'**extraire le contenu texte d'une page web** à partir de son URL.\n\n- **Ce que ça fait :** L'agent visite une URL et récupère le texte structuré de la page (titres, paragraphes, listes). Les publicités, menus et pieds de page sont généralement filtrés.\n- **Support RSS/Atom :** Si l'URL est un flux RSS, l'outil détecte automatiquement le flux, parse les articles et scrape les 5 derniers individuellement. Utilisez des URLs de flux RSS pour un contenu beaucoup plus riche que les pages de listing.\n- **Quand l'activer :** Pour le type Veilleur (obligatoire), ou tout agent qui doit lire des pages web.\n- **Configuration :** Fonctionne sans configuration, mais une **clé API Jina Reader** améliore la qualité et supprime les limites de débit. Configurable dans **Admin > Outils Agents**.\n- **Exemple :** L'agent scrape le flux RSS de `techcrunch.com/feed/` et récupère les 5 derniers articles complets.\n\n### Recherche de notes\nPermet a l'agent de **chercher dans vos notes existantes**.\n\n- **Ce que ca fait :** L'agent effectue une recherche textuelle dans toutes vos notes (ou celles d'un carnet specifique).\n- **Quand l'activer :** Pour les agents de type Surveillant, ou tout agent qui doit croiser des informations avec vos notes.\n- **Configuration :** Aucune — fonctionne immediatement.\n- **Exemple :** L'agent cherche toutes les notes contenant \"machine learning\" pour voir ce que vous avez deja ecrit sur le sujet.\n\n### Lire une note\nPermet a l'agent de **lire le contenu complet d'une note** specifique.\n\n- **Ce que ca fait :** Apres avoir trouve une note (via Recherche de notes), l'agent peut lire son contenu integral pour l'analyser ou l'utiliser.\n- **Quand l'activer :** En complement de Recherche de notes. Activer les deux ensemble permet a l'agent de chercher PUIS lire.\n- **Configuration :** Aucune.\n- **Exemple :** L'agent trouve 5 notes sur \"productivite\", les lit toutes, et redige une synthese.\n\n### Creer une note\nPermet a l'agent d'**ecrire une nouvelle note** dans votre carnet cible.\n\n- **Ce que ca fait :** L'agent cree une note avec un titre et du contenu. C'est ainsi que les resultats arrivent dans vos carnets.\n- **Quand l'activer :** Presque toujours — sans cet outil, l'agent ne peut pas sauvegarder ses resultats. **Laissez-le active par defaut.**\n- **Configuration :** Aucune.\n- **Exemple :** L'agent cree une note \"Veille Tech - Semaine 16\" avec un resume de 5 articles.\n\n### Fetch URL\nPermet a l'agent de **telecharger le contenu brut d'une URL** (HTML, JSON, texte...).\n\n- **Ce que ca fait :** Contrairement au scraping qui extrait le texte proprement, Fetch URL recupere le contenu brut. Utile pour les API, les fichiers JSON, ou les pages non standard.\n- **Quand l'activer :** Quand l'agent doit interroger des API REST, lire des flux RSS, ou acceder a des donnees brutes.\n- **Configuration :** Aucune.\n- **Exemple :** L'agent interroge l'API GitHub pour lister les derniers commits d'un projet.\n\n### Memoire\nPermet a l'agent d'**acceder a l'historique de ses executions precedentes**.\n\n- **Ce que ca fait :** L'agent peut rechercher dans les resultats de ses runs passes. Cela lui permet de comparer, de suivre des evolutions, ou de ne pas repeter les memes informations.\n- **Quand l'activer :** Pour les agents qui s'executent regulierement et doivent maintenir une continuite entre les executions.\n- **Configuration :** Aucune.\n- **Exemple :** L'agent compare les actus de cette semaine avec celles de la semaine derniere et met en evidence les nouveautes.",
|
||||||
|
"frequency": "Frequence & planification",
|
||||||
|
"frequencyContent": "| Frequence | Comportement\n|-----------|------------\n| **Manuel** | Vous cliquez sur \"Executer\" — aucune planification automatique\n| **Toutes les heures** | S'execute toutes les heures\n| **Quotidien** | S'execute une fois par jour\n| **Hebdomadaire** | S'execute une fois par semaine\n| **Mensuel** | S'execute une fois par mois\n\n> **Astuce :** Commencez par \"Manuel\" pour tester votre agent, puis passez a une frequence automatique une fois satisfait.",
|
||||||
|
"targetNotebook": "Carnet cible",
|
||||||
|
"targetNotebookContent": "Quand un agent termine sa tache, il **cree une note**. Le **carnet cible** determine ou elle va :\n\n- **Boite de reception** (defaut) — la note va dans vos notes generales\n- **Carnet specifique** — choisissez un carnet pour garder les resultats organises\n\n> **Astuce :** Creez un carnet dedie comme \"Rapports d'agents\" pour centraliser tout le contenu automatise.",
|
||||||
|
"templates": "Templates",
|
||||||
|
"templatesContent": "Les templates sont des agents pré-configurés installables en un clic. Vous les trouvez en **bas de la page Agents**.\n\nTemplates disponibles :\n\n- **Veille IA** — revue hebdomadaire via les flux RSS de 6 sites IA (The Verge, TechCrunch, Ars Technica, MIT Tech Review, WIRED, Korben)\n- **Veille Tech** — résumé quotidien via les flux RSS de Hacker News, DEV Community, Product Hunt\n- **Veille Dev** — nouvelles technos via les flux RSS de DEV (JavaScript, TypeScript, React)\n- **Surveillant de Notes** — analyse un carnet et suggère des connexions\n- **Chercheur de Sujet** — recherche approfondie sur un sujet spécifique\n\nLes templates sont installés avec les outils adaptés à leur type. Vous pouvez les modifier après installation.",
|
||||||
|
"tips": "Conseils & depannage",
|
||||||
|
"tipsContent": "- **Commencez par un template** et personnalisez-le — c'est le moyen le plus rapide d'obtenir un agent fonctionnel\n- **Testez en \"Manuel\"** avant d'activer la planification automatique\n- **Utilisez des URLs de flux RSS** au lieu des pages de liste pour un contenu beaucoup plus riche (ex: `techcrunch.com/feed/` au lieu de `techcrunch.com/category/ai/`)\n- **Un agent \"Chercheur\" nécessite un fournisseur de recherche web** — configurez SearXNG (format JSON) ou Brave Search dans **Admin > Outils Agents**\n- **Si un agent échoue**, cliquez sur sa carte puis **Historique** pour voir le journal d'exécution et les traces d'outils\n- **Le bouton Activer/Désactiver** permet de mettre en pause un agent sans le supprimer\n- **La qualité du scraping web** s'améliore avec une clé API Jina Reader (optionnel, dans Admin > Outils Agents)\n- **Combinez \"Recherche de notes\" + \"Lire une note\"** pour que l'agent puisse chercher ET analyser le contenu de vos notes\n- **Activez \"Mémoire\"** si votre agent tourne régulièrement — il évitera de répéter les mêmes informations d'une exécution à l'autre\n- **Les agents répondent dans votre langue** — basculez entre français et anglais dans les paramètres",
|
||||||
|
"tooltips": {
|
||||||
|
"agentType": "Choisissez le type de tâche que l'agent effectuera. Chaque type a des capacités et des champs différents.",
|
||||||
|
"researchTopic": "Le sujet que l'agent recherchera sur le web. Soyez précis pour de meilleurs résultats.",
|
||||||
|
"description": "Une courte description de ce que fait cet agent. Vous aide à vous souvenir de son objectif.",
|
||||||
|
"urls": "Liste des URLs à scraper. Supporte les flux RSS — utilisez les URLs de flux pour un contenu plus riche (ex: site.com/feed).",
|
||||||
|
"sourceNotebook": "Le carnet que l'agent analysera. Il lit les notes de ce carnet pour trouver des connexions et des thèmes.",
|
||||||
|
"targetNotebook": "Où la note résultat de l'agent sera sauvegardée. Choisissez Boîte de réception ou un carnet spécifique.",
|
||||||
|
"frequency": "À quelle fréquence l'agent s'exécute automatiquement. Commencez par Manuel pour tester.",
|
||||||
|
"instructions": "Instructions personnalisées qui remplacent le prompt IA par défaut. Laissez vide pour utiliser le prompt automatique.",
|
||||||
|
"tools": "Sélectionnez les outils que l'agent peut utiliser. Chaque outil donne une capacité spécifique à l'agent.",
|
||||||
|
"maxSteps": "Nombre maximum de cycles de raisonnement. Plus d'étapes = analyse plus approfondie mais plus long."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"chat": {
|
||||||
|
"title": "Chat IA",
|
||||||
|
"subtitle": "Discutez avec vos notes et vos agents IA",
|
||||||
|
"newConversation": "Nouvelle discussion",
|
||||||
|
"noHistory": "Aucun historique",
|
||||||
|
"untitled": "Discussion sans titre",
|
||||||
|
"deleteConfirm": "Supprimer cette discussion ?",
|
||||||
|
"yes": "Oui",
|
||||||
|
"placeholder": "Envoyez un message à l'assistant...",
|
||||||
|
"allNotebooks": "Tous les carnets",
|
||||||
|
"inAllNotebooks": "Dans tous les carnets",
|
||||||
|
"active": "ACTIF",
|
||||||
|
"disclaimer": "L'IA peut faire des erreurs. Vérifiez les informations importantes.",
|
||||||
|
"assistantError": "Erreur assistant",
|
||||||
|
"loadError": "Erreur lors du chargement de la discussion",
|
||||||
|
"createError": "Erreur lors de la création de la conversation",
|
||||||
|
"deleteError": "Erreur lors de la suppression",
|
||||||
|
"renamed": "Discussion renommée",
|
||||||
|
"renameError": "Erreur lors du renommage",
|
||||||
|
"welcome": "Je suis à votre écoute pour synthétiser vos notes, générer de nouvelles idées ou discuter de vos carnets.",
|
||||||
|
"searching": "Recherche en cours..."
|
||||||
|
},
|
||||||
|
"labHeader": {
|
||||||
|
"title": "Le Lab",
|
||||||
|
"live": "Live",
|
||||||
|
"currentProject": "Projet Actuel",
|
||||||
|
"choose": "Choisir...",
|
||||||
|
"yourSpaces": "Vos Espaces",
|
||||||
|
"updated": "Mis à jour",
|
||||||
|
"newSpace": "Nouvel Espace de Pensée",
|
||||||
|
"new": "Nouveau",
|
||||||
|
"renamed": "Espace renommé",
|
||||||
|
"renameError": "Erreur lors du renommage",
|
||||||
|
"created": "Nouvel espace créé",
|
||||||
|
"createFailed": "Échec de la création",
|
||||||
|
"deleteSpace": "Supprimer l'espace",
|
||||||
|
"deleted": "Espace supprimé",
|
||||||
|
"deleteError": "Erreur lors de la suppression"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user