@@ -28,6 +21,7 @@
import { ref, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import { http } from '@/api'
+import MemoryIcon from './MemoryIcon.vue'
const props = defineProps<{ agentId: string | number }>()
const { t } = useI18n()
@@ -61,7 +55,7 @@ async function dismiss() {
align-items: center;
gap: 6px;
}
-.morning-card__icon { display: inline-flex; align-items: center; color: var(--mc-primary); }
+.morning-card__icon { color: var(--mc-primary); }
.morning-card__title { flex: 1; font-size: 13px; font-weight: 600; color: var(--mc-text-primary); }
.morning-card__close {
background: none; border: none; font-size: 16px; color: var(--mc-text-tertiary);
diff --git a/mateclaw-ui/src/views/Memory/components/icons.ts b/mateclaw-ui/src/views/Memory/components/icons.ts
new file mode 100644
index 00000000..24bf6c94
--- /dev/null
+++ b/mateclaw-ui/src/views/Memory/components/icons.ts
@@ -0,0 +1,29 @@
+/**
+ * Line-art icon paths for the memory module — Feather-style glyphs drawn on a
+ * 24x24 canvas and stroked with `currentColor`. Consumed by MemoryIcon.vue so
+ * every memory view shares one icon source instead of inlining raw SVG.
+ */
+export const memoryIcons = {
+ // File-type icons (long-term memory tabs)
+ memory: '
',
+ profile: '
',
+ soul: '
',
+ list: '
',
+ link: '
',
+ file: '
',
+ // Empty-state icons
+ 'file-text': '
',
+ alert: '
',
+ moon: '
',
+ archive: '
',
+ // Action icons
+ edit: '
',
+ 'thumbs-up': '
',
+ 'thumbs-down': '
',
+ trash: '
',
+ sunrise: '
',
+ 'chevron-down': '
',
+ 'chevron-up': '
',
+} as const
+
+export type MemoryIconName = keyof typeof memoryIcons
diff --git a/mateclaw-ui/src/views/Memory/components/types.ts b/mateclaw-ui/src/views/Memory/components/types.ts
new file mode 100644
index 00000000..e2fc5cd2
--- /dev/null
+++ b/mateclaw-ui/src/views/Memory/components/types.ts
@@ -0,0 +1,10 @@
+/** Shared types for the memory module components. */
+
+/** One `## ` section of a memory file (or the synthetic pre-heading preamble). */
+export interface MemorySectionData {
+ heading: string
+ body: string
+ userEdited: boolean
+ /** True for content before the first `## ` heading — has no addressable key. */
+ synthetic?: boolean
+}
diff --git a/mateclaw-ui/src/views/Memory/index.vue b/mateclaw-ui/src/views/Memory/index.vue
index 23a9fc32..1570ca7e 100644
--- a/mateclaw-ui/src/views/Memory/index.vue
+++ b/mateclaw-ui/src/views/Memory/index.vue
@@ -10,7 +10,7 @@
{{ t('memory.title') }}