|
46 | 46 | .memcard .memact { background: transparent; border: none; color: var(--cc-text2); border-radius: 4px; padding: 2px 8px; font: inherit; font-size: 11px; cursor: pointer; white-space: nowrap; } |
47 | 47 | .memcard .memact:hover { background: color-mix(in srgb, var(--cc-text3) 20%, transparent); color: var(--cc-text); } |
48 | 48 | .memcard .memact[data-act="forget"]:hover { background: color-mix(in srgb, var(--cc-danger) 18%, transparent); color: var(--cc-danger); } |
| 49 | + /* Facts section (§M3/§6): durable truths, marked inferred vs confirmed, with confirm / not-true. */ |
| 50 | + .memsection { font-size: 10px; letter-spacing: .1em; text-transform: uppercase; color: var(--cc-text3); margin: 12px 4px 6px; } |
| 51 | + .factcard { position: relative; padding: 8px 8px 9px; margin-bottom: 1px; border-radius: 6px; } |
| 52 | + .factcard:hover { background: color-mix(in srgb, var(--cc-text3) 10%, transparent); } |
| 53 | + .factcard.inferred { opacity: .82; } |
| 54 | + .factcard .facttext { font-size: 13px; line-height: 1.5; color: var(--cc-text); } |
| 55 | + .factbadge { font-size: 9.5px; letter-spacing: .05em; text-transform: uppercase; color: var(--cc-text3); border: 1px solid var(--cc-line); border-radius: 4px; padding: 0 4px; margin-left: 2px; white-space: nowrap; } |
| 56 | + .factbadge.ok { color: var(--cc-accent); border-color: color-mix(in srgb, var(--cc-accent) 45%, var(--cc-line)); } |
| 57 | + .factcard .memline2 { display: flex; align-items: center; min-height: 22px; margin-top: 3px; } |
| 58 | + .factcard .memmeta { flex: 1 1 auto; font-size: 11px; color: var(--cc-text3); } |
| 59 | + .factcard .memacts { display: none; align-items: center; gap: 4px; flex: 0 0 auto; } |
| 60 | + .factcard:hover .memmeta, .factcard:focus-within .memmeta { display: none; } |
| 61 | + .factcard:hover .memacts, .factcard:focus-within .memacts { display: flex; } |
| 62 | + .factcard .memact[data-fact="remove"]:hover { background: color-mix(in srgb, var(--cc-danger) 18%, transparent); color: var(--cc-danger); } |
| 63 | + .factcard .memact[data-fact="confirm"]:hover { background: color-mix(in srgb, var(--cc-accent) 18%, transparent); color: var(--cc-accent); } |
49 | 64 | .sesslist { flex: 1 1 auto; overflow-y: auto; padding: 0 10px 12px; } |
50 | 65 | .sessbucket { display: flex; justify-content: space-between; align-items: baseline; font-family: var(--vscode-editor-font-family, ui-monospace, monospace); font-size: 10px; letter-spacing: .1em; text-transform: uppercase; color: var(--cc-text3); margin: 12px 4px 7px; } |
51 | 66 | .sessbucket .cnt { letter-spacing: 0; } |
|
198 | 213 | + '<button type="button" class="memact" data-act="forget" title="Forget this session">Forget</button></span></div>' |
199 | 214 | + '</div>'; |
200 | 215 | } |
201 | | - function renderMemory(items){ |
| 216 | + function factCardHtml(f){ |
| 217 | + const badge = f.confirmed ? '<span class="factbadge ok">confirmed</span>' : '<span class="factbadge">inferred</span>'; |
| 218 | + const acts = '<span class="memacts">' |
| 219 | + + (f.confirmed ? '' : '<button type="button" class="memact" data-fact="confirm" title="Confirm — this is true">Confirm</button>') |
| 220 | + + '<button type="button" class="memact" data-fact="remove" title="Not true — remove this fact">Not true</button>' |
| 221 | + + '</span>'; |
| 222 | + return '<div class="factcard ' + (f.confirmed ? 'confirmed' : 'inferred') + '" data-key="' + escAttr(f.key || '') + '">' |
| 223 | + + '<div class="facttext">' + esc(f.text || '') + ' ' + badge + '</div>' |
| 224 | + + '<div class="memline2"><span class="memmeta">seen ' + (f.count || 0) + '×</span>' + acts + '</div></div>'; |
| 225 | + } |
| 226 | + function renderMemory(msg){ |
202 | 227 | const list = document.getElementById('svMemList'); if (!list) { return; } |
203 | | - const arr = Array.isArray(items) ? items : []; |
204 | | - if (!arr.length){ list.innerHTML = '<div class="sessempty">Nothing remembered yet. As sessions finish, what they achieved appears here — plain text you can edit or forget.</div>'; return; } |
205 | | - list.innerHTML = arr.map(memCardHtml).join(''); |
| 228 | + const items = Array.isArray(msg && msg.items) ? msg.items : []; |
| 229 | + const facts = Array.isArray(msg && msg.facts) ? msg.facts : []; |
| 230 | + let html = ''; |
| 231 | + if (facts.length){ html += '<div class="memsection">Facts</div>' + facts.map(factCardHtml).join(''); } |
| 232 | + if (items.length){ html += '<div class="memsection">Sessions</div>' + items.map(memCardHtml).join(''); } |
| 233 | + list.innerHTML = html || '<div class="sessempty">Nothing remembered yet. As sessions finish, what they achieved appears here — plain text you can edit or forget.</div>'; |
206 | 234 | } |
207 | 235 | document.getElementById('svMemList').addEventListener('click', (e) => { |
| 236 | + const fbtn = e.target.closest && e.target.closest('[data-fact]'); |
| 237 | + if (fbtn){ const fc = fbtn.closest('.factcard'); vscode.postMessage({ type: 'factAction', action: fbtn.getAttribute('data-fact'), key: fc ? fc.getAttribute('data-key') : '' }); return; } |
208 | 238 | const card = e.target.closest && e.target.closest('.memcard'); if (!card) { return; } |
209 | 239 | const id = card.getAttribute('data-id'); const btn = e.target.closest('[data-act]'); |
210 | 240 | vscode.postMessage({ type: 'memoryAction', action: btn ? btn.getAttribute('data-act') : 'resume', id: id }); |
|
232 | 262 | vscode.postMessage({ type: 'sessionAction', action: 'restore', id: b.getAttribute('data-id') }); |
233 | 263 | document.getElementById('svUndo').hidden = true; clearTimeout(sessUndoTimer); |
234 | 264 | }); |
235 | | - window.addEventListener('message', (ev) => { const m = ev.data; if (m && m.type === 'sessions'){ sessData = Array.isArray(m.entries) ? m.entries : []; renderSessions(); } else if (m && m.type === 'memoryList'){ renderMemory(m.items); } else if (m && m.type === 'sessionUndo'){ showUndo(m); } }); |
| 265 | + window.addEventListener('message', (ev) => { const m = ev.data; if (m && m.type === 'sessions'){ sessData = Array.isArray(m.entries) ? m.entries : []; renderSessions(); } else if (m && m.type === 'memoryList'){ renderMemory(m); } else if (m && m.type === 'sessionUndo'){ showUndo(m); } }); |
236 | 266 | renderSessions(); |
237 | 267 | vscode.postMessage({ type: 'listSessions' }); |
238 | 268 | </script> |
|
0 commit comments