feat: Implement core memory management with knowledge graph and evolution tracking

- Added core-memory.js and core-memory-graph.js for managing core memory views and visualizations.
- Introduced functions for viewing knowledge graphs and evolution history of memories.
- Implemented modal dialogs for creating, editing, and viewing memory details.
- Developed core-memory.ts for backend operations including list, import, export, and summary generation.
- Integrated Zod for parameter validation in core memory operations.
- Enhanced UI with dynamic rendering of memory cards and detailed views.
This commit is contained in:
catlog22
2025-12-18 10:07:29 +08:00
parent 4329bd8e80
commit e096fc98e2
23 changed files with 3876 additions and 23 deletions

View File

@@ -3552,6 +3552,29 @@
box-shadow: 0 0 0 2px hsl(var(--ring) / 0.5);
}
/* Language Setting Status Badge */
.cli-setting-status {
margin-left: 0.75rem;
padding: 0.25rem 0.625rem;
font-size: 0.6875rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.03em;
border-radius: 0.25rem;
display: inline-flex;
align-items: center;
}
.cli-setting-status.enabled {
background: hsl(var(--primary) / 0.15);
color: hsl(var(--primary));
}
.cli-setting-status.disabled {
background: hsl(var(--muted));
color: hsl(var(--muted-foreground));
}
/* Ghost button variant for destructive actions */
.btn-ghost.text-destructive {
color: hsl(var(--destructive));

View File

@@ -1285,6 +1285,30 @@
color: hsl(var(--muted-foreground));
}
/* Data Source Selector */
.data-source-select {
padding: 0.375rem 0.75rem;
font-size: 0.8125rem;
font-weight: 500;
color: hsl(var(--foreground));
background: hsl(var(--background));
border: 1px solid hsl(var(--border));
border-radius: 0.375rem;
cursor: pointer;
transition: all 0.15s ease;
outline: none;
}
.data-source-select:hover {
background: hsl(var(--hover));
border-color: hsl(var(--primary) / 0.3);
}
.data-source-select:focus {
border-color: hsl(var(--primary));
box-shadow: 0 0 0 2px hsl(var(--primary) / 0.1);
}
.btn-icon {
display: flex;
align-items: center;

View File

@@ -0,0 +1,477 @@
/* ============================================
Core Memory Styles
============================================ */
.core-memory-container {
padding: 1.5rem;
}
.core-memory-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1.5rem;
flex-wrap: wrap;
gap: 1rem;
}
.header-actions {
display: flex;
gap: 0.75rem;
flex-wrap: wrap;
}
.memory-stats {
display: flex;
gap: 1.5rem;
}
.stat-item {
display: flex;
flex-direction: column;
align-items: center;
}
.stat-label {
font-size: 0.875rem;
color: var(--text-secondary);
margin-bottom: 0.25rem;
}
.stat-value {
font-size: 1.5rem;
font-weight: 600;
color: var(--text-primary);
}
/* Memories Grid */
.memories-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
gap: 1.25rem;
}
@media (max-width: 768px) {
.memories-grid {
grid-template-columns: 1fr;
}
}
/* Memory Card */
.memory-card {
background: var(--card-bg);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 1.25rem;
transition: all 0.2s ease;
}
.memory-card:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
transform: translateY(-2px);
}
.memory-card.archived {
opacity: 0.7;
border-style: dashed;
}
.memory-card-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 1rem;
}
.memory-id {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.875rem;
color: var(--text-secondary);
flex-wrap: wrap;
}
.memory-id i {
width: 16px;
height: 16px;
}
.memory-actions {
display: flex;
gap: 0.5rem;
}
.icon-btn {
background: none;
border: none;
padding: 0.25rem;
cursor: pointer;
color: var(--text-secondary);
transition: color 0.2s;
display: flex;
align-items: center;
justify-content: center;
}
.icon-btn:hover {
color: var(--text-primary);
}
.icon-btn.danger:hover {
color: var(--danger-color);
}
.icon-btn i {
width: 18px;
height: 18px;
}
/* Memory Content */
.memory-content {
margin-bottom: 1rem;
}
.memory-summary {
font-size: 0.9375rem;
line-height: 1.6;
color: var(--text-primary);
}
.memory-preview {
font-size: 0.875rem;
line-height: 1.5;
color: var(--text-secondary);
}
/* Memory Tags */
.memory-tags {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
margin-bottom: 1rem;
}
.tag {
padding: 0.25rem 0.75rem;
background: var(--accent-bg);
color: var(--accent-color);
border-radius: 4px;
font-size: 0.75rem;
font-weight: 500;
}
/* Memory Footer */
.memory-footer {
display: flex;
flex-direction: column;
gap: 0.75rem;
padding-top: 1rem;
border-top: 1px solid var(--border-color);
}
.memory-meta {
display: flex;
gap: 1rem;
font-size: 0.8125rem;
color: var(--text-secondary);
flex-wrap: wrap;
}
.memory-meta span {
display: flex;
align-items: center;
gap: 0.375rem;
}
.memory-meta i {
width: 14px;
height: 14px;
}
.memory-features {
display: flex;
gap: 0.5rem;
flex-wrap: wrap;
}
.feature-btn {
padding: 0.375rem 0.75rem;
background: var(--secondary-bg);
border: 1px solid var(--border-color);
border-radius: 4px;
font-size: 0.8125rem;
cursor: pointer;
transition: all 0.2s;
display: flex;
align-items: center;
gap: 0.375rem;
color: var(--text-primary);
}
.feature-btn:hover {
background: var(--hover-bg);
border-color: var(--accent-color);
}
.feature-btn i {
width: 14px;
height: 14px;
}
/* Badges */
.badge {
padding: 0.25rem 0.5rem;
border-radius: 4px;
font-size: 0.75rem;
font-weight: 500;
}
.badge-archived {
background: var(--warning-bg, #fef3c7);
color: var(--warning-color, #92400e);
}
.badge-priority-high {
background: var(--danger-bg, #fee2e2);
color: var(--danger-color, #991b1b);
}
.badge-priority-low {
background: var(--info-bg, #dbeafe);
color: var(--info-color, #1e3a8a);
}
.badge-current {
background: var(--success-bg, #d1fae5);
color: var(--success-color, #065f46);
}
/* Modal Styles */
.memory-modal {
max-width: 700px;
width: 100%;
}
.memory-detail-modal {
max-width: 900px;
width: 100%;
}
.form-group {
margin-bottom: 1.25rem;
}
.form-group label {
display: block;
font-weight: 500;
margin-bottom: 0.5rem;
color: var(--text-primary);
}
.form-group textarea,
.form-group input[type="text"] {
width: 100%;
padding: 0.75rem;
border: 1px solid var(--border-color);
border-radius: 6px;
background: var(--input-bg);
color: var(--text-primary);
font-family: inherit;
font-size: 0.9375rem;
resize: vertical;
}
.form-group textarea:focus,
.form-group input[type="text"]:focus {
outline: none;
border-color: var(--accent-color);
box-shadow: 0 0 0 3px var(--accent-shadow, rgba(99, 102, 241, 0.1));
}
/* Memory Detail Content */
.memory-detail-content {
display: flex;
flex-direction: column;
gap: 1.5rem;
}
.detail-section h3 {
font-size: 1rem;
font-weight: 600;
margin-bottom: 0.75rem;
color: var(--text-primary);
}
.detail-text {
font-size: 0.9375rem;
line-height: 1.6;
color: var(--text-primary);
white-space: pre-wrap;
}
.detail-code {
background: var(--secondary-bg);
border: 1px solid var(--border-color);
border-radius: 6px;
padding: 1rem;
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
font-size: 0.875rem;
line-height: 1.5;
overflow-x: auto;
white-space: pre-wrap;
word-wrap: break-word;
}
/* Knowledge Graph Styles */
.knowledge-graph {
display: flex;
flex-direction: column;
gap: 1.5rem;
}
.graph-section h3 {
font-size: 1rem;
font-weight: 600;
margin-bottom: 0.75rem;
color: var(--text-primary);
}
.entities-list,
.relationships-list {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.entity-item {
padding: 0.75rem;
background: var(--secondary-bg);
border: 1px solid var(--border-color);
border-radius: 6px;
display: flex;
justify-content: space-between;
align-items: center;
}
.entity-name {
font-weight: 500;
color: var(--text-primary);
}
.entity-type {
padding: 0.25rem 0.5rem;
background: var(--accent-bg);
color: var(--accent-color);
border-radius: 4px;
font-size: 0.75rem;
}
.relationship-item {
padding: 0.75rem;
background: var(--secondary-bg);
border: 1px solid var(--border-color);
border-radius: 6px;
display: flex;
align-items: center;
gap: 0.75rem;
}
.rel-source,
.rel-target {
flex: 1;
font-weight: 500;
color: var(--text-primary);
}
.rel-type {
padding: 0.25rem 0.5rem;
background: var(--info-bg, #dbeafe);
color: var(--info-color, #1e3a8a);
border-radius: 4px;
font-size: 0.75rem;
white-space: nowrap;
}
/* Evolution Timeline */
.evolution-timeline {
display: flex;
flex-direction: column;
gap: 1rem;
}
.evolution-version {
padding: 1rem;
background: var(--secondary-bg);
border: 1px solid var(--border-color);
border-left: 3px solid var(--accent-color);
border-radius: 6px;
}
.version-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.5rem;
}
.version-number {
font-weight: 600;
color: var(--accent-color);
}
.version-date {
font-size: 0.8125rem;
color: var(--text-secondary);
}
.version-reason {
font-size: 0.875rem;
color: var(--text-primary);
margin-top: 0.5rem;
}
/* Empty State */
.empty-state {
text-align: center;
padding: 3rem 1rem;
color: var(--text-secondary);
}
.empty-state i {
width: 48px;
height: 48px;
margin-bottom: 1rem;
opacity: 0.5;
}
.empty-state p {
font-size: 0.9375rem;
}
.empty-text {
color: var(--text-secondary);
font-style: italic;
}
/* Dark Mode Adjustments */
[data-theme="dark"] .memory-card {
background: #1e293b;
border-color: #334155;
}
[data-theme="dark"] .memory-card:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
[data-theme="dark"] .detail-code {
background: #0f172a;
border-color: #334155;
}
[data-theme="dark"] .entity-item,
[data-theme="dark"] .relationship-item,
[data-theme="dark"] .evolution-version {
background: #1e293b;
border-color: #334155;
}