Add memory-viewer from silicondawn

- Web UI for browsing and editing OpenClaw memory files
- Cloned from https://github.com/silicondawn/memory-viewer
- Built and running on port 8901
- Features: file tree, markdown rendering, search, live reload
- Full access to MEMORY.md, daily notes, skills, automations
This commit is contained in:
Krilly
2026-02-21 02:28:57 +00:00
parent 690a2e31b3
commit c9acf0c4da
78 changed files with 18899 additions and 1 deletions

View File

@@ -0,0 +1,77 @@
import { chromium } from 'playwright';
import { join } from 'path';
const BASE = 'http://localhost:8901';
const DOCS = join(import.meta.dirname, 'docs');
const VP = { width: 1280, height: 800 };
async function screenshot(page, name) {
await page.waitForTimeout(500);
await page.screenshot({ path: join(DOCS, name), fullPage: false });
console.log(`${name}`);
}
const browser = await chromium.launch();
// --- DARK THEME ---
let ctx = await browser.newContext({ viewport: VP, colorScheme: 'dark' });
let page = await ctx.newPage();
// Dashboard (dark)
await page.goto(BASE);
await page.waitForLoadState('networkidle');
await screenshot(page, 'screenshot-dashboard-dark.png');
// Viewer - open MEMORY.md (dark)
// Click on MEMORY.md in file tree
await page.click('text=MEMORY.md');
await page.waitForTimeout(800);
await screenshot(page, 'screenshot-viewer-dark.png');
// Editor mode (dark) - click edit button
const editBtn = page.locator('button:has-text("Edit"), button[title*="edit"], button[title*="Edit"], [aria-label*="edit"], [aria-label*="Edit"]').first();
if (await editBtn.count() > 0) {
await editBtn.click();
await page.waitForTimeout(500);
await screenshot(page, 'screenshot-editor-dark.png');
}
// Search panel (dark) - Ctrl+K
await page.keyboard.press('Control+k');
await page.waitForTimeout(500);
// Type something to show results
await page.keyboard.type('memory');
await page.waitForTimeout(800);
await screenshot(page, 'screenshot-search-dark.png');
await page.keyboard.press('Escape');
await ctx.close();
// --- LIGHT THEME ---
ctx = await browser.newContext({ viewport: VP, colorScheme: 'light' });
page = await ctx.newPage();
// Set light theme via localStorage before navigating
await page.addInitScript(() => {
localStorage.setItem('theme', 'light');
});
await page.goto(BASE);
await page.waitForLoadState('networkidle');
// Also try setting it after load
await page.evaluate(() => {
localStorage.setItem('theme', 'light');
document.documentElement.classList.remove('dark');
document.documentElement.classList.add('light');
});
await page.reload();
await page.waitForLoadState('networkidle');
await screenshot(page, 'screenshot-dashboard-light.png');
// Viewer light
await page.click('text=MEMORY.md');
await page.waitForTimeout(800);
await screenshot(page, 'screenshot-viewer-light.png');
await ctx.close();
await browser.close();
console.log('🎉 All screenshots done!');