diff --git a/core/http/react-ui/e2e/home-console.spec.js b/core/http/react-ui/e2e/home-console.spec.js
index 0b8ae5fab5..6bf8191464 100644
--- a/core/http/react-ui/e2e/home-console.spec.js
+++ b/core/http/react-ui/e2e/home-console.spec.js
@@ -40,7 +40,7 @@ test.describe('Home slash menu', () => {
'/model', '/new', '/chat', '/assistant', '/models',
'/gallery', '/installed', '/import', '/stop',
// No installation advice for a particular provider.
- '/agents', '/mcp', '/memory', '/apps', '/settings', '/docs',
+ '/agents', '/mcp', '/knowledge', '/apps', '/settings', '/docs',
])
// The test server always keeps built-in skills, so /skill is offered.
expect(names.slice(15, 18)).toEqual(['/attach', '/skill', '/skills'])
@@ -62,6 +62,17 @@ test.describe('Home slash menu', () => {
}
})
+ test('/knowledge is the name and /memory still finds the same command', async ({ page }) => {
+ await ready(page)
+ for (const typed of ['/knowl', '/memory']) {
+ await page.locator('.home-textarea').fill(typed)
+ await expect(page.getByTestId('home-slash-memory')).toBeVisible()
+ await expect(page.getByTestId('home-slash-memory')).toContainText('/knowledge')
+ }
+ await page.getByTestId('home-slash-memory').click()
+ await expect(page).toHaveURL(/\/app\/collections$/)
+ })
+
test('the /skills command opens the Skills page', async ({ page }) => {
await ready(page)
await page.locator('.home-textarea').fill('/skills')
diff --git a/core/http/react-ui/e2e/settings-memory.spec.js b/core/http/react-ui/e2e/settings-memory.spec.js
index 905971c12e..72dd1f5c5e 100644
--- a/core/http/react-ui/e2e/settings-memory.spec.js
+++ b/core/http/react-ui/e2e/settings-memory.spec.js
@@ -45,6 +45,10 @@ function listing(s) {
if (agent.length) groups.push({ source: 'notes-agent', scope: 'agent', key: 'bot', max_bytes: 2048, max_lines: 40, files: agent })
const prof = has('LocalAI/agents/bot/profile.md') ? [file('LocalAI/agents/bot/profile.md', s.texts['LocalAI/agents/bot/profile.md'].length, { index: true, lines: 1 })] : []
if (prof.length) groups.push({ source: 'profile', scope: 'agent', key: 'bot', max_bytes: 4096, files: prof })
+ if (s.texts['Memory/channels/chat-1/index.md'] !== undefined) {
+ const p = 'Memory/channels/chat-1/index.md'
+ groups.push({ source: 'notes-channel', scope: 'channel', key: 'chat-1', max_bytes: 2048, max_lines: 40, files: [file(p, s.texts[p].length, { index: true, lines: 1 })] })
+ }
return { limits: LIMITS, groups }
}
@@ -189,3 +193,20 @@ test('on a phone the page fits and the rows keep their buttons', async ({ page }
expect(overflow).toBeLessThanOrEqual(0)
await shot(page, 'memory-page-phone', { fullPage: true })
})
+
+test('the Conversations tab lists the notes saved from messaging chats, to read and delete', async ({ page }) => {
+ const s = fixture()
+ s.texts['Memory/channels/chat-1/index.md'] = '- coffee: black\n'
+ await open(page, s)
+ const tab = page.getByTestId('memory-tabs').getByRole('tab', { name: 'Conversations' })
+ await tab.click()
+ await expect(page.getByTestId('memory-channels-note')).toContainText('not paired')
+ const g = group(page, 'notes-channel:chat-1')
+ await expect(g.getByRole('heading')).toHaveText('Notes of conversation chat-1')
+ await g.locator('.mt-file__name').click()
+ await expect(g.getByTestId('memory-text')).toContainText('coffee: black')
+ await shot(page, 'memory-conversations')
+ await g.getByTestId('memory-delete').click()
+ await g.getByTestId('memory-delete-yes').click()
+ await expect.poll(() => s.removed).toEqual(['Memory/channels/chat-1/index.md'])
+})
diff --git a/core/http/react-ui/public/locales/de/chats.json b/core/http/react-ui/public/locales/de/chats.json
index 63f21a64d5..0ca7158ca0 100644
--- a/core/http/react-ui/public/locales/de/chats.json
+++ b/core/http/react-ui/public/locales/de/chats.json
@@ -841,6 +841,7 @@
"mine": "Meine",
"deleted": "Gelöschte Agenten",
"channels": "Unterhaltungen",
+ "channelsNote": "Notes saved from chats in messaging apps. Open a note to read it, or delete it. A note from a sender who is not paired with you always waits for your approval.",
"export": "Diese Notizen exportieren",
"clearAgent": "Die Notizen dieses Agenten löschen",
"clearDeleted": "Diese Notizen löschen"
diff --git a/core/http/react-ui/public/locales/en/chats.json b/core/http/react-ui/public/locales/en/chats.json
index 9ea59fbdb8..34be4fc7fc 100644
--- a/core/http/react-ui/public/locales/en/chats.json
+++ b/core/http/react-ui/public/locales/en/chats.json
@@ -1163,6 +1163,7 @@
"mine": "Mine",
"deleted": "Deleted agents",
"channels": "Conversations",
+ "channelsNote": "Notes saved from chats in messaging apps. Open a note to read it, or delete it. A note from a sender who is not paired with you always waits for your approval.",
"export": "Export these notes",
"clearAgent": "Delete the notes of this agent",
"clearDeleted": "Delete these notes"
diff --git a/core/http/react-ui/public/locales/es/chats.json b/core/http/react-ui/public/locales/es/chats.json
index c2562d1410..b3a6e44aaa 100644
--- a/core/http/react-ui/public/locales/es/chats.json
+++ b/core/http/react-ui/public/locales/es/chats.json
@@ -841,6 +841,7 @@
"mine": "Mías",
"deleted": "Agentes eliminados",
"channels": "Conversaciones",
+ "channelsNote": "Notes saved from chats in messaging apps. Open a note to read it, or delete it. A note from a sender who is not paired with you always waits for your approval.",
"export": "Exportar estas notas",
"clearAgent": "Eliminar las notas de este agente",
"clearDeleted": "Eliminar estas notas"
diff --git a/core/http/react-ui/public/locales/fr/chats.json b/core/http/react-ui/public/locales/fr/chats.json
index d5226fb2dd..dcc05758dd 100644
--- a/core/http/react-ui/public/locales/fr/chats.json
+++ b/core/http/react-ui/public/locales/fr/chats.json
@@ -841,6 +841,7 @@
"mine": "Les miennes",
"deleted": "Agents supprimés",
"channels": "Conversations",
+ "channelsNote": "Notes saved from chats in messaging apps. Open a note to read it, or delete it. A note from a sender who is not paired with you always waits for your approval.",
"export": "Exporter ces notes",
"clearAgent": "Supprimer les notes de cet agent",
"clearDeleted": "Supprimer ces notes"
diff --git a/core/http/react-ui/public/locales/id/chats.json b/core/http/react-ui/public/locales/id/chats.json
index fb50eed2f7..641133d4e2 100644
--- a/core/http/react-ui/public/locales/id/chats.json
+++ b/core/http/react-ui/public/locales/id/chats.json
@@ -841,6 +841,7 @@
"mine": "Milik saya",
"deleted": "Agen yang dihapus",
"channels": "Percakapan",
+ "channelsNote": "Notes saved from chats in messaging apps. Open a note to read it, or delete it. A note from a sender who is not paired with you always waits for your approval.",
"export": "Ekspor catatan ini",
"clearAgent": "Hapus catatan agen ini",
"clearDeleted": "Hapus catatan ini"
diff --git a/core/http/react-ui/public/locales/it/chats.json b/core/http/react-ui/public/locales/it/chats.json
index 45e9d8de2b..7a57d4ae96 100644
--- a/core/http/react-ui/public/locales/it/chats.json
+++ b/core/http/react-ui/public/locales/it/chats.json
@@ -841,6 +841,7 @@
"mine": "Mie",
"deleted": "Agenti eliminati",
"channels": "Conversazioni",
+ "channelsNote": "Notes saved from chats in messaging apps. Open a note to read it, or delete it. A note from a sender who is not paired with you always waits for your approval.",
"export": "Esporta queste note",
"clearAgent": "Elimina le note di questo agente",
"clearDeleted": "Elimina queste note"
diff --git a/core/http/react-ui/public/locales/ko/chats.json b/core/http/react-ui/public/locales/ko/chats.json
index b620e119ab..422ea35af8 100644
--- a/core/http/react-ui/public/locales/ko/chats.json
+++ b/core/http/react-ui/public/locales/ko/chats.json
@@ -841,6 +841,7 @@
"mine": "내 메모",
"deleted": "삭제된 에이전트",
"channels": "대화",
+ "channelsNote": "Notes saved from chats in messaging apps. Open a note to read it, or delete it. A note from a sender who is not paired with you always waits for your approval.",
"export": "이 메모 내보내기",
"clearAgent": "이 에이전트의 메모 삭제",
"clearDeleted": "이 메모 삭제"
diff --git a/core/http/react-ui/public/locales/pt-BR/chats.json b/core/http/react-ui/public/locales/pt-BR/chats.json
index cc630faf93..c9b76ae456 100644
--- a/core/http/react-ui/public/locales/pt-BR/chats.json
+++ b/core/http/react-ui/public/locales/pt-BR/chats.json
@@ -841,6 +841,7 @@
"mine": "Minhas",
"deleted": "Agentes excluídos",
"channels": "Conversas",
+ "channelsNote": "Notes saved from chats in messaging apps. Open a note to read it, or delete it. A note from a sender who is not paired with you always waits for your approval.",
"export": "Exportar estas notas",
"clearAgent": "Excluir as notas deste agente",
"clearDeleted": "Excluir estas notas"
diff --git a/core/http/react-ui/public/locales/zh-CN/chats.json b/core/http/react-ui/public/locales/zh-CN/chats.json
index f9cbbb9428..3f464987f1 100644
--- a/core/http/react-ui/public/locales/zh-CN/chats.json
+++ b/core/http/react-ui/public/locales/zh-CN/chats.json
@@ -841,6 +841,7 @@
"mine": "我的",
"deleted": "已删除的智能体",
"channels": "对话",
+ "channelsNote": "Notes saved from chats in messaging apps. Open a note to read it, or delete it. A note from a sender who is not paired with you always waits for your approval.",
"export": "导出这些笔记",
"clearAgent": "删除此智能体的笔记",
"clearDeleted": "删除这些笔记"
diff --git a/core/http/react-ui/src/components/MemoryTab.jsx b/core/http/react-ui/src/components/MemoryTab.jsx
index 68cd29e151..2984161584 100644
--- a/core/http/react-ui/src/components/MemoryTab.jsx
+++ b/core/http/react-ui/src/components/MemoryTab.jsx
@@ -219,6 +219,7 @@ export default function MemoryTab({ addToast, embedded = false }) {
{tabs.length > 1 &&
{t('memoryPage.deletedNote')}
} + {tab.kind === 'channels' &&{t('memoryPage.tabs.channelsNote')}
} {tab.groups.length === 0 &&{t('memoryPage.tabEmpty')}
} {tab.groups.map((g) => (