Skip to content

Commit cd6115b

Browse files
outsourc-eAurora release botmotoki takahashiVicky Wondervitaliy-blprnt
authored
fix: consolidate verified workspace issue sweep (#432)
* fix(start): use server-entry wrapper for production * fix(swarm): reconcile oneshot checkpoints and ignore phantom blockers * fix(profiles): sync editable descriptions from profile config * fix: show cron jobs across Hermes profiles * fix(capabilities): clarify dashboard-backed API detection * feat: make Conductor use native Swarm fallback Treat Workspace-native Swarm as the official Conductor fallback when the dashboard mission API is unavailable. Preserve dashboard-first dispatch, native status/cancel handling, provider-neutral setup docs, and regression coverage for gateway capability detection, swarm health, roster/profile handling, and native Conductor responses. * fix(usage-meter): reposition menu trigger for better alignment - Adjusted the position of the menu trigger in the usage meter component to enhance layout consistency and user experience. fix(chat-panel): adjust position of chat panel toggle button - Updated the positioning of the chat panel toggle button to improve visibility and accessibility by changing its bottom and right offsets. * fix(stt): wire Groq/OpenAI voice transcription into chat * Fix Workspace Kanban loopback dashboard link * fix(update): do not open historical release notes on startup * fix(chat): clear stale thinking runs reliably * fix(dashboard): trust sessions endpoint for status * fix(settings): address review — local default, OAuth lifecycle, validation * fix(dashboard): always scrape live session token from HTML * fix(chat): avoid portable history replay on bound sessions * fix(settings): remove dead smart routing controls * fix(tasks-api): guard against HTML catch-all in probeBackend The /api/hermes-tasks route was renamed to /api/claude-tasks in commit efcb7d1, but the probe logic still listed the old route as a candidate. When probed, the SPA catch-all returned a 200 HTML response instead of a 404, so probeBackend() treated it as a valid (empty) backend and then failed when the actual task fetch threw. Fixes: - probeBackend() now checks Content-Type: application/json and returns -1 for non-JSON responses, so future route renames degrade gracefully. - resolveBackend() now only selects hermes if hermesCount > 0, defaulting to claude-tasks (the active backend post rename) when hermes is absent. * fix(terminal): default cwd to ~ and fallback if path missing PTY helper chdir fails when ~/.hermes is absent (common in Docker). Default shell cwd to home; server falls back to HOME if cwd does not exist. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(settings): satisfy lint on custom providers UI * fix(docker): add -m flag to useradd so workspace home dir is created Without -m, the system account has no /home/workspace directory. The auth middleware tries to write the session store at /home/workspace/.hermes/workspace-sessions.json; mkdirSync fails with EACCES because /home/ is root-owned (755), causing the 'Failed to persist session store' warning and a 500 on every authenticated route. Adding -m causes useradd to create and chown /home/workspace correctly so the session store can be written on first login. * fix(tasks): preserve real session links and restore task launch flow * fix(launchd): install macOS plist from server-entry template * fix(docker): expose dashboard API and persist workspace volumes * fix(jobs): serialize deliver targets for cron API * Make Hermes Workspace installable as PWA * chore(deps): pin direct tanstack versions * feat: align semantic Hermes swarm agents Add semantic swarm roster metadata, profile/tool/skill docs, shared semantic worker ID validation, focused roster regression coverage, and one-shot checkpoint capture for dispatch smoke tests. * fix(conductor): pass through sessionKeyPrefix from portable spawn result sessionKeyPrefix was hardcoded to null in conductor-spawn.ts, breaking async session resolution when the dashboard backend returns a prefix. Now mirrors the sessionKey pattern and passes through the value from the spawn result. Co-authored-by: Hermes Agent * feat(swarm): bridge workspace kanban to native Hermes * fix(chat): keep portable main pinned without breaking resolved sessions * Add Windows startup script for Hermes Workspace Document PowerShell usage for launching and restarting gateway + workspace via WSL tmux. Co-Authored-By: Oz <oz-agent@warp.dev> * fix(config): name Hermes Agent in restart notice * fix(swarm): reconcile aggregate semantic worker exports --------- Co-authored-by: Aurora release bot <release@outsourc-e.com> Co-authored-by: motoki takahashi <motokitakahashi@motokinoMac-mini.local> Co-authored-by: Vicky Wonder <vicky@openclaw.ai> Co-authored-by: Vitaliy Isikov <visikov+supagoku@gmail.com> Co-authored-by: Hermes Agent <hermes-agent@local> Co-authored-by: Nikolay Mohr <nikomohr96@gmail.com> Co-authored-by: Niko Mohr <niko@friendsfromcollege.de> Co-authored-by: wtchronos <262830926+wtchronos@users.noreply.github.com> Co-authored-by: Dak0verflow <dakotaferris@gmail.com> Co-authored-by: norema <mamadou.marone.19@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: daoyuan <ludaoyuan1989@gmail.com> Co-authored-by: firemountain <firemountain@gmail.com> Co-authored-by: RAZSOC Local <razsoc@local> Co-authored-by: Waylon Kenning <waylonkenning@Waylons-MacBook-Pro.local> Co-authored-by: Kublai <kublai@kublai.local> Co-authored-by: justa <justa@local> Co-authored-by: Oz <oz-agent@warp.dev>
1 parent 372b18a commit cd6115b

132 files changed

Lines changed: 9124 additions & 1696 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,14 @@
1010
# container needs the key for whichever provider you configured in
1111
# ~/.hermes/config.yaml. Common options:
1212
#
13-
# Anthropic (Claude): https://console.anthropic.com/settings/keys
13+
# OpenAI Codex / OpenAI-compatible: configure through `hermes setup` / `hermes model`
1414
# OpenAI (GPT / o-series): https://platform.openai.com/api-keys
1515
# OpenRouter (many models, free tier available): https://openrouter.ai/keys
1616
# Google (Gemini): https://aistudio.google.com/app/apikey
1717
# Ollama / local: No key needed — just run `ollama serve`
1818
#
1919
# Uncomment ONLY the key(s) for the providers you actually use.
2020

21-
# ANTHROPIC_API_KEY=sk-ant-...
2221
# OPENAI_API_KEY=sk-...
2322
# OPENROUTER_API_KEY=sk-or-v1-...
2423
# GOOGLE_API_KEY=AIza...
@@ -51,8 +50,8 @@
5150
# Set this if hermes-agent is installed elsewhere
5251
# HERMES_AGENT_PATH=/path/to/hermes-agent
5352

54-
# Server port (default: 3002)
55-
# PORT=3002
53+
# Server port (default: 3000)
54+
# PORT=3000
5655

5756
# ══════════════════════════════════════════════════════════════
5857
# Security
@@ -110,11 +109,11 @@
110109
# all live on the dashboard, not the gateway.
111110
# HERMES_DASHBOARD_URL=http://127.0.0.1:9119
112111

113-
# Dashboard API bearer token (optional)
112+
# Dashboard session token
114113
#
115-
# Preferred over the legacy HTML-scrape token flow. Set this to a dashboard
116-
# bearer and the workspace uses it directly for dashboard API calls (see #124).
117-
# HERMES_DASHBOARD_TOKEN=
114+
# Workspace scrapes the dashboard's ephemeral session token from the root HTML
115+
# automatically. Do not copy this token into .env: it changes whenever the
116+
# dashboard restarts and stale values cause 401s on /api/sessions and related APIs.
118117

119118
# Bypass fail-closed startup guard (NOT recommended)
120119
#

.npmrc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
11
legacy-peer-deps=true
2-
3-

AGENTS.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Hermes Workspace Agent Contract
2+
3+
This workspace uses semantic Hermes swarm workers, not numbered-only lanes. The source of truth for routing is `swarm.yaml`; each worker also has a matching profile under `~/.hermes/profiles/<worker-id>/`, a role skill `<worker-id>-core`, and a wrapper in `~/.local/bin/`.
4+
5+
## Current semantic roster
6+
7+
| Worker | Wrapper | Tools | Skills | MCP | Plugins |
8+
|---|---|---|---|---|---|
9+
| `orchestrator` | `orchestrator:plan` | todo, kanban, delegation, terminal, file, gbrain, session_search, cronjob, skills, clarify, web | orchestrator-core, gstack-for-hermes, gbrain, kanban-orchestrator, subagent-driven-development, writing-plans, requesting-code-review, workspace-dispatch | gbrain | none |
10+
| `km-agent` | `km:health` | gbrain, file, terminal, session_search, skills, todo, cronjob, web | km-agent-core, gbrain, obsidian-markdown, obsidian-cli, obsidian-bases, json-canvas, gstack-for-hermes | gbrain | none |
11+
| `builder` | `builder:task` | terminal, file, browser, web, gbrain, session_search, skills, todo | builder-core, gstack-for-hermes, test-driven-development, systematic-debugging, github-pr-workflow, requesting-code-review, codebase-inspection | gbrain | none |
12+
| `reviewer` | `reviewer:gate` | terminal, file, web, gbrain, session_search, skills | reviewer-core, requesting-code-review, github-code-review, systematic-debugging, gstack-for-hermes, gbrain, codebase-inspection | gbrain | none |
13+
| `qa` | `qa:smoke` | browser, terminal, file, vision, gbrain, session_search, skills, web | qa-core, browser-harness-power-use, dogfood, gstack-for-hermes | gbrain | none |
14+
| `researcher` | `researcher:quick` | gbrain, web, browser, terminal, file, vision, session_search, skills, todo | researcher-core, gbrain, autoresearch, browser-harness-power-use, gstack-for-hermes, researcher-quick, researcher-autoresearch, arxiv, youtube-content, polymarket | gbrain | none |
15+
| `ops-watch` | `ops:health` | terminal, cronjob, file, gbrain, skills, session_search, web | ops-watch-core, gbrain, hermes-agent, systematic-debugging, webhook-subscriptions | gbrain | none |
16+
| `maintainer` | `maintainer:check` | terminal, file, web, browser, gbrain, session_search, skills | maintainer-core, github-repo-management, github-pr-workflow, github-issues, github-code-review, gbrain, gstack-for-hermes, hermes-agent | gbrain | none |
17+
| `strategist` | `strategist:review` | gbrain, web, session_search, file, skills, todo, clarify | strategist-core, gstack-for-hermes, gbrain, writing-plans, polymarket | gbrain | none |
18+
| `inbox-triage` | `inbox:triage` | gbrain, web, file, session_search, todo, skills, terminal | inbox-triage-core, gbrain, obsidian-markdown, gstack-for-hermes, defuddle, youtube-content | gbrain | none |
19+
20+
## Operating rules
21+
22+
- Keep `swarm.yaml`, profile `config.yaml`, profile core skills, and wrappers aligned when changing a worker.
23+
- Prefer GBrain-first lookup for context-sensitive RAZSOC/Hermes/workflow decisions.
24+
- Builder implements; Reviewer gates; QA verifies behavior; Orchestrator routes and enforces greenlight.
25+
- Do not enable optional Hermes plugins globally unless the task explicitly needs them; record plugin/toolset alignment in `swarm.yaml` first.

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ FROM node:22-slim
3030
RUN apt-get update && apt-get install -y --no-install-recommends \
3131
ca-certificates curl tini python3 \
3232
&& rm -rf /var/lib/apt/lists/* \
33-
&& groupadd -r workspace && useradd -r -g workspace -u 10010 workspace
33+
&& groupadd -r workspace && useradd -r -g workspace -u 10010 -m workspace
3434

3535
WORKDIR /app
3636

README.md

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
> Not a chat wrapper. A complete workspace — orchestrate agents, browse memory, manage skills, and control everything from one interface.
1616
17-
> **v2 — zero-fork.** Clone, don't fork. Runs on vanilla [`NousResearch/hermes-agent`](https://github.com/NousResearch/hermes-agent) installed via Nous's own installer. Chat, sessions, memory, skills, jobs, MCP, terminal, dashboard, Agent View, and Operations are all in vanilla parity. **Conductor** currently requires an additional dashboard plugin not in upstream yet — the UI shows a clear placeholder when that endpoint isn't available ([#262](https://github.com/outsourc-e/hermes-workspace/issues/262)). Everything else works with zero patches.
17+
> **v2 — zero-fork.** Clone, don't fork. Runs on vanilla [`NousResearch/hermes-agent`](https://github.com/NousResearch/hermes-agent) installed via Nous's own installer. Chat, sessions, memory, skills, jobs, MCP, terminal, dashboard, Agent View, and Operations are all in vanilla parity. **Conductor** uses the dashboard mission API when available and falls back to Workspace-native Swarm dispatch (`mode: native-swarm`) when the dashboard endpoint is absent, preserving zero-fork behavior ([#262](https://github.com/outsourc-e/hermes-workspace/issues/262)).
1818
1919
![Hermes Workspace](./docs/screenshots/splash.png)
2020

@@ -48,7 +48,7 @@ Start here: [docs/swarm/](./docs/swarm/)
4848
- 🔌 **MCP** — Full /mcp page (catalog + marketplace + sources), or fallback to local config CRUD
4949
- 📁 **Files + Terminal** — Full workspace file browser with Monaco; cross-platform PTY terminal
5050
- 🎮 **Operations** — Multi-agent dashboard with profile presets (Sage/Trader/Builder/Scribe/Ops) and 'Needs setup' detection
51-
- 📡 **Conductor** — Mission dispatch + decomposition (requires upstream dashboard plugin, see [#262](https://github.com/outsourc-e/hermes-workspace/issues/262))
51+
- 📡 **Conductor** — Mission dispatch + decomposition with dashboard-backed missions when available and Workspace-native Swarm fallback otherwise
5252
- 👥 **Agent View** — Live agent panel in chat with avatar, queue, history, usage meter
5353
- 🐝 **Swarm Mode** — Persistent tmux-backed Hermes Agent workers with role-based dispatch
5454
- 🗄️ **Dashboard** — Aggregated overview: sessions, model mix, cost ledger, attention card, ops strip
@@ -213,8 +213,7 @@ HERMES_API_URL=http://127.0.0.1:8642
213213
214214
# Optional: provider keys the Hermes Agent gateway can read at runtime.
215215
# You only need the key(s) for whichever provider(s) you actually use.
216-
# ANTHROPIC_API_KEY=*** # Anthropic
217-
# OPENAI_API_KEY=sk-... # GPT / o-series
216+
# OPENAI_API_KEY=sk-... # GPT / o-series / OpenAI-compatible
218217
# OPENROUTER_API_KEY=sk-or-v1-... # OpenRouter (incl. free models)
219218
# GOOGLE_API_KEY=AIza... # Gemini
220219
# (Ollama / LM Studio / local servers don't need a key)
@@ -331,6 +330,26 @@ cd ~/hermes-workspace && pnpm dev # terminal 3 · :3000 · the UI
331330

332331
> **Tip:** `pnpm start:all` starts gateway + dashboard + workspace in one shot if you've installed via the one-liner.
333332
333+
### Windows (PowerShell + WSL) one-command startup
334+
335+
If you use Hermes Workspace from Windows with the agent running in WSL, use the helper script in this repo:
336+
337+
```powershell
338+
# from the repo root
339+
.\scripts\start-hermes-workspace.ps1
340+
```
341+
342+
To force a clean relaunch of the tmux session:
343+
344+
```powershell
345+
.\scripts\start-hermes-workspace.ps1 -Restart
346+
```
347+
348+
Optional parameters:
349+
- `-Distro <name>` to target a non-default WSL distro
350+
- `-WorkspacePath </path/in/wsl>` if your clone is not at `~/hermes-workspace`
351+
- `-SessionName <name>` to use a custom tmux session name
352+
334353
### Verify the pairing
335354

336355
```bash
@@ -388,7 +407,7 @@ The Docker setup runs both the **Hermes Agent gateway** and **Hermes Workspace**
388407

389408
- **Docker**
390409
- **Docker Compose**
391-
- **Anthropic API Key**[Get one here](https://console.anthropic.com/settings/keys) (required for the agent gateway)
410+
- **A configured Hermes Agent model provider**run `hermes setup` / `hermes model`, or provide a key for whichever provider you use. This workspace does not require Anthropic.
392411

393412
### Step 1: Configure Environment
394413

@@ -402,8 +421,7 @@ Edit `.env` and add **at least one** LLM provider key — whichever provider you
402421

403422
```env
404423
# Pick one (or more). You do NOT need all of these.
405-
# ANTHROPIC_API_KEY=*** # Anthropic
406-
# OPENAI_API_KEY=sk-... # GPT / o-series
424+
# OPENAI_API_KEY=sk-... # GPT / o-series / OpenAI-compatible
407425
# OPENROUTER_API_KEY=sk-or-v1-... # OpenRouter (free models available)
408426
# GOOGLE_API_KEY=AIza... # Gemini
409427
```
@@ -654,7 +672,7 @@ Verify: `curl http://localhost:8642/health` should return `{"status": "ok"}`.
654672

655673
v2+ runs on vanilla `hermes-agent`. **No fork required.** The upstream ships every endpoint the workspace needs for chat, sessions, memory, skills, config, jobs, MCP, terminal, and Agent View.
656674

657-
**One known exception:** **Conductor** uses a dashboard plugin that hasn't landed upstream yet. When the workspace detects the missing endpoint, the Conductor screen shows a clear "Upstream not ready" placeholder with a link to [issue #262](https://github.com/outsourc-e/hermes-workspace/issues/262) instead of failing mid-action. Everything else works.
675+
**Conductor note:** when the dashboard mission API is available, Workspace uses it directly. When that endpoint is absent, Workspace uses its native Swarm fallback and returns `mode: native-swarm`. The fallback dispatches through Workspace Swarm workers, keeps status available through `/api/conductor-spawn?missionId=...`, and cancels through `/api/conductor-stop`.
658676

659677
If you're pinned to an older `hermes-agent` version and missing core endpoints, the workspace will degrade gracefully to **portable mode** with basic chat — upgrade upstream to restore full features.
660678

@@ -666,7 +684,7 @@ If using Docker Compose and getting auth errors:
666684

667685
```bash
668686
grep -E '_API_KEY' .env
669-
# Should show one of: ANTHROPIC_API_KEY, OPENAI_API_KEY, OPENROUTER_API_KEY, GOOGLE_API_KEY, ...
687+
# Should show one of: OPENAI_API_KEY, OPENROUTER_API_KEY, GOOGLE_API_KEY, or another provider key you intentionally use.
670688
```
671689

672690
(hermes-agent reads whichever key matches the provider configured in `~/.hermes/config.yaml`.)
@@ -729,13 +747,13 @@ The Docker setup runs both automatically — no action needed if using `docker c
729747
| Mobile PWA + Tailscale | Install as native-feeling app on any device |
730748
| Themes | Hermes / Nous / Bronze / Slate / Mono (light + dark) |
731749
| Capability gates | Graceful 'upstream not ready' placeholders |
732-
| Multi-provider | Anthropic, OpenAI, OpenRouter, Google, Ollama, LM Studio, vLLM, Atomic Chat |
750+
| Multi-provider | OpenAI/OpenAI-compatible, OpenRouter, Google, Ollama, LM Studio, vLLM, Atomic Chat, and other Hermes-supported providers |
733751

734752
### In progress 🔨
735753

736754
| Feature | Status |
737755
|---|---|
738-
| Conductor missions | Workspace UI is shipped; awaiting upstream dashboard plugin (see [#262](https://github.com/outsourc-e/hermes-workspace/issues/262)) |
756+
| Conductor missions | Workspace UI is shipped; uses dashboard mission API when available and Workspace-native Swarm fallback otherwise (see [#262](https://github.com/outsourc-e/hermes-workspace/issues/262)) |
739757
| Native Desktop App (Electron) | Spec'd; PWA install path works today |
740758

741759
### Coming 🔜

agents/builder/README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Builder
2+
3+
Profile: `builder`
4+
Wrapper: `builder:task`
5+
Modes: task
6+
7+
## Tools
8+
terminal, file, browser, web, gbrain, session_search, skills, todo
9+
10+
## Skills
11+
builder-core, gstack-for-hermes, test-driven-development, systematic-debugging, github-pr-workflow, requesting-code-review, codebase-inspection
12+
13+
## MCP servers
14+
gbrain
15+
16+
## Plugins
17+
none
18+
19+
This file mirrors `swarm.yaml` and the profile config under `~/.hermes/profiles/builder/`.

agents/inbox-triage/README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Inbox Triage
2+
3+
Profile: `inbox-triage`
4+
Wrapper: `inbox:triage`
5+
Modes: triage
6+
7+
## Tools
8+
gbrain, web, file, session_search, todo, skills, terminal
9+
10+
## Skills
11+
inbox-triage-core, gbrain, obsidian-markdown, gstack-for-hermes, defuddle, youtube-content
12+
13+
## MCP servers
14+
gbrain
15+
16+
## Plugins
17+
none
18+
19+
This file mirrors `swarm.yaml` and the profile config under `~/.hermes/profiles/inbox-triage/`.

agents/km-agent/README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# KM Agent
2+
3+
Profile: `km-agent`
4+
Wrapper: `km:health`
5+
Modes: health, curate
6+
7+
## Tools
8+
gbrain, file, terminal, session_search, skills, todo, cronjob, web
9+
10+
## Skills
11+
km-agent-core, gbrain, obsidian-markdown, obsidian-cli, obsidian-bases, json-canvas, gstack-for-hermes
12+
13+
## MCP servers
14+
gbrain
15+
16+
## Plugins
17+
none
18+
19+
This file mirrors `swarm.yaml` and the profile config under `~/.hermes/profiles/km-agent/`.

agents/maintainer/README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Maintainer
2+
3+
Profile: `maintainer`
4+
Wrapper: `maintainer:check`
5+
Modes: check
6+
7+
## Tools
8+
terminal, file, web, browser, gbrain, session_search, skills
9+
10+
## Skills
11+
maintainer-core, github-repo-management, github-pr-workflow, github-issues, github-code-review, gbrain, gstack-for-hermes, hermes-agent
12+
13+
## MCP servers
14+
gbrain
15+
16+
## Plugins
17+
none
18+
19+
This file mirrors `swarm.yaml` and the profile config under `~/.hermes/profiles/maintainer/`.

agents/ops-watch/README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Ops Watch
2+
3+
Profile: `ops-watch`
4+
Wrapper: `ops:health`
5+
Modes: health
6+
7+
## Tools
8+
terminal, cronjob, file, gbrain, skills, session_search, web
9+
10+
## Skills
11+
ops-watch-core, gbrain, hermes-agent, systematic-debugging, webhook-subscriptions
12+
13+
## MCP servers
14+
gbrain
15+
16+
## Plugins
17+
none
18+
19+
This file mirrors `swarm.yaml` and the profile config under `~/.hermes/profiles/ops-watch/`.

0 commit comments

Comments
 (0)