Skip to content

Commit f570223

Browse files
committed
feat: v1.2.5 Memory-aware personas — persona namespace declaration, MemoryPreviewPanel, persona marketplace Memory tab, PersonaPublish namespace selector
1 parent ec63a8e commit f570223

12 files changed

Lines changed: 772 additions & 55 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,7 @@ Inspired by the top-trending ClawHub skills: `self-improving-agent` (411k downlo
582582
skill refinements based on corrections, regenerations, and user edits;
583583
proposals shown in a diff view; user approves → saved to the relevant skill
584584
in IndexedDB
585-
- [ ] **Memory-aware personas** — A persona can declare which memory namespaces it
585+
- [x] **Memory-aware personas** — A persona can declare which memory namespaces it
586586
reads on activation (e.g. "global" + "per:this-persona"); persona editor shows
587587
a memory preview panel
588588

src/App.css

Lines changed: 351 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16938,3 +16938,354 @@ textarea:focus:not(:focus-visible),
1693816938
background: #f3f4f6;
1693916939
}
1694016940
}
16941+
16942+
/* ── Persona Marketplace Memory Tab ─────────────────────────────────── */
16943+
16944+
.persona-marketplace-memory {
16945+
display: flex;
16946+
gap: 16px;
16947+
height: calc(100vh - 220px);
16948+
}
16949+
16950+
.persona-marketplace-memory-grid {
16951+
display: flex;
16952+
gap: 16px;
16953+
width: 100%;
16954+
height: 100%;
16955+
}
16956+
16957+
.persona-marketplace-memory-people {
16958+
width: 240px;
16959+
flex-shrink: 0;
16960+
display: flex;
16961+
flex-direction: column;
16962+
}
16963+
16964+
.persona-marketplace-memory-title {
16965+
font-size: 13px;
16966+
font-weight: 600;
16967+
color: var(--text-secondary);
16968+
text-transform: uppercase;
16969+
letter-spacing: 0.05em;
16970+
margin: 0 0 8px 0;
16971+
}
16972+
16973+
.persona-marketplace-memory-list {
16974+
display: flex;
16975+
flex-direction: column;
16976+
gap: 2px;
16977+
overflow-y: auto;
16978+
}
16979+
16980+
.persona-marketplace-memory-persona {
16981+
display: flex;
16982+
align-items: center;
16983+
gap: 8px;
16984+
padding: 8px 12px;
16985+
background: transparent;
16986+
border: 1px solid transparent;
16987+
border-radius: 8px;
16988+
cursor: pointer;
16989+
text-align: left;
16990+
width: 100%;
16991+
color: var(--text-primary);
16992+
font-size: 13px;
16993+
transition: background 0.15s, border-color 0.15s;
16994+
}
16995+
16996+
.persona-marketplace-memory-persona:hover {
16997+
background: var(--surface-hover);
16998+
border-color: var(--border-color);
16999+
}
17000+
17001+
.persona-marketplace-memory-persona.active {
17002+
background: var(--surface-hover);
17003+
border-color: var(--accent-color);
17004+
}
17005+
17006+
.persona-marketplace-memory-persona-icon {
17007+
font-size: 16px;
17008+
}
17009+
17010+
.persona-marketplace-memory-persona-name {
17011+
flex: 1;
17012+
text-align: left;
17013+
}
17014+
17015+
.persona-marketplace-memory-ns-count {
17016+
font-size: 11px;
17017+
color: var(--text-tertiary);
17018+
background: var(--surface-muted);
17019+
padding: 1px 6px;
17020+
border-radius: 10px;
17021+
}
17022+
17023+
.persona-marketplace-memory-empty {
17024+
padding: 20px;
17025+
text-align: center;
17026+
color: var(--text-tertiary);
17027+
font-size: 13px;
17028+
}
17029+
17030+
.persona-marketplace-memory-preview {
17031+
flex: 1;
17032+
min-width: 0;
17033+
}
17034+
17035+
/* ── Memory Preview Panel ──────────────────────────────────────────── */
17036+
17037+
.memory-preview-panel {
17038+
display: flex;
17039+
flex-direction: column;
17040+
height: 100%;
17041+
background: var(--surface-primary);
17042+
border: 1px solid var(--border-color);
17043+
border-radius: 12px;
17044+
overflow: hidden;
17045+
}
17046+
17047+
.memory-preview-header {
17048+
display: flex;
17049+
align-items: center;
17050+
justify-content: space-between;
17051+
padding: 12px 16px;
17052+
border-bottom: 1px solid var(--border-color);
17053+
}
17054+
17055+
.memory-preview-title-row {
17056+
display: flex;
17057+
align-items: center;
17058+
gap: 8px;
17059+
}
17060+
17061+
.memory-preview-title-row h3 {
17062+
margin: 0;
17063+
font-size: 14px;
17064+
font-weight: 600;
17065+
color: var(--text-primary);
17066+
}
17067+
17068+
.memory-preview-persona-badge {
17069+
display: flex;
17070+
align-items: center;
17071+
gap: 4px;
17072+
font-size: 13px;
17073+
color: var(--text-secondary);
17074+
}
17075+
17076+
.memory-preview-close {
17077+
background: none;
17078+
border: none;
17079+
color: var(--text-tertiary);
17080+
cursor: pointer;
17081+
font-size: 16px;
17082+
padding: 4px;
17083+
line-height: 1;
17084+
border-radius: 4px;
17085+
transition: color 0.15s;
17086+
}
17087+
17088+
.memory-preview-close:hover {
17089+
color: var(--text-primary);
17090+
}
17091+
17092+
.memory-preview-namespaces {
17093+
padding: 12px 16px;
17094+
border-bottom: 1px solid var(--border-color);
17095+
display: flex;
17096+
align-items: center;
17097+
gap: 8px;
17098+
}
17099+
17100+
.memory-preview-ns-label {
17101+
font-size: 12px;
17102+
color: var(--text-tertiary);
17103+
}
17104+
17105+
.memory-preview-ns-chips {
17106+
display: flex;
17107+
gap: 4px;
17108+
flex-wrap: wrap;
17109+
}
17110+
17111+
.memory-preview-ns-chip {
17112+
font-size: 11px;
17113+
padding: 2px 8px;
17114+
border-radius: 10px;
17115+
border: 1px solid;
17116+
color: var(--text-secondary);
17117+
}
17118+
17119+
.memory-preview-ns-none {
17120+
font-size: 11px;
17121+
color: var(--text-tertiary);
17122+
font-style: italic;
17123+
}
17124+
17125+
.memory-preview-filters {
17126+
display: flex;
17127+
gap: 4px;
17128+
padding: 8px 16px;
17129+
border-bottom: 1px solid var(--border-color);
17130+
}
17131+
17132+
.memory-preview-filter {
17133+
padding: 4px 10px;
17134+
background: transparent;
17135+
border: 1px solid transparent;
17136+
border-radius: 6px;
17137+
cursor: pointer;
17138+
font-size: 12px;
17139+
color: var(--text-secondary);
17140+
transition: all 0.15s;
17141+
}
17142+
17143+
.memory-preview-filter:hover {
17144+
background: var(--surface-hover);
17145+
}
17146+
17147+
.memory-preview-filter.active {
17148+
background: var(--surface-hover);
17149+
border-color: var(--accent-color);
17150+
color: var(--accent-color);
17151+
}
17152+
17153+
.memory-preview-count {
17154+
margin-left: 4px;
17155+
font-size: 10px;
17156+
opacity: 0.6;
17157+
}
17158+
17159+
.memory-preview-list {
17160+
flex: 1;
17161+
overflow-y: auto;
17162+
padding: 8px 12px;
17163+
}
17164+
17165+
.memory-preview-card {
17166+
padding: 10px 12px;
17167+
background: var(--surface-secondary);
17168+
border: 1px solid var(--border-color);
17169+
border-radius: 8px;
17170+
margin-bottom: 6px;
17171+
transition: border-color 0.15s;
17172+
}
17173+
17174+
.memory-preview-card:hover {
17175+
border-color: var(--accent-color);
17176+
}
17177+
17178+
.memory-preview-card-correction {
17179+
border-left: 3px solid #f59e0b;
17180+
}
17181+
17182+
.memory-preview-card-header {
17183+
display: flex;
17184+
align-items: center;
17185+
gap: 6px;
17186+
margin-bottom: 6px;
17187+
}
17188+
17189+
.memory-preview-key {
17190+
font-size: 13px;
17191+
font-weight: 600;
17192+
color: var(--text-primary);
17193+
}
17194+
17195+
.memory-preview-namespace-badge {
17196+
font-size: 10px;
17197+
padding: 1px 6px;
17198+
border-radius: 8px;
17199+
border: 1px solid;
17200+
color: var(--text-secondary);
17201+
}
17202+
17203+
.memory-preview-correction-badge {
17204+
font-size: 10px;
17205+
padding: 1px 6px;
17206+
border-radius: 6px;
17207+
background: #fef3c7;
17208+
color: #92400e;
17209+
}
17210+
17211+
.memory-preview-target-chip {
17212+
font-size: 11px;
17213+
color: var(--text-tertiary);
17214+
margin-bottom: 4px;
17215+
}
17216+
17217+
.memory-preview-value {
17218+
font-size: 12px;
17219+
color: var(--text-secondary);
17220+
line-height: 1.5;
17221+
word-break: break-word;
17222+
}
17223+
17224+
.memory-preview-meta {
17225+
margin-top: 6px;
17226+
font-size: 10px;
17227+
color: var(--text-tertiary);
17228+
}
17229+
17230+
.memory-preview-time {
17231+
font-size: 10px;
17232+
color: var(--text-tertiary);
17233+
}
17234+
17235+
.memory-preview-empty {
17236+
display: flex;
17237+
flex-direction: column;
17238+
align-items: center;
17239+
justify-content: center;
17240+
padding: 40px 20px;
17241+
text-align: center;
17242+
color: var(--text-tertiary);
17243+
}
17244+
17245+
.memory-preview-empty-icon {
17246+
font-size: 32px;
17247+
margin-bottom: 8px;
17248+
}
17249+
17250+
.memory-preview-empty p {
17251+
margin: 0 0 4px 0;
17252+
font-size: 13px;
17253+
}
17254+
17255+
.memory-preview-empty-hint {
17256+
font-size: 11px;
17257+
opacity: 0.7;
17258+
}
17259+
17260+
/* Light theme overrides for persona marketplace memory */
17261+
[data-theme='light'] .persona-marketplace-memory-persona {
17262+
color: var(--text-primary);
17263+
}
17264+
17265+
[data-theme='light'] .persona-marketplace-memory-persona:hover {
17266+
background: var(--surface-hover);
17267+
}
17268+
17269+
[data-theme='light'] .persona-marketplace-memory-persona.active {
17270+
background: #ede9fe;
17271+
border-color: #a78bfa;
17272+
}
17273+
17274+
[data-theme='light'] .memory-preview-card {
17275+
background: #ffffff;
17276+
}
17277+
17278+
[data-theme='light'] .memory-preview-card:hover {
17279+
border-color: #a78bfa;
17280+
}
17281+
17282+
[data-theme='light'] .memory-preview-filter.active {
17283+
background: #ede9fe;
17284+
border-color: #a78bfa;
17285+
color: #7c3aed;
17286+
}
17287+
17288+
[data-theme='light'] .memory-preview-correction-badge {
17289+
background: #fef3c7;
17290+
color: #92400e;
17291+
}

src/App.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,8 @@ export default function App() {
774774
chat.applyPersona(persona)
775775
setView('chat')
776776
}}
777+
memories={memories}
778+
personas={PERSONA_REGISTRY}
777779
/>
778780
</div>
779781
) : view === 'knowledge' ? (

0 commit comments

Comments
 (0)