2009 Commits

Author SHA1 Message Date
Eric
85e2f72b21 feat: add HermesWorld brand asset pack (#367)
Co-authored-by: Aurora release bot <release@outsourc-e.com>
2026-05-06 20:13:47 -04:00
Eric
dd0aedd132 docs: add HermesWorld bible and player guides (#368)
Co-authored-by: Aurora release bot <release@outsourc-e.com>
2026-05-06 20:13:37 -04:00
HermesWorld Bot
ecc90d3b51 feat(founders-vault): add Founders Vault inventory tab skeleton
v0.3 scope:
- Founders Vault tab visible in inventory side panel
- locked-state placeholder
- badge on bag icon when unclaimed
- uses locked palette (GOLD #F1C56D, MIDNIGHT #0F1622)
- no real gift granting yet (v0.4)

From swarm11 (issue #9). Reads from FOUNDERS-EVENT-INVENTORY.md spec.
2026-05-06 13:44:09 -04:00
HermesWorld Bot
0f4c2d57f7 docs: add HermesWorld guild/event/economy data contracts (swarm10) 2026-05-06 13:44:04 -04:00
HermesWorld Bot
78c5df1ddd fix(char-creator): avatar face no longer covered by hair/cap/customizer
- moves long hair side locks behind head
- replaces face-covering cap/long-hair ellipses with forehead-only paths
- renders eyes last so face remains visible across hair/helmet states
- z-index ordering fixed for portrait camera

From swarm10 lane (issue #1).
2026-05-06 13:43:59 -04:00
Eric
572497d115 Keep Workspace nav around HermesWorld embed
Restores shell chrome on /playground while keeping hosted HermesWorld in the content pane.
2026-05-06 01:00:44 -04:00
Eric
b77a37367f Embed hosted HermesWorld runtime
Routes /playground to hosted hermes-world.ai runtime and keeps the Workspace surface chrome-free.
2026-05-06 00:52:41 -04:00
Eric
d0d38b5848 fix(chat): render local MEDIA artifacts inline (#328) (#349)
Co-authored-by: Aurora release bot <release@outsourc-e.com>
2026-05-05 16:46:30 -04:00
Eric
4f177f9b8d feat(tasks): unify Workspace task board with Hermes Kanban backend (#311) (#348)
* wip(hermesworld): viral sprint checkpoint - landing rebuild + character pipeline scaffold

- standalone /hermes-world and /world routes bypass workspace shell
- root overlay leaks gated for landing + game surfaces
- character pipeline scaffolding (player/npc/glb-body components)
- canonical asset path public/assets/hermesworld/characters/
- docs: landing-page-spec, graphics-usability-plan, agora-believable-checklist, master-roadmap
- handoff at memory/goals/2026-05-05-hermesworld-viral-sprint/handoff.md

Local-only checkpoint. Not for upstream yet.

* feat(playground): persistent admin mode toggle with shield button

- Admin mode now persists via localStorage (key: hermes-playground-admin)
- Shield icon button in HUD (right rail, below focus toggle, md+)
- Click toggles admin panel and saves preference
- ?admin=1 URL param still works as override
- gitignore swarm worker scratch dirs

Mission: memory/swarm/missions/2026-05-05-pr-triage.md (5 swarm lanes dispatched on 19 open PRs, no-merge contract)

* feat(landing): add Play Now CTAs to HermesWorld landing

- Hero: Play Now (primary, gold), View on GitHub (demoted), Read Roadmap
- Header nav: Play badge (highlighted gold)
- Final CTA: Play Now (primary), GitHub + Roadmap (secondary)

All Play buttons go to /playground which mounts the title screen
(username + character customizer + Enter). Sets up the public-URL
deploy: hermes-world.ai → / serves landing → click Play → /playground.

* fix(tasks): use shared kanban backend

---------

Co-authored-by: Aurora release bot <release@outsourc-e.com>
2026-05-05 16:46:24 -04:00
Eric
491a152b33 fix: add groq stt controls to workspace settings (#347)
Co-authored-by: Aurora release bot <release@outsourc-e.com>
2026-05-05 16:46:18 -04:00
Eric
838b060702 fix: render inline artifact tags in chat (#346)
Co-authored-by: Aurora release bot <release@outsourc-e.com>
2026-05-05 16:46:13 -04:00
Eric
9b61256f13 fix: clarify server-side file browser mode (#345)
Co-authored-by: Aurora release bot <release@outsourc-e.com>
2026-05-05 16:46:07 -04:00
Eric
4870885093 fix: send job prompt as input (#344)
Co-authored-by: Aurora release bot <release@outsourc-e.com>
2026-05-05 16:26:43 -04:00
Eric
acb714c522 fix(chat): scope sends to active workspace (#340) (#343)
Co-authored-by: Aurora release bot <release@outsourc-e.com>
2026-05-05 16:26:37 -04:00
Eric
8058da2164 fix: merge Hermes models into Operations picker (#342)
Co-authored-by: Aurora release bot <release@outsourc-e.com>
2026-05-05 16:26:32 -04:00
Eric
c2233f9176 fix: preserve tmux startup failures for swarm workers (#341)
Co-authored-by: Aurora release bot <release@outsourc-e.com>
2026-05-05 16:26:27 -04:00
Serge/Grish
c934d59fda feat: add VITE_HERMESWORLD_ENABLED env var to optionally hide HermesWorld link (#322)
Allow operators to hide the HermesWorld sidebar link by setting
VITE_HERMESWORLD_ENABLED=0 in .env.  Default is enabled (1).

Closes the gap for users who don't want gamification/playground links
in their workspace sidebar.
2026-05-05 15:25:01 -04:00
Interstellar-code
5486f45ab5 fix(gateway): report config capability fields correctly (#318) 2026-05-05 15:24:55 -04:00
jarnodevries-byte
4f1bf50105 fix: harden workspace swarm prompt submission (#307)
Co-authored-by: Jarno de Vries <jarno@match-day.nl>
2026-05-05 15:23:27 -04:00
CarloooK
1b3ebdefb4 docs(dirsize): add requirement analysis and technical design (#338)
* docs(dirsize): add requirement analysis and technical design

* docs(design): add exit codes and usage examples
2026-05-05 15:23:21 -04:00
nachumi-a2zoperations
539c1877c7 feat(mcp): add offset-based pagination to marketplace search (#325)
Replace fetch-and-slice with proper offset/limit pagination so
the marketplace can show all results, not just the first 20.

Server (src/routes/api/mcp/hub-search.ts):
- accept ?offset=N query param (default 0, clamped to >=0)
- raise the limit cap from 100 to 500

Server (src/server/mcp-hub/index.ts):
- unifiedSearch now takes an offset parameter and returns
  filtered.slice(offset, offset + limit). The dedup + filter
  pipeline runs once per request (same as before); only the
  final slice changed.

Client (src/screens/mcp/hooks/use-mcp-hub.ts):
- rewrite useMcpHub from useQuery to useInfiniteQuery
- page size 50; getNextPageParam returns undefined when
  loaded >= total
- flatten data.pages[].results into a single data.results
  array externally so existing callers keep working

UI (src/screens/mcp/mcp-screen.tsx):
- add Load more button under MarketplaceGrid
- shows current loaded count of total
- hides automatically when hasNextPage is false

Result: with the 11 sources I have configured, total dedup
returned ~301 results. Before: capped at 20. After: paginates
through all 301.
2026-05-05 15:23:12 -04:00
Interstellar-code
4ec71290cd fix: bridge Codex OAuth tokens to portable-mode chat bearer auth (#332)
When HERMES_API_TOKEN and CLAUDE_API_TOKEN are not set, getBearerToken()
now falls back to reading the Codex OAuth access token from
~/.codex/auth.json. This fixes portable-mode (non-gateway) chat failing
with 401 invalid_api_key for users who authenticated via 'codex login'.

Fixes #329
2026-05-05 15:23:06 -04:00
Interstellar-code
112e618f9a fix(conductor): fall back when dashboard mission api is unavailable (#317) 2026-05-05 15:23:00 -04:00
Interstellar-code
978b4a9421 fix(routes): regenerate routeTree.gen.ts with gateway-reprobe route (#327)
The committed routeTree.gen.ts was missing entries for the
/api/gateway-reprobe route even though the route file exists.
The TanStack Router plugin regenerates the tree on every dev
server start, creating a permanent dirty working tree that
blocks git pull/merge operations.

Regenerate and commit the tree so it matches what the plugin
produces. Fixes #326.
2026-05-05 15:22:54 -04:00
Interstellar-code
284eba0ff5 fix(chat): preserve workspace session identity during streams (#310) 2026-05-05 15:22:49 -04:00
jarnodevries-byte
ba24b3a612 fix: allow workspace production server to start (#308)
Co-authored-by: Jarno de Vries <jarno@match-day.nl>
2026-05-05 15:22:28 -04:00
Aurora release bot
ec19ca6de7 fix(update): hide blocked/conflicting update banners; docs(hermesworld): add visual upgrade spec
Update banner:
- top-of-app update banners now only show when a one-click update is actually safe
- dirty checkouts, non-main branches, and blocked/conflicting repo states stay out of the global banner
- those states still belong in an advanced update center / dev-facing surface, but not in normal-user chrome

HermesWorld:
- add docs/hermesworld/visual-upgrade-spec.md
- locks the TinySkies-informed polish direction into a concrete execution spec
- covers lighting, landmarks, silhouettes, HUD cohesion, path readability, zone identity, phased rollout, and swarm/kanban-friendly task breakdown

This gives us a stable product target for an Opus-led visual polish pass while keeping mainline update UX calmer for normal users.
2026-05-04 14:21:57 -04:00
Aurora release bot
d12f692a44 fix(ui): allow right-click on update cards (#286); feat(chat): inline artifact cards (#295)
Two UX improvements in one pass:

#286 — update modal/right-click on Firefox/Linux

The update-center cards and release-notes modal lived inside motion/
backdrop layers with no explicit context-menu handling. On Firefox/Linux
this could make right-clicks feel swallowed or intermittently unresponsive.
There was no direct preventDefault in our code, the event was getting lost
in the wrapper stack.

Fix:
- Add onContextMenu stopPropagation to the update card and release-notes
  modal container so the native context menu can open on the card itself
  instead of bubbling into the backdrop/motion layers.
- Add select-text so copy/select interactions work naturally.

#295 — inline artifact rendering in chat (first slice)

The streaming pipeline already received a dedicated artifact event from
send-stream, but we flattened it into a generic tool-complete string like:

  "Artifact created - /path/to/file"

That meant the chat renderer had no structured metadata and could only show
an ordinary tool row. This pass preserves the artifact fields and renders a
first-class inline artifact card in the message stream:

- use-streaming-message now keeps artifact metadata (title, kind, path,
  preview) on the tool event instead of discarding it into a plain string.
- message-item detects tool sections whose type starts with artifact: and
  renders a dedicated card with title, artifact kind badge, file path,
  Open action, and preview text when provided by the stream.
- Generic tool input/output blocks are suppressed for artifact rows so the
  card doesn't duplicate itself.

This is deliberately a thin first slice, enough to stop artifacts from
feeling invisible and generic in chat, while leaving room for a richer
multi-pane/Claude.ai-style artifact surface later.

Refs #295 and closes #286.
2026-05-04 13:12:36 -04:00
Aurora release bot
9469f999a0 feat(files): HTML preview mode in file browser (#296)
HTML files previously opened only in the code editor path, so users had
no way to render an .html file in-place and quickly inspect the actual
page. This was especially awkward for generated artifacts, landing pages,
and static exports.

Changes:
* New isHtmlFile() helper (html / htm)
* File header Preview/Raw toggle now applies to HTML as well as Markdown
  and uses clearer button copy: 'Raw HTML' / 'Preview HTML'
* New HTML preview branch renders file content in a sandboxed iframe via
  srcDoc, keeping it isolated from the workspace page while still letting
  CSS/layout load naturally inside the preview

Sandbox mode is  only — no scripts/forms/popups/nav.
That gives users a faithful layout preview without turning the file
browser into a script execution surface.

Closes #296
2026-05-04 12:33:57 -04:00
Aurora release bot
2a088b1215 fix(gateway): faster recovery from disconnected state + docker docs (#275)
#275 reported workspace stuck on 'Disconnected' even though the agent
was reachable. Root cause: workspace boots before agent in docker
compose, every probe fails, capabilities cached as zero-state for the
full 120s TTL. By the time the agent comes up, the cache is still
stale and the UI looks broken.

Changes:

* effectiveProbeTtl(): 120s when healthy, 15s when disconnected. The
  shorter window during 'mode=disconnected' state means a stack where
  workspace lost the race to the agent recovers within ~15s of the
  agent becoming reachable, instead of being stuck on the first failed
  probe for two minutes.

* New POST /api/gateway-reprobe endpoint: forces a fresh probe
  regardless of TTL. Useful for diagnostic scripts and a future UI
  'Reconnect' button. Auth-gated (same as /api/gateway-status).

* New forceReprobeGateway() helper exported from gateway-capabilities.

* New docs/docker.md: comprehensive setup guide covering single-host,
  multi-host (NAS/VPS), capability mismatches, and a step-by-step
  diagnostic playbook for connection failures. Cross-references the
  new /api/gateway-reprobe endpoint.

Foundation for #275 — the docs + faster recovery cover the most common
cases. Outstanding work: better startup ordering hint when probes fail
because the agent isn't up yet (toast + 'Reconnect' button in the UI)
and a CI test that boots both services in compose to catch regressions
in the connection contract.
2026-05-04 11:41:05 -04:00
Aurora release bot
46f2de149a fix(ui): switch shows ON/OFF labels and uses emerald accent for clarity (#284)
The plain dark/light pill toggle was ambiguous — users couldn't tell at
a glance which side meant 'on' (especially in dark themes where the
unchecked grey and checked dark-blue tones read similarly).

Changes:
* Track is wider (2.4× thumb instead of 2×) to fit visible labels.
* Checked state uses emerald-600 instead of primary-900 — green is a
  near-universal 'on' signal.
* 'ON' label appears on the left of the thumb when checked (white on
  emerald, high contrast).
* 'OFF' label appears on the right of the thumb when unchecked
  (muted-fg on neutral track).
* Labels are aria-hidden — the underlying SwitchPrimitive.Root already
  exposes role/checked state to assistive tech, so duplicating it as
  visible text would just create noise for screen-reader users.

Closes #284
2026-05-04 11:30:34 -04:00
Aurora release bot
3c23ff5971 fix(jobs): render structured error bodies as readable text instead of [object Object] (#304)
Reported in #304: clicking Create Job displayed a toast that read
'[object Object]' instead of an actionable error.

Root cause: every error path in src/lib/jobs-api.ts coerced the
response body's .detail field directly into a template literal:

    throw new Error(body.detail || `Failed to create job: ${res.status}`)

When the gateway returns a structured error (FastAPI/Pydantic
validation arrays, plain objects), .detail is not a string so the
Error message renders as the literal '[object Object]' once it goes
through React's toast.

Fix: a single errorMessageFromBody() helper that:
* Returns string detail as-is
* Joins arrays of validation errors using msg/message fields
* JSON-stringifies anything else
* Falls back to body.message, body.error, then the original status text

Wired into createJob, updateJob, deleteJob, pauseJob, resumeJob,
triggerJob \u2014 all six job mutation paths had the same bug.

Closes #304
2026-05-04 11:28:11 -04:00
Kade Ross
a7c5cae2a0 fix: add legacy claude-workspace/claude-agent remote aliases for update checker (#306)
Installs that were set up before the claude→hermes rename may have their
git remotes named claude-workspace and claude-agent rather than the new
hermes-workspace / hermes-agent names. Without these aliases the update
checker misidentifies the remote, reports no update URL match, and the
Update Center shows a misleading error.

Adds backward-compatible aliases so both old and new remote naming
conventions are recognised.

Co-authored-by: admin <admin@fattony.local>
2026-05-04 11:25:36 -04:00
Kade Ross
2f41006e48 fix: normalize jobs API response shape to always return {jobs:[]}\n\nSome Hermes gateway versions return a bare array from /api/jobs instead\nof the expected {jobs:[]} envelope. The workspace jobs screen then fails\nto render because it destructures .jobs on the response.\n\nAdd a jobsResponse() helper that wraps bare arrays so the workspace UI\nnever has to special-case both shapes. Fixes #162. (#305)
Co-authored-by: admin <admin@fattony.local>
2026-05-04 11:25:28 -04:00
Aurora release bot
d6cd827367 feat(kanban): badge + dashboard deep-link + 5s polling for proxy mode
When the workspace's swarm kanban is running in proxy mode against the
Hermes Dashboard kanban plugin (caps.kanban === true), the header badge
now:

* Renders in green ('Synced • Hermes ↗') instead of generic gray
* Becomes a clickable link to the dashboard's /kanban tab
* Tooltips include 'Open in Hermes Dashboard ↗'

Polling reduced from 30s → 5s so cards added/moved on the Hermes
dashboard show up in the workspace board within ~5s. The plugin also
exposes a WebSocket at /api/plugins/kanban/events for true live updates;
that's the next item on the kanban roadmap.

The 'hermes-proxy' badge tone is added alongside the existing 'claude'
(legacy direct-sqlite) and 'local' (file-backed) tones.
2026-05-04 11:23:31 -04:00
Aurora release bot
ac01abff28 feat(kanban): proxy /api/swarm-kanban to Hermes dashboard kanban plugin when available
Builds on the kanban capability detection (commit 2526984fa). When the
upstream Hermes Agent dashboard exposes the kanban plugin
(/api/plugins/kanban/, caps.kanban === true), the workspace's /swarm
kanban surface now syncs with it as a single SQLite source of truth
instead of running a separate file-backed store.

Architecture:

  ┌─────────────────┐       ┌──────────────────┐
  │ Hermes Workspace │       │ Hermes Dashboard │
  │ /swarm kanban   │──────▶│ /kanban          │
  │ (React UI)      │  HTTP │ (React UI)       │
  └─────────────────┘  proxy└──────────────────┘
        │                          │
        │       both read/write    │
        └────────┬─────────────────┘
                 ▼
        ~/.hermes/kanban.db
        (one SQLite, dispatcher-aware)

Why HTTP proxy and not direct SQLite (we still have that path too)?
Remote workspaces (Docker, VPS, separate machines from the agent)
can't share the SQLite file. Going through HTTP is the only viable
path for those deployments. The plugin's transactional helpers also
keep the workspace from racing the dispatcher on running/claimed
state — the dashboard rejects direct writes to 'running' for that
reason (only the dispatcher's claim path may transition into running).

Changes:

* New src/server/kanban-dashboard-proxy.ts: thin HTTP client for
  /api/plugins/kanban/board, /tasks, /boards. Unwraps the {task: ...}
  envelope the plugin returns.

* src/server/kanban-backend.ts: new dashboardProxyBackend (id:
  'hermes-proxy'). resolveKanbanBackend() now picks proxy first when
  caps.kanban is true, falling back to the legacy direct-SQLite
  claudeBackend when only the DB is reachable, then to the local
  file-backed store. Override via CLAUDE_KANBAN_BACKEND env var:
  'local' | 'claude' | 'hermes-proxy' | 'auto' (default).

* lane↔dashboard status mapping handles two quirks:
  - 'running' from the workspace UI is rewritten to 'ready' before
    posting (dashboard rejects direct writes of running; dispatcher
    will pick the task up on next tick).
  - 'review' (workspace-only lane) maps to 'ready' for visibility.

* listKanbanCards / createKanbanCard / updateKanbanCard are now
  async; /api/swarm-kanban awaits them. Tests updated.

Tested locally end-to-end against
/Users/aurora/hermes-dashboard-fresh/repo (upstream main with kanban
plugin). Cards created via /api/swarm-kanban appear in the dashboard
at http://127.0.0.1:9119/kanban and vice-versa, status changes
propagate, and dispatcher transitions are respected.

Foundation for the v2.3.0 kanban-sync user-visible work (UI badge,
dashboard deep-link, live WebSocket updates).
2026-05-04 11:07:34 -04:00
Aurora release bot
2526984fae feat(capabilities): detect Hermes kanban plugin (foundation for /swarm <-> dashboard sync)
Adds capability detection for the upstream Hermes Agent kanban plugin
mounted at /api/plugins/kanban/. Lays the groundwork for the v2.3.0
work where the workspace's /swarm kanban surface syncs with the
dashboard's SQLite-backed kanban DB.

Changes:

* gateway-capabilities.ts: new probeKanban() probes
  /api/plugins/kanban/board on the dashboard URL with a short timeout.
  GatewayCapabilities now carries a 'kanban' boolean. Probed once per
  PROBE_TTL_MS alongside conductor.

* connection-status.ts: surfaces caps.kanban so client-side feature
  gates can react.

* use-feature-capability.ts + feature-gates.ts: 'kanban' is now a
  recognized FeatureKey / EnhancedFeature so useFeatureCapability('kanban')
  works.

* .env.example: documents HERMES_DASHBOARD_URL (default 127.0.0.1:9119
  on current Hermes Agent v0.13+; the legacy 9120 is gone).

Tested locally with hermes-agent main pulled into
/Users/aurora/hermes-dashboard-fresh/repo. Workspace gateway-status
now reports kanban: true when the plugin is mounted, false otherwise.
2026-05-04 10:57:46 -04:00
Aurora release bot
bba4c08f57 fix(terminal): keep PTY alive across SSE disconnects + auto-reattach (#298)
The browser terminal periodically 'reset back to prompt' during normal
use because any transient SSE disconnect (network blip, browser tab
suspension, HMR reload, dev-server restart) tore down the user's PTY
and dropped them into a fresh shell.

Root cause: terminal-stream's request.signal abort handler called
session.close(), which SIGTERM'd the underlying Python PTY helper.
There was also no auto-reconnect on the client \u2014 a single dropped
read terminated the loop, called /api/terminal-close, cleared the
tab's sessionId, and left the user with an idle tab.

Fix in three parts:

1) terminal-sessions: TerminalSession gains markDetached() and
   markAttached(). markDetached() starts a TTL timer (default 5 min,
   override via HERMES_TERMINAL_DETACH_TTL_MS) that reaps the PTY only
   if no client reattaches in time. The map keeps the session live in
   the meantime.

2) terminal-stream: accepts an optional sessionId in the POST body. If
   the id matches a still-alive session, the route reattaches to it
   instead of spawning a fresh PTY. The 'session' event payload now
   includes a 'reattach' flag. On SSE abort, we just detach listeners
   and call session.markDetached() \u2014 the PTY stays running.

3) terminal-workspace: passes sessionId on every connect, so reconnect
   reattaches automatically. When the read loop ends and the tab still
   has a sessionId, we attempt a single quick reattach with a
   '[reconnecting...]' nudge to the user instead of tearing the tab
   down. /api/terminal-close is no longer called on stream end \u2014 the
   server-side TTL handles abandoned sessions.

Fixes #298
2026-05-04 09:08:33 -04:00
Aurora release bot
758c51635f fix(chat): cross-session response contamination + /new opens previous chat (#297, #300)
Two related session-routing bugs that landed responses (or new-chat
clicks) into the wrong session.

#297 — cross-session response contamination

When the user navigated to a new chat while a previous chat was still
streaming, the previous chat's response chunks would land in the
**new** chat. Three fixes:

* useStreamingMessage now bumps a streamGenerationRef on every
  startStreaming call. The fetch-reader loop captures that token at
  start and re-checks it on every reader.read() and between events
  in the same batch. If the token has changed (because the user
  started a different stream), the loop cancels the reader and exits
  without dispatching anything. This closes the brief race between
  abortController.abort() and the underlying fetch reader actually
  stopping, during which buffered chunks were silently writing into
  activeSessionKeyRef.current (which had already been switched to
  the new session).

* chat-screen now cancels the in-flight stream on session-key change
  via a useEffect keyed on (activeCanonicalKey, activeFriendlyId,
  isNewChat). Previously nothing cancelled the stream on navigation
  \u2014 only the user clicking the explicit Stop button (handleStop)
  called cancelStreaming().

#300 — /new slash command opens last chat instead of new session

/new was calling navigate({ to: '/chat' }), but the /chat index route
unconditionally redirects to localStorage('claude-last-session'), so
/new always landed in whichever chat was last active. Fixed at three
entry points so all 'new chat' actions go through the explicit 'new'
sentinel:

* /new in chat-screen.handleUiSlashCommand
* /new in command-palette.runSlashCommand
* 'New Chat' quick-action tile in the search modal

The 'Chat' nav link in the sidebar still goes to /chat (= last session)
\u2014 that's the correct behaviour for a screen-level nav target. Only
'new' actions are routed to the new sentinel.

Closes #297, #300
2026-05-04 09:05:10 -04:00
Fungraphic
514256b213 feat(theme): add SciFi theme (dark + light variants) (#303)
* feat(theme): add SciFi theme (dark + light variants)

- Add scifi-theme.css with neon accents, glow effects, gradient backgrounds
- Register SciFi in theme.ts with dark/light color schemes
- Add SciFi option in settings UI
- Import scifi-theme.css in styles.css

* docs: add SciFi theme screenshot

---------

Co-authored-by: Fungraphique <fungraphique@jarvis.local>
2026-05-04 08:57:18 -04:00
jarnodevries-byte
d0446fdcc3 fix: stabilize workspace swarm process spawning (#302)
Co-authored-by: Jarno de Vries <jarno@match-day.nl>
2026-05-04 08:57:12 -04:00
Aurora release bot
cf4fdd530c chore(release): v2.2.0
Some checks failed
Build & publish Docker image / build-and-push (push) Has been cancelled
HermesWorld release. 222 commits since v2.1.3.
v2.2.0
2026-05-04 02:04:34 -04:00
Aurora release bot
fdb7f6d85f feat(swarm): support HERMES_TMUX_BIN override for non-standard tmux installs (#244)
Reported in #244: a fresh hermes-workspace install on a host where
tmux lives outside of the hard-coded candidate list ("~/.local/bin",
"/opt/homebrew/bin", "/usr/local/bin", or PATH "tmux") shows
'can't find pane: swarm-<id>' for every dispatch because resolveTmuxBin()
returns null.

Adds:

* HERMES_TMUX_BIN (and CLAUDE_TMUX_BIN as legacy alias) env var that
  takes precedence over the candidate list in resolveTmuxBin().
* Mirror in tmuxIsInstalled() so the swarm runtime UI doesn't show
  'tmux not installed' on hosts that just have it elsewhere.
* /usr/bin/tmux added to the candidate list (typical Debian/Ubuntu
  package layout).

Refs #244
2026-05-04 02:02:46 -04:00
Aurora release bot
eb024d4378 fix(connection-status): return full capabilities payload in dev (#285)
The vite dev server intercepted /api/connection-status with a slim
inline shortcut handler that returned only {ok, mode, backend} \u2014
silently overriding the real route at src/routes/api/connection-status.ts
which returns the full ConnectionStatus payload.

Downstream feature gates (useFeatureCapability, useFeatureAvailable)
read .capabilities from the response. With the slim body, every
capability evaluated to undefined, so dev users got UI states that
looked like 'feature not available' even when the gateway was healthy
and exposing the API.

Fix: drop the inline shortcut entirely. The real route file already
caches via ensureGatewayProbed() (PROBE_TTL_MS), so the cost in dev
is negligible and the payload is correct everywhere.

Closes #285. Also drops the now-unused dashboard URL / token / cache
locals in vite.config.ts that were only used by the deleted handler;
the per-PR work that introduced them (#288, #289) was the
right diagnosis but the wrong fix \u2014 the real route was already
doing it correctly.
2026-05-04 02:00:30 -04:00
Aurora release bot
b69f5f2a04 fix(update-banner): show full block reason, repo path, and blocking files (#293)
The update banner truncated its subtitle ('Hermes Agent checkout has
local c...') and never told the user which files were causing the
block. The update-system already detects dirty checkouts but did
not surface the file list to the UI.

Changes:
* Server: ProductUpdateStatus gains an optional blockingFiles array.
  When isDirty(repoPath) is true, listDirtyFiles() runs git status
  --porcelain and returns up to 24 paths.
* Client: UpdateCenterNotifier removes the truncate class on the
  subtitle when blocked (so the full reason is visible), shows the
  repo path so the user can tell which checkout is dirty, and lists
  up to 8 blocking files with an overflow indicator.
* Reason copy mentions 'remove the listed files' so a user with
  untracked files knows what action to take.

Closes #293
2026-05-04 01:56:53 -04:00
Aurora release bot
54671ab44f fix(search): chats scope matches derived title/preview, not just session id (#291)
Reported in #291. The Search Modal's 'Chats' scope returned 'No
results found' even when sessions clearly existed.

Root cause: fetchSessions() was mapping the API response into
SearchSession with title = friendlyId (the raw cron-style id like
cron_b297a166a31e_20260503_122019), and the filter only searched
friendlyId/key/title. So a human query like 'github' or 'workflow'
never hit anything.

Changes:
* fetchSessions now reads derivedTitle and preview from the API,
  prefers derivedTitle for title, and falls back to startedAt when
  updatedAt is missing.
* filterResults call for chats now includes 'preview' alongside
  friendlyId/key/title.

Closes #291
2026-05-04 01:52:37 -04:00
Aurora release bot
2f431db599 fix(search): replace hardcoded recent-search placeholders with real localStorage-backed history (#292)
Recent Searches in the search modal previously displayed four
placeholder strings ('streaming fixes', 'session timeout', etc.)
that never updated.

Changes:
* Adds recentSearches + recordRecentSearch + clearRecentSearches to
  the useSearchModal Zustand store, persisted to localStorage under
  hermes-recent-searches-v1 (cap 6, dedupe by case-insensitive match).
* Records the trimmed query on result selection (mouse, Enter, or
  numeric shortcut). Queries shorter than 2 chars are skipped.
* QuickActions hides the Recent Searches section entirely when there
  is no history yet.

Closes #292
2026-05-04 01:50:47 -04:00
Aurora release bot
0c86802d50 feat(settings): custom OpenAI-compatible provider UI with API key management (#287)
From @Interstellar-code's PR #287. Resolves merge conflicts with the
matrix theme (#279) and provider-card verified-status fix (#282) that
landed earlier in the batch. Closes #287.

* Adds 'Custom' provider card to the settings dialog \u2014 always clickable
  (not gated by red dot)
* Adds editable Custom Endpoint section (Base URL + API key) in the
  provider card flow
* Adds matching Custom Providers section to the full /settings page
  with Base URL and CUSTOM_API_KEY support

Co-authored-by: Interstellar-code <Interstellar-code@users.noreply.github.com>
2026-05-04 01:46:46 -04:00
Aurora release bot
ce4fab300d fix(vite): point /api/sessions probe at dashboard URL, add auth header & ignore noise
Combines two community contributions and one local correction:

* PR #289 (Sanjays2402): probe /api/sessions on the dashboard URL
  (default :9119) instead of the agent URL (:8642). The agent does not
  serve /api/sessions, which produced a 404 every 15s. Adds a small
  cache so success/failure responses don't refetch every poll. Closes #276.

* PR #288 (Interstellar-code): send Authorization: Bearer
  $HERMES_API_TOKEN on the connection-status probes so a gateway
  secured with API_SERVER_KEY is detected correctly. Adds watch.ignored
  for .runtime/.tanstack/.omc/.omx/coverage/dist/etc. so these noisy
  internal paths don't fire spurious dev reloads.

* Local correction: did NOT add '**/routeTree.gen.ts' to watch.ignored.
  An existing regression test (src/router-route-resolution.test.ts)
  forbids that — ignoring the generated route tree breaks route HMR.
  The real cause of routeTree.gen.ts thrash is multiple concurrent
  vite dev servers writing to the same file (fixed earlier today).

Co-authored-by: Sanjays2402 <Sanjays2402@users.noreply.github.com>
Co-authored-by: Interstellar-code <Interstellar-code@users.noreply.github.com>
2026-05-04 01:43:53 -04:00
Interstellar-code
e8caa21b99 fix: correct vite dev proxy port and /cron route link (#283)
Fixes #276

Fixes #277
2026-05-04 01:41:52 -04:00