- make install.sh resilient when pnpm is only available via corepack
- cap pnpm build heap for low-memory installs
- relabel Workspace Kanban sidebar entry to Tasks and clarify copy
Co-authored-by: Aurora release bot <release@outsourc-e.com>
* 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
efcb7d14, 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>
Three additions to reduce onboarding friction:
1. docs/AGENT-PAIRING.md — step-by-step guide designed for AI agent
ingestion. Covers the full Workspace↔Gateway pairing flow from
scratch: hermes-agent install → env var setup → API server enable →
port verification → workspace .env → startup verification. Includes
platform-specific notes (WSL, macOS, Linux), a copy-paste quick-fix
block, and a diagnostic bundle command for when things go wrong.
2. docs/troubleshooting.md — human-readable FAQ covering the six most
common setup failures (API server not binding, mode=disconnected,
port conflicts, WSL cold-start race, dev server crashes, onboarding
error state). Each entry has cause → fix → verify.
3. install.sh — added a post-setup guard that scans ~/.hermes/.env for
env var names missing underscores (APISERVERENABLED vs
API_SERVER_ENABLED). The gateway reads exact names via os.getenv()
and silently ignores typos — this produces a 'gateway starts but API
server never binds' failure that's hard to diagnose from the UI.
The guard now warns the user with the correct names.
hermes-agent is not published to PyPI - pip install was always going to fail
with 'No matching distribution found'. Delegate to the official Nous
installer which handles PEP 668, uv, Termux, and source build properly.
Detected from user bug report:
curl -fsSL https://hermes-workspace.com/install.sh | bash
-> ERROR: No matching distribution found for hermes-agent[cron]
- Drop PyPI/pipx/venv/PEP 668 fallback chain (Nous handles it all)
- Require curl as prereq
- Ensure ~/.hermes/bin and ~/.local/bin on PATH after install
- Bail with helpful message if hermes not on PATH post-install
install.sh:
- The PEP 668 marker EXTERNALLY-MANAGED lives *inside* stdlib (e.g.
/usr/lib/python3.13/EXTERNALLY-MANAGED), not its parent. Our check
pointed at the parent so Ubuntu 25.10 / Python 3.13 was treated as
un-managed and tripped 'externally-managed-environment' on plain pip.
Now we check both locations and fall back to a 'pip install --dry-run'
probe that just reads stderr for the marker.
- ensure_pipx() auto-installs pipx via apt/dnf/pacman/brew when absent so
fresh Debian/Ubuntu boxes don't have to run an extra command first.
apt path tries 'pipx' then 'python3-pipx' for older releases.
- install_with_venv() now hints at python3-venv/python3-full when
'python3 -m venv' itself is missing on minimal Debian-family installs.
connection-startup-screen:
- After 4s of failed health polling, fire /api/start-hermes once silently.
If hermes-agent is installed and just not running, the gateway comes up
without the user clicking anything; the existing 2s polling loop sees
/health and dismisses the splash. The manual 'Auto-Start Hermes Gateway'
button stays as a fallback.
hermes-reconnect-banner:
- When the in-session probe flips to disconnected, fire /api/start-hermes
once silently with a 5-minute cool-down per restart attempt. Catches
gateway crashes (OOM, killed parent shell, quota loop) and brings it
back without requiring the user to click the banner. Falls back to the
existing 'Start Agent' button if the silent attempt fails.
- Drop skills/workspace-dispatch/SKILL.md (112 lines) into the repo so the
Conductor orchestrator gets real decomposition guidance on every spawn,
not the 'proceed using create_task to spawn workers' fallback.
- conductor-spawn: resolve skill path from this module's location
(import.meta.url -> repo root) so it works regardless of which directory
the dev server starts from. New search order:
1. <repo>/skills/workspace-dispatch/SKILL.md (bundled)
2. $cwd/skills/workspace-dispatch/SKILL.md
3. ~/.hermes/skills/workspace-dispatch/SKILL.md
4. ~/.ocplatform/workspace/skills/workspace-dispatch/SKILL.md
- install.sh: symlink every directory under <repo>/skills/* into
~/.hermes/skills/<name> so end users get the bundled skills available to
their hermes agent (not just to Conductor). Skips if target exists.
Verified: fresh conductor spawn now reads the real skill into the
orchestrator prompt ('# Workspace Dispatch (Single Agent)' visible in the
job output prompt instead of the not-found stub).
- Port clawsuite Operations module (screens/agents/*) — 265-line operations-screen,
8 components, 2 hooks, agent presets.
- Route /operations now renders OperationsScreen (was gateway AgentsScreen).
- Each Hermes profile = one Operations agent. use-operations.ts talks to
/api/profiles/{list,create,update,delete}. Default profile shown as 'Workspace'.
- New server fn updateProfileConfig + /api/profiles/update endpoint.
- cron-api.ts rewired to /api/hermes-jobs (was /api/cron/*). Friendly croniter
missing-dep hint.
- New /api/session-history + /api/session-send adapters so the embedded
ControlSuite chat components work against Hermes (/api/history + /api/send-stream).
- ChatScreen gains 'embedded' prop that disables auto-navigation side effects
so the real chat can be embedded in Operations orchestrator without yanking
users to /chat/$sessionKey on refresh/send.
- New Agent modal: template picker (Sage/Builder/Scribe/Ops/Trader/Blank) that
pre-fills emoji + description + system prompt from agent-presets.
- Surface pass for hermes-nous dark theme: swapped literal bg-white ->
bg-[var(--theme-card)] across all agents components (6 files).
- Stub src/hooks/use-agent-outputs.ts (clawsuite had dangling import; returns
empty list for now — outputs feed backend TBD).
- install.sh: handle PEP 668 (Debian 12+/Ubuntu 23.04+) via pipx-first,
venv-fallback. Include [cron] extra so hermes-agent has croniter.
The installer logic completed successfully, but the final success message
referenced shell variables that were never defined, causing:
bash: line 117: BOLD: unbound variable
Replace the final instructions block with plain text so the one-liner install
finishes cleanly under .
- Add install.sh: preflight-checked installer that pulls vanilla
hermes-agent from PyPI, clones the repo, configures .env, installs
deps. Idempotent, re-runnable.
- README: new 'One-line install' section with curl | bash command.
Demote Manual install section to secondary path.
- Banner tightened: 'v2 — zero-fork. Clone, don't fork.'
- Remove 'Earlier versions required a fork' retrospective from banner;
the fork is gone, we don't need to apologize for it.
- Model switch toast: drop 'enhanced fork' phrasing, use 'enhanced
runtime' (the fork no longer exists as a distinct thing; vanilla
provides the enhanced runtime).
- Update pinned-copy test accordingly.
One-liner for users:
curl -fsSL https://raw.githubusercontent.com/outsourc-e/hermes-workspace/main/install.sh | bash