Hermes-Native Memory Console Plan

A clear implementation plan for the Mnemosyne dashboard plugin. The architecture is native Hermes dashboard plugin + FastAPI + profile-scoped SQLite. MCP is excluded.

Date 2026-05-15 Repo /Users/huntsyea/Dev/hermes-mnemosyne-dashboard Decision No MCP

Executive Summary

Decision: Build this as a Hermes-native memory console. Do not use MCP.

The right product is a Hermes-native memory console: a local dashboard tab for finding, inspecting, and cleaning Mnemosyne memories across Hermes profiles.

MCP is the wrong abstraction for this job. The Hermes dashboard already provides the extension surface needed: a dashboard plugin with a React bundle, plugin CSS, and a FastAPI router mounted at /api/plugins/<name>/.

  1. Keep the plugin as a drop-in Hermes dashboard plugin.
  2. Keep the backend as direct FastAPI routes over profile-scoped Mnemosyne SQLite databases.
  3. Keep the frontend as one focused console: find → inspect → act.
  4. Keep graph data read-only until graph mutation semantics are designed.
  5. Keep every mutation reversible by default: edit, expire, supersede, and bulk metadata changes before hard delete.

Documentation Review Findings

Dashboard plugins are native

Official docs define dashboard extensions as manifest.json, a prebuilt JavaScript bundle, optional CSS, and optional plugin_api.py.

SDK covers the UI

window.__HERMES_PLUGIN_SDK__ provides React, hooks, UI primitives, utilities, and SDK.fetchJSON.

FastAPI is the API boundary

Backend plugin routes mount under /api/plugins/<name>/, matching the current plugin design.

Discovery affects rollout

JS/CSS can be rescanned. Backend API route changes require restarting hermes dashboard.

Local operations model

The dashboard binds to 127.0.0.1 by default and should not be treated as a public service.

MCP adds confusion

MCP introduces server discovery, dynamic tool names, subprocess/HTTP lifecycle, and optional sampling. None of that helps a local dashboard memory console.

Product Definition

ItemDefinition
Product nameMnemosyne Memory Console
One-line jobManage memory records across Hermes profiles.
Primary loopFind → Inspect → Act
Non-goalsMCP setup, MCP tools, approval queues, autonomous rewriting, public service, raw vector editing, graph mutation, hard delete as normal workflow.

Current Baseline

The repo already has the right foundation:

Target UX

Mnemosyne
Manage memory records across profiles.        Profile: default   Refresh

[Needs attention] [Working] [Episodic] [Facts] [Triples]

Search memories…                              [All] [Durable] [Session] [Temporary] [Unknown]

┌─────────────────────────────────────┬─────────────────────────────────────┐
│ Memory inbox                        │ Inspector                           │
│ Issue  Temporary task state         │ Content                             │
│ session · conversation · May 15     │ ...                                 │
│ Durable  User preference            │ Metadata                            │
│ global · preference · May 14        │ source · scope · importance         │
│                                     │ Actions                             │
│                                     │ [Edit] [Expire] [Copy ID]           │
└─────────────────────────────────────┴─────────────────────────────────────┘

Architecture

Hermes Dashboard
  └── Mnemosyne plugin tab `/mnemosyne`
        ├── dashboard/manifest.json
        ├── dashboard/dist/index.js
        ├── dashboard/dist/style.css
        └── dashboard/plugin_api.py
              └── profile-scoped SQLite reads/writes
                    ├── ~/.hermes/mnemosyne/data/mnemosyne.db
                    └── ~/.hermes/profiles/<profile>/mnemosyne/data/mnemosyne.db
  1. No MCP. This is a dashboard plugin, not an agent tool integration.
  2. No silent profile fallback. Named profiles must resolve to their own DB or return an error.
  3. Whitelisted tables only. Memory table names remain constrained.
  4. Parameterized SQL values. No interpolated user values in SQL predicates.
  5. Validated writes only. Mutation routes validate fields, ranges, JSON, and profile.
  6. Facts/triples read-only. Graph mutation waits for a separate design.

Implementation Plan

Phase 1 — Native Plugin Alignment

Phase 2 — Backend Contract Hardening

Phase 3 — Memory Console UI Redesign

Phase 4 — Cleanup Workflows

Phase 5 — Verification and Release

cd /Users/huntsyea/.hermes/hermes-agent
python -m pytest /Users/huntsyea/Dev/hermes-mnemosyne-dashboard/tests/plugins/test_mnemosyne_dashboard_plugin.py -q -o 'addopts='

cd /Users/huntsyea/Dev/hermes-mnemosyne-dashboard
node --check dashboard/dist/index.js
python -m py_compile dashboard/plugin_api.py

Backend Contract

GET  /profiles
GET  /health?profile=<name>
GET  /memories?profile=<name>&table=<working_memory|episodic_memory>&q=&state=&sort=&limit=&offset=&attention=
GET  /memories/{table}/{id}?profile=<name>
PATCH /memories/{table}/{id}?profile=<name>
POST /memories?profile=<name>
POST /memories/{table}/{id}/expire?profile=<name>
POST /memories/{table}/{id}/supersede?profile=<name>
POST /bulk?profile=<name>
GET  /facts?profile=<name>
GET  /triples?profile=<name>
GET  /cleanup/lenses?profile=<name>

Recommended Build Order

  1. Update docs and README to state the native dashboard-plugin direction and MCP exclusion.
  2. Add backend tests for attention=true and profile safety gaps.
  3. Implement/fix backend contract gaps.
  4. Redesign the UI shell: header, segmented nav, two-pane layout.
  5. Redesign inbox rows and inspector.
  6. Tighten cleanup lenses and bulk actions.
  7. Add static frontend copy/affordance tests.
  8. Run full verification.
  9. Smoke the live dashboard.
  10. Commit as one coherent product-direction update for docs-only work; split test/backend/frontend commits once implementation begins.

Definition of Done