Skip to content

feat(dashboard): full-featured profile builder (model + skills + MCPs)#39084

Merged
teknium1 merged 2 commits into
mainfrom
hermes/hermes-f28d58c5
Jun 10, 2026
Merged

feat(dashboard): full-featured profile builder (model + skills + MCPs)#39084
teknium1 merged 2 commits into
mainfrom
hermes/hermes-f28d58c5

Conversation

@teknium1

@teknium1 teknium1 commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Summary

Profiles can now be created in the dashboard with full control over Model+Provider, Skills (built-in/optional + skills-hub), MCP servers, Name, and Description — in one stepped builder, instead of the thin name+clone+model create modal.

This replaces the CLI hermes profile wizard approach (PR #31781): a profile is a full HERMES_HOME dir, and the dashboard already owns mature Models/Skills/MCP pages, so the builder composes those existing data paths rather than reinventing them.

Changes

  • hermes_cli/web_server.py: POST /api/profiles accepts mcp_servers[], keep_skills[], hub_skills[] (all optional, all best-effort post-create so a hiccup never 500s the create). Two new helpers: _write_profile_mcp_servers and _disable_unselected_skills, both profile-scoped via the HERMES_HOME context override (same mechanism as the existing _write_profile_model).
  • Hub-skill installs spawn hermes -p <name> skills install <id> — a subprocess, because skills_hub.SKILLS_DIR is import-time-bound and the runtime override can't redirect it (a fresh child re-binds it to the profile's HERMES_HOME).
  • web/src/pages/ProfileBuilderPage.tsx: new /profiles/new stepped page (Identity → Model → Skills → MCPs → Review). Nothing writes until Create. Skills use replace semantics with a "start from full bundle" default.
  • web/src/pages/ProfilesPage.tsx: header Build button → builder; quick Create modal kept.
  • web/src/lib/api.ts, web/src/App.tsx: extended createProfile signature + route (page-only, not in sidebar nav).
  • docs/design/profile-builder.md: design rationale + the two architectural seams found.

Validation

Result
Backend E2E (isolated HERMES_HOME) model + 2 MCPs + keep-skills land in the new profile's config; bogus MCP skipped (no 500); dashboard's own config un-polluted; hub install spawned with -p <name>
tests/hermes_cli/test_web_server.py (profile/create) 6 passed (incl. new test_profiles_create_builder_fields_*)
vite build green — 2258 modules transformed

Notes

  • Replace semantics confirmed correct against the profile disabled-list mechanism (skills are active-by-default; unselected ones get disabled).
  • Hub installs are async by nature, so the create returns immediately with spawned PIDs; the success toast reports in-progress installs.

Infographic

profile-builder

teknium1 added 2 commits June 4, 2026 06:22
…l + MCPs + skills)

Backend foundation for the dashboard profile builder. Extends POST /api/profiles
to accept, in one call, everything a profile needs beyond name/clone:

- mcp_servers[]  -> written into the new profile's config.yaml
- keep_skills[]  -> replace-semantics: disable every seeded skill not kept
- hub_skills[]   -> async install via 'hermes -p <name> skills install <id>'

All applied best-effort AFTER the profile dir exists, so a hiccup in any one
never 500s the create. Model/MCP/keep-skills writes are profile-scoped via the
HERMES_HOME context override (same mechanism as the existing _write_profile_model).
Hub installs go through a subprocess scoped with -p because skills_hub.SKILLS_DIR
is import-time-bound and the runtime override can't redirect it.

Adds two helpers (_write_profile_mcp_servers, _disable_unselected_skills) and a
TestClient test asserting all four paths land in the NEW profile's config and
the hub spawn is scoped to it. Design doc at docs/design/profile-builder.md.
Adds a dedicated /profiles/new builder that composes everything a profile
needs into one stepped create flow, reusing the existing Models/Skills/MCP
data paths instead of duplicating them:

- Identity   name + description
- Model      provider+model picker (api.getModelOptions)
- Skills     keep-which-built-in/optional (replace semantics, default = full
             bundle) + skills-hub search/add (api.getSkills, searchSkillsHub)
- MCPs       add HTTP/stdio servers inline
- Review     blueprint -> single POST /api/profiles create

Nothing writes until Create; the one call commits model+MCPs+skill selection
and spawns hub-skill installs (reported in the success toast). ProfilesPage
header gets a 'Build' button (full builder) alongside 'Create' (quick modal).
Route is page-only (not in the sidebar nav). Verified with vite build (2258
modules, green).
@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

🔎 Lint report: hermes/hermes-f28d58c5 vs origin/main

ruff

Total: 0 on HEAD, 0 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 0 pre-existing issues carried over.

ty (type checker)

Total: 9837 on HEAD, 9837 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 5101 pre-existing issues carried over.

Diagnostics are surfaced as warnings — this check never fails the build.

@alt-glitch alt-glitch added type/feature New feature or request P3 Low — cosmetic, nice to have comp/gateway Gateway runner, session dispatch, delivery labels Jun 4, 2026
KeyArgo pushed a commit to KeyArgo/hermes-agent that referenced this pull request Jun 6, 2026
Cherry-picked profile builder feature from upstream PR NousResearch#39084:
- ProfileBuilderPage.tsx (new page)
- Extended createProfile API with model/mcp/skills params
- Backend endpoint accepts mcp_servers, keep_skills, hub_skills
- Build button in Profiles page header
- Design doc
@teknium1 teknium1 merged commit d986bb0 into main Jun 10, 2026
23 checks passed
@teknium1 teknium1 deleted the hermes/hermes-f28d58c5 branch June 10, 2026 16:18
alt-glitch pushed a commit that referenced this pull request Jun 14, 2026
#39084)

* feat(profiles): extend create endpoint for full profile-builder (model + MCPs + skills)

Backend foundation for the dashboard profile builder. Extends POST /api/profiles
to accept, in one call, everything a profile needs beyond name/clone:

- mcp_servers[]  -> written into the new profile's config.yaml
- keep_skills[]  -> replace-semantics: disable every seeded skill not kept
- hub_skills[]   -> async install via 'hermes -p <name> skills install <id>'

All applied best-effort AFTER the profile dir exists, so a hiccup in any one
never 500s the create. Model/MCP/keep-skills writes are profile-scoped via the
HERMES_HOME context override (same mechanism as the existing _write_profile_model).
Hub installs go through a subprocess scoped with -p because skills_hub.SKILLS_DIR
is import-time-bound and the runtime override can't redirect it.

Adds two helpers (_write_profile_mcp_servers, _disable_unselected_skills) and a
TestClient test asserting all four paths land in the NEW profile's config and
the hub spawn is scoped to it. Design doc at docs/design/profile-builder.md.

* feat(dashboard): full-featured profile builder page

Adds a dedicated /profiles/new builder that composes everything a profile
needs into one stepped create flow, reusing the existing Models/Skills/MCP
data paths instead of duplicating them:

- Identity   name + description
- Model      provider+model picker (api.getModelOptions)
- Skills     keep-which-built-in/optional (replace semantics, default = full
             bundle) + skills-hub search/add (api.getSkills, searchSkillsHub)
- MCPs       add HTTP/stdio servers inline
- Review     blueprint -> single POST /api/profiles create

Nothing writes until Create; the one call commits model+MCPs+skill selection
and spawns hub-skill installs (reported in the success toast). ProfilesPage
header gets a 'Build' button (full builder) alongside 'Create' (quick modal).
Route is page-only (not in the sidebar nav). Verified with vite build (2258
modules, green).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/gateway Gateway runner, session dispatch, delivery P3 Low — cosmetic, nice to have type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants