Files
links/static_src/jbot/store/memoryStore.js
T
junvandCopilot a87b4643fd feat: port JBOT AI robot face into links as Django app
- Add jbot Django app (jbot/__init__.py, apps.py, urls.py, api_urls.py)
- Python backend (jbot/views.py): TTS 2.0, ASR 1.0 BigASR, LLM/memory via OpenRouter
- React SPA frontend at /jbot/ (static_src/jbot/): RobotFace, ChatPanel, expressions,
  voices, push-to-talk, history, memory, settings pages
- Vite entry jbot: static_src/jbot/main.jsx → dist/jbot.js + dist/jbot.css
- react-router-dom added; BrowserRouter basename=/jbot for SPA routing
- core/settings.py: added jbot to INSTALLED_APPS
- core/urls.py: /jbot/ + /api/jbot/ URL includes
- pyproject.toml: websocket-client>=1.9.0 for BigASR binary WS protocol
- Dockerfile: ffmpeg added to production apt-get for WebM→PCM audio conversion
- k8s/manifest.yaml: VOLC_APP_ID, VOLC_ACCESS_TOKEN, OPENROUTER_API_KEY env vars
  via jbot-credentials Secret; LLM_MODEL, VOLC_TTS_VOICE, VOLC_ASR_RESOURCE defaults

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-17 14:13:37 +10:00

27 lines
851 B
JavaScript

const KEY = 'jbot_memory';
const MAX_LEN = 100;
export function getMemories() {
try { return JSON.parse(localStorage.getItem(KEY) || '[]'); }
catch { return []; }
}
// Add a fact if it's not already stored (simple text dedup).
// Returns the new entry, or null if it was a duplicate.
export function addMemory(text) {
const mems = getMemories();
const norm = text.toLowerCase().trim();
if (mems.some(m => m.text.toLowerCase().trim() === norm)) return null;
const entry = { id: crypto.randomUUID(), text: text.trim(), createdAt: Date.now() };
localStorage.setItem(KEY, JSON.stringify([entry, ...mems].slice(0, MAX_LEN)));
return entry;
}
export function deleteMemory(id) {
localStorage.setItem(KEY, JSON.stringify(getMemories().filter(m => m.id !== id)));
}
export function clearMemories() {
localStorage.removeItem(KEY);
}