feat(memory): Graphnosis provider UI, MCP install surfaces, and onboarding#763
feat(memory): Graphnosis provider UI, MCP install surfaces, and onboarding#763nehloo wants to merge 1 commit into
Conversation
…rding Add English copy and download links for the Graphnosis memory provider, a Capabilities MCP install promo (hermes mcp install graphnosis), Discover bundled MCP catalog entry when optional-mcps/graphnosis exists in hermes-agent, and a Welcome onboarding card pointing to graphnosis.com. Depends on NousResearch/hermes-agent Graphnosis memory + MCP PR. Integration source: nehloo-interactive/graphnosis-app integrations/hermes-desktop/ Co-authored-by: Cursor <cursoragent@cursor.com>
8b075b5 to
7c2d91e
Compare
Greptile SummaryThis PR adds Graphnosis (a local encrypted memory provider) UI surfaces across four screens in Hermes Desktop: a memory provider entry, a Tools MCP promo card, a Discover tab catalog entry, and a Welcome onboarding card. It also introduces a new
Confidence Score: 4/5Safe to merge; changes are additive UI surfaces with no modifications to existing install or MCP logic paths. All new code is additive — new IPC channel, new UI cards, new i18n strings. The two issues found are both minor: a wrapper div in Welcome.tsx carries a class name that has no corresponding CSS rule, and the MCP tab-badge count in Discover.tsx duplicates dedup logic that's already computed in a memo, meaning the two could silently diverge if one is updated without the other. Neither affects functionality today. src/renderer/src/screens/Discover/Discover.tsx (duplicated dedup logic in tabCount) and src/renderer/src/screens/Welcome/Welcome.tsx (missing welcome-graphnosis-copy CSS class). Important Files Changed
|
| <div className="welcome-graphnosis-copy"> | ||
| <div className="welcome-graphnosis-title"> | ||
| {t("welcome.graphnosisTitle")} | ||
| </div> | ||
| <p className="welcome-graphnosis-body">{t("welcome.graphnosisBody")}</p> | ||
| </div> |
There was a problem hiding this comment.
The
welcome-graphnosis-copy class is used here but is not defined in main.css. The other card classes (.welcome-graphnosis-card, .welcome-graphnosis-title, .welcome-graphnosis-body) are all present in the stylesheet, so this wrapper div is the odd one out. It won't break layout because the parent flex container provides the gap, but the missing class makes the intent of this wrapper ambiguous and it's inconsistent with the rest of the named classes.
| <div className="welcome-graphnosis-copy"> | |
| <div className="welcome-graphnosis-title"> | |
| {t("welcome.graphnosisTitle")} | |
| </div> | |
| <p className="welcome-graphnosis-body">{t("welcome.graphnosisBody")}</p> | |
| </div> | |
| <div> | |
| <div className="welcome-graphnosis-title"> | |
| {t("welcome.graphnosisTitle")} | |
| </div> | |
| <p className="welcome-graphnosis-body">{t("welcome.graphnosisBody")}</p> | |
| </div> |
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
| function tabCount(key: RegistryKind): number { | ||
| if (key === "skills") return skillsTotal; | ||
| if (key === "mcps") { | ||
| const list = catalog.mcps ?? []; | ||
| const seen = new Set([ | ||
| ...list.map((i) => i.id), | ||
| ...list.map((i) => i.name), | ||
| ]); | ||
| const extra = bundledMcps.filter( | ||
| (b) => !seen.has(b.id) && !seen.has(b.name), | ||
| ); | ||
| return list.length + extra.length; | ||
| } | ||
| return (catalog[key] ?? []).length; | ||
| } |
There was a problem hiding this comment.
Duplicated dedup logic, not memoized
tabCount for "mcps" re-implements the exact same id+name deduplication that already lives in the communityList useMemo. skillsTotal handles the skills equivalent via a dedicated useMemo so the count and the list stay in sync by construction — the MCP case doesn't have that guarantee. If the dedup logic is ever adjusted in communityList, the count displayed on the tab badge will silently diverge. Consider extracting a mcpsTotal memo analogous to skillsTotal, or reading communityList.length directly (it's computed before tabCount is called).
Summary
Adds Graphnosis UI surfaces to Hermes Desktop — companion to the Hermes Agent integration in NousResearch/hermes-agent#51197.
hermes mcp install graphnosis) + app downloadoptional-mcps/graphnosisexists in hermes-agentMemory provider discovery is automatic once the hermes-agent Graphnosis plugin is installed.
Integration source: https://github.com/nehloo-interactive/graphnosis-app/tree/main/integrations/hermes-desktop
Depends on
optional-mcps/graphnosismanifest + memory provider pluginChanges
listBundledMcps()IPC + Discover tab integration (mirrors bundled skills pattern)Test plan
npm run typecheck— passesnpm test -- tests/preload-api-surface.test.ts— passeshermes mcp install graphnosisoptional-mcps/graphnosis/manifest.yamlpresentMaintained by Nehloo Interactive LLC (
nehloo-interactive/graphnosis-app).Made with Cursor