Commit Graph
100 Commits
Author SHA1 Message Date
51c3f0c62a [codex] harden recursive skill scan (#876)
* fix: recursive skill scan for nested sub-category directories

The Web UI skill scanner (scanSkillsDir) only checked one level deep:
skills/<category>/<subdir>/SKILL.md. Sub-category containers like
mlops/evaluation/ (which has DESCRIPTION.md + subdirs but no SKILL.md)
were skipped entirely, hiding all 12 nested skills under mlops.

Changes:
- scanSkillsDir: extract collectSkills() recursive helper that depth-first
  searches for SKILL.md at every level under a category directory.
  Directories without SKILL.md but with subdirectories are recursively
  descended into.
- listFiles handler: replace hardcoded join(category, skill) path with
  recursive findSkillDir() search, so nested skill file browsing works
  (e.g., mlops/evaluation/lm-evaluation-harness).

Fixes mlops category showing 1 skill instead of 13. All 20 other
categories verified with zero regression.

* fix: pA handler also needs recursive search for nested skill file content

The readFile_ (pA) handler was constructing direct paths like
skills/category/skill/... which fails for nested sub-category
skills (mlops/evaluation/lm-evaluation-harness). Added fallback
recursive search when direct path returns 404.

Also fixed listFiles (sA) handler to use recursive search for
the same reason - previous fix to dist was not in source TS.

Verified:
- lm-evaluation-harness SKILL.md content: 200 
- vllm SKILL.md: 200 
- huggingface-hub (non-nested): 200 
- reference file in nested skill: 200 

* fix: pA handler also needs recursive search for nested skill file content

The readFile_ (pA) handler was constructing direct paths like
skills/category/skill/... which fails for nested sub-category
skills (mlops/evaluation/lm-evaluation-harness). Added fallback
recursive search when direct path returns 404.

Also fixed listFiles (sA) handler to use recursive search for
the same reason - previous fix to dist was not in source TS.

Verified:
- lm-evaluation-harness SKILL.md content: 200 
- vllm SKILL.md: 200 
- huggingface-hub (non-nested): 200 
- reference file in nested skill: 200 

* harden recursive skill lookup

---------

Co-authored-by: gs <gs@localhost>
Co-authored-by: gutanulaif <gutanulaifa@gmail.com>
2026-05-20 15:38:56 +08:00
ekko 866d243978 update 0.5.31 changelog (#874) 2026-05-20 15:34:09 +08:00
ekko 204058502e add apikey image generation media endpoint (#872) 2026-05-20 15:10:30 +08:00
ekkoandCodex 201330652d fix: raise mobile session drawer overlay (#871)
Co-authored-by: Codex <codex@openai.com>
2026-05-20 15:06:12 +08:00
ekko c90eba226d [codex] add customizable profile avatars (#870)
* add customizable profile avatars

* keep profile avatar visible when sidebar collapses

* simplify collapsed profile avatar styling

* force managed gateway startup in docker

* limit gateway autostart to active profile

* restore all profile gateway autostart

* fix managed gateway runtime detection
2026-05-20 14:15:01 +08:00
ekko 663afb61ff Improve profile runtime controls (#868)
* Improve profile runtime controls

* Restore profile selector test id

* Update profile switch e2e flow
2026-05-20 12:59:34 +08:00
ekko 210b0ee6c2 Harden bridge broker restart (#862) 2026-05-20 10:02:15 +08:00
ekko 0547fd6b6a [codex] Harden context compression history handling (#848)
* Use token threshold for chat compression

* Add compression settings controls

* Use config for chat compression

* Cover protected messages in compression tests

* Remove message-count compression limit

* Harden compression window fallback

* Rebuild stale compression snapshots

* Harden stale compression snapshots

* Update changelog for compression hardening

* Prefer local history session details
2026-05-19 17:58:39 +08:00
ekko 84e343fc22 Add 0.5.30 changelog (#846) 2026-05-19 16:19:56 +08:00
ekkoandCodex 9a9416c99c Fix bridge history, profile models, and Windows gateway handling (#845)
* feat: support profile-aware group chat bridge flows

* feat: route cron jobs through hermes cli

* Fix group chat routing and isolate bridge tests

* Add Grok image-to-video media skill

* Default Grok videos to media directory

* Fix bridge profile fallback and cron repeat clearing

* Refine bridge chat and gateway platform handling

* Filter bridge tool-call text deltas

* Preserve structured bridge chat history

* Prepare beta release build artifacts

* Fix Windows run profile resolution

* Fix Windows path compatibility checks

* Fix profile-scoped model page display

* Hide Windows subprocess windows for jobs and updates

* Hide Windows file backend subprocess windows

* Avoid Windows gateway restart lock conflicts

* Treat Windows gateway lock as running on startup

* Force release Windows gateway lock on restart

* Tighten Windows gateway lock cleanup

* Update chat e2e source expectation

* Bump package version to 0.5.30

---------

Co-authored-by: Codex <codex@openai.com>
2026-05-19 16:09:59 +08:00
ekkoandchenxusheng d2cbce2f13 Adjust outline user item background (#836)
* feat:新增大纲功能

* Adjust outline user item background

---------

Co-authored-by: chenxusheng <chenxusheng@haizhi.com>
2026-05-19 08:25:01 +08:00
ekko bbfd818106 update zai models and sidebar divider (#819) 2026-05-17 20:47:52 +08:00
ekko aff3546677 fix: route fun codex through responses api (#815) 2026-05-17 16:17:32 +08:00
ekko ce5a9bb012 Harden env parsing and writes (#814) 2026-05-17 15:39:31 +08:00
ekko 6516d86dfc Limit run-time model list waiting (#812) 2026-05-17 12:51:23 +08:00
ekko 5e8f8bd4a1 Add session-level bridge model settings (#811) 2026-05-17 12:20:53 +08:00
ekko fa035f348e Fix Windows local file download paths (#810) 2026-05-17 11:09:28 +08:00
ekko bcfc5053c4 Add 0.5.26 changelog (#809) 2026-05-17 10:09:25 +08:00
ekko 53f0301da4 Add Hermes Agent package fallback and xAI OAuth (#808) 2026-05-17 09:45:56 +08:00
ekkoandZhicheng Han 0c2bafc619 [codex] Add local tool trace toggle (#806)
* test: harden tool approval browser contract

* test: cover tool trace display edge cases

* test: cover resumed tool trace edge cases

* feat: hide tool traces by default

* Add local tool trace toggle

---------

Co-authored-by: Zhicheng Han <zhicheng.han@mathematik.uni-goettingen.de>
2026-05-17 09:01:59 +08:00
ekkoandCodex 569ddc28da fix(logs): keep loading state below filters (#802)
Co-authored-by: Codex <codex@openai.com>
2026-05-16 22:49:09 +08:00
ekkoandGaoZzr 840cb6cd9f fix: correct session reset mode options (#800)
* fix: correct session reset mode options

- Change 'hourly' to 'daily' to match gateway SessionResetPolicy
- Add 'none' option (officially supported in CLI setup wizard)
- Add 'modeDaily' and 'modeNone' i18n keys

* fix: add i18n keys for session reset mode fixes (en)

* fix: add i18n keys for session reset mode fixes (zh)

* fix: add i18n keys for session reset mode fixes (de)

* fix: add i18n keys for session reset mode fixes (es)

* fix: add i18n keys for session reset mode fixes (fr)

* fix: add i18n keys for session reset mode fixes (ja)

* fix: add i18n keys for session reset mode fixes (ko)

* fix: add i18n keys for session reset mode fixes (pt)

* fix zh-TW session reset labels

---------

Co-authored-by: GaoZzr <55678517+GaoZzr@users.noreply.github.com>
2026-05-16 21:18:59 +08:00
ekko 048a0ad87e fix mobile terminal drawer sizing (#799) 2026-05-16 21:01:00 +08:00
ekko f7556e6204 fix plugin discovery python env (#798) 2026-05-16 20:58:44 +08:00
ekko 8357c8ed84 Fix bridge profile environment isolation (#796) 2026-05-16 20:27:23 +08:00
ekkoandCodex 7d7c8b7321 fix(cli): make port detection portable (#789)
Co-authored-by: Codex <codex@openai.com>
2026-05-16 15:44:50 +08:00
ekko db0c23bf5e [codex] add QQBot and DingTalk channel settings (#787)
* add qqbot and dingtalk channel settings

* remove history session context menu
2026-05-16 13:54:38 +08:00
ekko 67723d9315 [codex] add locked file updates for config writes (#785)
* add locked file updates for config writes

* add glm vision turbo preset
2026-05-16 13:11:59 +08:00
ekko 217b721648 clear stale compression status on run start (#783) 2026-05-16 11:15:29 +08:00
ekko c5380c4ab5 filter empty assistant history (#781) 2026-05-16 11:01:33 +08:00
ekko 24e906998a support windows markdown media paths (#780) 2026-05-16 10:43:51 +08:00
ekko 61c10997fa clarify windows media path prompt (#779) 2026-05-16 10:12:18 +08:00
ekko cf9d0c6008 prepare 0.5.25 changelog (#778) 2026-05-16 09:40:25 +08:00
ekko 07257a8964 [codex] proxy provider model fetches (#777)
* proxy provider model fetches

* add provider model proxy e2e
2026-05-16 08:57:00 +08:00
ekko 3f8461d9eb suppress bridge CLI platform hint (#776) 2026-05-16 08:31:18 +08:00
ekko 8bb71b5592 fix tool approval flow (#773) 2026-05-16 00:11:51 +08:00
ekko 015c698993 replace claude guide with development guidelines (#767) 2026-05-15 19:30:12 +08:00
ekko e0bfa828cb make web ui state directory configurable (#764) 2026-05-15 17:30:27 +08:00
ekko fbb0236af4 Update docs and CLI upgrade notes (#760) 2026-05-15 16:13:51 +08:00
ekko 8196e49478 [codex] Add group chat room reset and clone (#756)
* Add group chat room reset and clone

* Clean npm cache before self update
2026-05-15 15:52:16 +08:00
ekko 94f1061734 align bridge multimodal handling (#755) 2026-05-15 14:47:29 +08:00
ekko 84e98cfb5e fix command compression token estimate (#751) 2026-05-15 14:10:49 +08:00
ekko 3d49f778fb align compression token estimates (#749) 2026-05-15 13:50:27 +08:00
ekko 2dbc3e1c10 chore: update changelog for 0.5.23 (#747) 2026-05-15 13:03:03 +08:00
ekko f6a6c1c228 fix: reserve web ui port for gateways (#746) 2026-05-15 12:52:45 +08:00
ekko 876aa9ee83 fix: isolate gateway profile environment (#745) 2026-05-15 12:44:36 +08:00
ekko 48dcaee6c2 feat: add bridge session commands (#743) 2026-05-15 12:04:03 +08:00
ekko 13fad02db8 [codex] fix bridge state db sync (#740)
* fix bridge session db flush cursor

* fix bridge state db result sync
2026-05-15 10:31:26 +08:00
ekko da067a5a78 refactor chat run socket (#739) 2026-05-15 10:08:52 +08:00
ekkoandClaude Opus 4.7 7da934fe8b revert: remove i18n lazy loading and highlight.js selective import (#736)
Revert the dynamic import() for i18n locales and highlight.js core+
registration from #696. Dynamic imports create separate chunk files
that cause 404 errors for users after updating when the browser still
references old chunk hashes.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 23:32:33 +08:00
ekko e5e44fd7e2 feat: auto-switch to default profile before gateway startup (#734)
When starting gateways, automatically switch to 'default' profile if
current profile is not 'default'. This ensures consistent gateway startup
behavior and prevents port conflicts from different profile configurations.

Changes:
- Check current profile before starting gateways
- Execute 'hermes profile use default' if needed
- Wait 2 seconds for profile switch to take effect
- Update internal GatewayManager state
- Add detailed logging for the switching process
2026-05-14 23:11:22 +08:00
ekko acf5184d5f Remove website QQ QR code (#730) 2026-05-14 22:04:08 +08:00
ekko 50de4eb857 fix bridge agent init compatibility (#727) 2026-05-14 21:21:26 +08:00
ekkoandClaude Opus 4.7 d0f1e7d1f2 Fix bridge compression history handling (#726)
* feat(bridge): refactor compression to use DB history and add structured logging

- Extract buildDbHistory() to share message loading between buildCompressedHistory and forceCompressBridgeHistory
- forceCompressBridgeHistory now reads from local DB instead of using Python-provided messages, ensuring consistency with api_server path
- Pass sessionId to compressor for snapshot-aware compression
- Add force_compress flag to bridge chat requests
- Add bridgeLogger structured logging for compression lifecycle
- Simplify schemas, session-sync, and providers

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix bridge compression history handling

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 21:02:59 +08:00
ekko bd6c4dc82e fix: restore Hermes session history listing (#716) 2026-05-14 15:23:19 +08:00
ekko 9b243cab36 [codex] fix self update restart (#707)
* fix: make self update restart reliably

* chore: clarify update success message
2026-05-14 12:06:39 +08:00
ekkoandClaude Opus 4.7 b2a80808e3 fix: comment out pending session delete operations in group chat (#703)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 10:34:10 +08:00
ekkoandClaude Opus 4.7 47ff859c7c chore: add 0.5.20 changelog and remove old entries (#702)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 10:32:24 +08:00
ekkoandClaude Opus 4.7 9fa3ad6ee8 fix: pass HERMES_HOME to plugins Python bridge (#701)
Fixes #689

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 10:14:54 +08:00
ekkoandClaude Opus 4.7 7c87ba51da feat: add Ollama Cloud provider preset (#700)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 09:43:14 +08:00
9170e11715 fix: SkillsUsage 页面样式修复与 API server skill usage 统计 (#698)
* Reapply "feat: 新增 Skills Usage 监控统计与图表 (#668)" (#670)

This reverts commit 91de3b12a1.

* fix: count API-server skill usage

* fix: align SkillsUsageView header with other pages and update sidebar icon

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Zhicheng Han <zhicheng.han@mathematik.uni-goettingen.de>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 09:28:51 +08:00
ekkoandClaude Opus 4.7 eae7195ba8 Update CLI chat session bridge (#697)
* feat: add CLI chat sessions with Python agent bridge

Introduce a new CLI chat mode that connects Web UI directly to Hermes
Agent's AIAgent via a Python bridge subprocess and Socket.IO, bypassing
the API Server /v1/responses path. Supports streaming, slash commands
(/new, /undo, /retry, /branch, /compress, /save, /title), interrupt,
and steer.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* feat: update CLI chat session bridge

* fix: extend agent bridge startup timeouts

* docs: update bridge chat session design

* feat: align bridge compression and provider registry

* chore: bump version to 0.5.20

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 09:03:57 +08:00
ekkoandClaude Opus 4.7 e0fcc0040b fix: parse .env and SOUL.md fields from hermes profile show output (#669)
The regex `^(\w[\w\s]*?)` could not match keys containing dots (`.env`,
`SOUL.md`), so `hasEnv` and `hasSoulMd` were always `undefined` → false.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-13 07:52:34 +08:00
ekko 91de3b12a1 Revert "feat: 新增 Skills Usage 监控统计与图表 (#668)" (#670)
This reverts commit ce08d2b05a.
2026-05-13 07:51:29 +08:00
ekkoandClaude Sonnet 4.6 44d1b13741 fix: enhance gateway logging for Windows dev restart debugging (#665)
Add comprehensive debug logging throughout the gateway lifecycle to
help troubleshoot nodemon restart issues on Windows, where SIGTERM
is used instead of SIGUSR2.

Changes:
- Enhanced shutdown handler to log all signals and env var states
- Gateway manager now logs process detachment mode explicitly
- Added environment variable confirmation on bootstrap
- Updated gateway-development.md with new debug logs and troubleshooting steps

Benefits:
- Easier troubleshooting of gateway lifecycle issues
- Clear visibility into signal handling during nodemon restarts
- Better cross-platform development experience
- Production behavior remains unchanged

Testing:
-  Windows: Gateways persist across nodemon restarts
-  macOS/Linux: Existing SIGUSR2 behavior preserved
-  Production: Default shutdown cleanup unchanged
-  Backward compatibility: No breaking changes

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 22:03:28 +08:00
ekko 5bd1475a83 fix: preserve gateways across dev restarts (#662) 2026-05-12 21:35:17 +08:00
ekkoandClaude Opus 4.7 ebb166abee fix: skip gateway shutdown during dev restarts (#661)
Set HERMES_WEB_UI_STOP_GATEWAYS_ON_SHUTDOWN=0 in nodemon.json so
nodemon restarts don't kill running gateways. Production behavior
unchanged (stops owned gateways by default).

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-12 21:17:40 +08:00
ekkoandClaude Opus 4.7 8b57c4a278 fix: improve gateway PID recovery and port detection (#660)
- Refactor port detection into reusable getListeningPids/killListeningPids
- Add ss command fallback when lsof is unavailable
- Extract readPidFile for cleaner PID file reading
- Remove unnecessary PowerShell candidate from Windows shell detection
- Add PID validity check in gateway_state.json fallback (Number.isFinite + > 0)

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-12 20:53:21 +08:00
ekkoandClaude Opus 4.7 b9b99042a0 refactor(docker): merge two-container setup into single container (#657)
* refactor(docker): merge two-container setup into single container

The Web UI already manages the Hermes Agent gateway lifecycle internally
via GatewayManager (spawn hermes gateway run --replace), making the
separate hermes-agent container redundant. The Dockerfile is built on
the hermes-agent base image, so all CLI tooling is already included.

- Remove hermes-agent service and shared volume from docker-compose.yml
- Remove gateway port mapping (8642-8670) — internal-only now
- Update docs/docker.md, README.md, README_zh.md for single-container setup

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* docs: remove version tag from image references

Use ekkoye8888/hermes-web-ui instead of ekkoye8888/hermes-web-ui:latest
to avoid pinning a specific version in documentation.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-12 19:01:24 +08:00
ekkoandClaude Opus 4.7 96866f36e5 fix: emit tool.started immediately on function_call and add duration to tool.completed (#647)
- Emit tool.started on response.output_item.added instead of .done
- Track startedAt timestamp for each tool call to calculate duration
- Include duration (2 decimal places) and error status in tool.completed
- Fix response.completed fallback to emit tool.started before tool.completed
- Update website license from MIT to BSL-1.1

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-12 12:08:12 +08:00
ekkoandClaude Opus 4.7 73b919e07c fix: skip model API requests when no auth token is present (#643)
Prevents infinite retry loop on /api/hermes/available-models when
accessing the app without a token, which triggers server-side 429
rate limiting. Both loadModels() and fetchProviders() now bail out
early if hasApiKey() returns false.

Closes #606

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-12 10:19:14 +08:00
ekkoandClaude Opus 4.7 f78fb2da90 fix: add windowsHide to child_process calls to prevent terminal popup on Windows (#637)
- copilot-models.ts: add windowsHide to `gh auth token` call
- file-provider.ts: add shared execOpts with windowsHide for all
  docker/ssh/singularity calls

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 23:00:09 +08:00
ekkoandClaude Opus 4.7 e6a0f5b6f2 fix: sync zh-TW locale with zh (add model alias and visibility keys) (#635)
Add missing keys: removeCustomModel, aliasEdit/Title/Placeholder/etc
(10 alias keys), and visibilitySelectOne to match zh.ts.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 22:33:34 +08:00
ekkoandClaude Opus 4.7 7b781b4f42 chore: update 0.5.17 changelog with all merged PRs since 0.5.16 (#633)
Expand changelog from 5 to 25 entries covering all changes:
comic theme, kanban parity, model visibility, TTS settings,
Windows/Termux compat, YAML parsing, gateway ownership, etc.

Also backfill zh-TW locale with missing keys (changelog, model
visibility, TTS rate/pitch).

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 22:15:41 +08:00
ekkoandClaude Opus 4.7 bb639a9121 fix: separate env vars for opencode-zen and opencode-go providers (closes #627) (#631)
Use independent OPENCODE_ZEN_API_KEY and OPENCODE_GO_API_KEY
instead of shared OPENCODE_API_KEY, preventing cross-provider config coupling.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 21:03:47 +08:00
ekkoandClaude Opus 4.7 b4a80aceeb fix: Windows/Termux compatibility, comic theme fonts, and UI fixes (#630)
* fix: comprehensive Windows compatibility and gateway management improvements

This commit addresses multiple Windows compatibility issues and improves
gateway management across all platforms.

## Windows Compatibility Fixes
- Add hermes-path.ts with cross-platform Hermes home/bin detection
- Fix Windows native installation paths (%LOCALAPPDATA%\hermes)
- Update terminal.ts to use PowerShell instead of /bin/bash on Windows
- Fix upload.ts path construction to use path.join() for cross-platform paths
- Fix download.ts to use isAbsolute() for Windows absolute path detection
- Update auth.ts to skip file mode 0o600 on Windows (unsupported)
- Add nodemon.json for cross-platform environment variable handling

## Gateway Management Improvements
- Simplify gateway startup: all platforms use 'run' mode uniformly
- Remove complex init system detection and platform-specific code paths
- Improve PID file validation: use health check instead of port detection
- Remove getPortByPid() method (too complex and error-prone)
- Remove checkPortAvailable() TCP bind test (TIME_WAIT false positives)
- Trust gateway --replace flag to handle real port conflicts
- Add smart PID validation: check if stale process via health check
- Fix port allocation to avoid incrementing when gateway restarts
- Add allocatedPorts.clear() on each startAll() call
- Add clearPidFile() method to clean up stale PID files

## Process Management
- Remove detached:true and unref() from gateway spawn
- Gateway processes now follow parent process lifecycle
- Add process reference storage in ManagedGateway interface
- Improve shutdown logic: call gatewayManager.stopAll() before exit
- Fix Windows process killing: use process.kill(pid) for Windows
- Remove PowerShell command for lock file cleanup (use Node.js fs.unlinkSync)

## Frontend Theme Fixes
- Fix main.ts localStorage key mismatch (hermes_theme → hermes_brightness)
- Add inline script in index.html to prevent FOUC (Flash of Unstyled Content)
- Apply theme classes before Vue mount to avoid visual glitches

## Developer Experience
- Fix nodemon windows-kill popup on Windows by removing signal config
- Add delay and environment variables to nodemon.json
- Add windowsHide: true to all child process spawns

## Breaking Changes
- Gateway management now exclusively uses 'run' mode on all platforms
- systemd/launchd integration removed (use --replace flag instead)

This fix ensures hermes-web-ui works correctly on Windows native
installations while maintaining compatibility with Linux/macOS/WSL2.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Fix gateway lifecycle port handling

* fix: comprehensive Windows compatibility and gateway management improvements

- Simplified hermes CLI binary resolution logic
- Fixed Windows line ending compatibility in profile list parsing
- Migrated gateway restart logic from CLI to GatewayManager
- Added gateway restart to updateCredentials method
- Removed unnecessary gateway restarts from provider operations
- Fixed configuration preservation when switching profiles
- Added nodemon quiet mode and legacy watch to reduce Windows popups

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* revert: change back to nodemon due to tsx compatibility issues

- tsx has compatibility issues with Koa generator functions
- Restored nodemon with simplified configuration
- Added cross-env package for future Windows environment variable needs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat: replace nodemon with ts-node-dev to eliminate Windows popup windows

- Installed ts-node-dev as nodemon replacement
- ts-node-dev has better Windows compatibility without console popups
- Supports respawning, inspector debugging, and TypeScript compilation
- Uses cross-env for Windows environment variable support
- Removed nodemon.json configuration file (no longer needed)

Benefits:
- No more Windows console popup windows during development
- Faster restart times compared to nodemon
- Built-in TypeScript compilation without ts-node overhead

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: improve log parsing and Windows compatibility for agent/error logs

- Fixed Pino JSON log parsing bug where logger field incorrectly used obj.msg
- Changed logger field to use obj.name to properly display log source
- Added Windows line ending support (\r\n) for log file listing
- Added support for 'error' log type in addition to 'errors'
- Improved error message extraction from obj.err when available

This fixes the missing agent and error logs issue on Windows.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Fix gateway health checks and shutdown ownership

* Refine auth lock window and dev shutdown

* fix: improve Hermes plugin discovery on Windows by fixing Python path resolution

- Added support for Windows venv Scripts directory structure
- Fixed Python executable path detection for hermes.exe in venv/Scripts/
- Added Windows LOCALAPPDATA hermes-agent directory to search paths
- Improved cross-platform compatibility for plugin discovery

This fixes the "No module named 'hermes_cli'" error on Windows by correctly
locating the Python virtual environment that contains the Hermes modules.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* refactor: improve cross-platform compatibility for Hermes plugin discovery

- Added platform detection to only add Windows-specific paths on Windows
- Prevents potential issues on Unix/Linux/macOS systems
- Ensures LOCALAPPDATA path is only used when available on Windows
- Maintains existing behavior for all platforms

This makes the Windows plugin discovery fix safer for cross-platform usage.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: remove unused development dependencies

- Removed nodemon (replaced by ts-node-dev)
- Removed tsx (had compatibility issues with Koa)
- Removed nodemon.json configuration file
- Cleaned up development tools to only what's actually used

This reduces dependency size and eliminates the windows-kill popup
source that was part of nodemon.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: remove memory system files

- Removed MEMORY.md index file
- Removed memory/ directory and windows-compatibility.md
- Cleaned up unused memory persistence system

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: resolve TypeScript compilation error in plugins.ts

- Added type assertion 'as string[]' after filter(Boolean)
- Fixes TS2769 error: No overload matches this call
- Ensures type compatibility with hasHermesPluginModule function

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: comprehensive Windows compatibility and gateway management improvements

- Fix gateway detection after nodemon restart by adding health check-based detection
- Prevent port conflicts by detecting already-running gateways without PID files
- Switch to serial gateway startup to avoid lock file race conditions
- Return to nodemon from ts-node-dev for development stability
- Always stop gateways on shutdown to prevent orphan processes
- Prevent project root config files from being committed to git
- Fix syntax issues in plugins.ts

Resolves issues where default profile gateway failed to start after
nodemon restart and gateways were incorrectly marked as stopped
despite running on correct ports.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat: comic theme multilingual fonts, sidebar collapse fix, plugin discovery for Termux, and cron history

- Add Chinese (ZCOOL KuaiLe), Japanese (Zen Maru Gothic), Korean (Gaegu) handwritten fonts for Comic theme
- Fix collapsed sidebar: hide language switch, stack theme icons vertically
- Add hermes shebang parsing as fallback Python discovery for Termux
- Remove cron source filter from history sessions
- Add 0.5.17 changelog entries for all 8 locales

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix: tolerate duplicate YAML keys in config parsing (closes #628)

Add `{ json: true }` to all 7 `yaml.load()` calls so duplicated mapping
keys (e.g. multiple `mcp_servers:` blocks) no longer crash the API.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix: gateway ownership check requires PID file to prevent cross-profile port hijacking

Remove fallback that assumed ownership of healthy gateways without PID
verification. Now only claims a gateway if PID file exists and process
is alive, preventing one profile from hijacking another's port.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 20:08:13 +08:00
ekkoandClaude Opus 4.7 96c9338f6a fix: lower context compression message threshold from 200 to 150 (#609)
Reduce the message count threshold that triggers LLM-based context
compression to avoid excessively long histories before compression kicks in.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 20:09:55 +08:00
ekkoandClaude Opus 4.7 377fa4144d feat: convert image uploads to base64 multimodal format (#610)
* fix: lower context compression message threshold from 200 to 150

Reduce the message count threshold that triggers LLM-based context
compression to avoid excessively long histories before compression kicks in.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* feat: convert image uploads to base64 multimodal format for API

Images sent by users are now read from disk, converted to base64 data
URLs, and sent as input_image parts in the /v1/responses API request
instead of being replaced with text placeholders. File attachments remain
as text mentions.

- convertContentBlocks returns multimodal array instead of plain text
- Input is wrapped in [{role:"user", content:[...]}] format for gateway
- History conversion extracts text only (no base64 in conversation_history)
- Add debug logging for request input preview

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* chore: remove debug console.log from chat-run-socket

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 19:50:54 +08:00
ekkoandClaude Opus 4.7 7cf3c70c92 chore: change license to BSL-1.1 and remove third-party brand keywords (#605)
- Switch from MIT to Business Source License 1.1 (non-commercial use,
  auto-converts to Apache 2.0 on 2029-05-10)
- Remove third-party brand keywords from package.json (chatgpt, claude,
  openai, gemini, deepseek, telegram, discord, slack, whatsapp, etc.)
- Remove afdian sponsor links from README.md and README_zh.md
- Update license references in both READMEs to BSL-1.1

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 14:31:30 +08:00
ekkoandClaude Opus 4.7 5c3e9edd19 feat: add comic/doodle theme style (#603)
* feat: add comic/doodle theme style with local font

Add a new "comic" theme style that applies hand-drawn aesthetics (Comic Neue
font, bold borders, heavy font weight) while keeping the original light/dark
background colors. Font files are bundled locally to avoid Google Fonts CDN
dependency.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix: update DisplaySettings to use renamed theme API and update brand assets

Rename mode/setMode/ThemeMode to brightness/setBrightness/BrightnessMode
to match the refactored useTheme composable. Update favicon and logo.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 14:01:29 +08:00
ekkoandClaude Opus 4.7 739c65a4df fix: prevent assistant message merging across tool calls (#593)
Remove run.text accumulator and insertResponseTextOnce that caused
text blocks before and after tool calls to be concatenated into a
single message. Now response.output_text.done only sets finish_reason
without overwriting delta-accumulated content.

- Remove run.text, textInserted from ResponseRunState
- Remove insertResponseTextOnce method
- output_text.done only marks finish_reason='stop' on last message
- response.completed no longer calls insertResponseTextOnce
- Add 7 tests covering flush, abort, and multi-block text separation

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 08:46:12 +08:00
ekkoandClaude Opus 4.7 fc02348ebd fix: prevent message loss on abort by deferring DB writes to flush (#591)
Defer all non-user message DB writes until response completion or
abort, instead of writing tool calls immediately during streaming.
This ensures correct message ordering and prevents the abort handler
from overwriting displayed messages with incomplete DB data.

- Remove immediate addMessage() calls from response.output_item.done
- Remove immediate addMessage() from insertResponseTextOnce
- Add flushResponseRunToDb() to batch-write all run messages on
  both normal completion (markCompleted) and abort (handleAbort)
- Skip user messages in flush (already written in handleRun)
- Remove refreshActiveSession() from abort.completed frontend handler

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 04:10:01 +08:00
ekkoandClaude Opus 4.7 50122c5ff8 feat: v0.5.16 - migrate to Responses API (#586)
* refactor: migrate from /v1/runs to /v1/responses streaming API

Replace EventSource-based polling with direct SSE streaming via the
/v1/responses endpoint across all server-side callers (chat-run-socket,
context-compressor, gateway-client, agent-clients). Messages are now
written to DB in real-time during streaming, eliminating post-run sync.
Frontend chat store adds tool_call_id tracking for deduplication.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* chore: bump version to 0.5.16 and add changelog

- Persist real API usage to usage table on response.completed
- Remove unused codex_reasoning_items field from message schema
- Fix unused variable warnings in chat-run-socket
- Bump version to 0.5.16
- Add changelog entries for 0.5.16 (8 locales)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 02:49:58 +08:00
ekkoandClaude Opus 4.7 a36c0a3095 feat(sidebar): add website link and shorten version text (#573)
Add a website icon link (globe) alongside the GitHub icon in the
sidebar footer. Shorten version label from "Hermes Web UI" to "Web UI".

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-09 19:45:12 +08:00
ekkoandClaude Opus 4.7 2ba88f7b07 feat(website): add QQ group QR code to navigation bar (#572)
Add a "QQ Group" tab in the site header that opens a centered modal
with the QR code image. Includes mobile menu support and i18n.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-09 19:17:15 +08:00
ekkoandClaude Opus 4.7 4f8f932d03 fix(mobile): improve mobile UI for kanban, group chat and page headers (#562)
- Fix kanban loading spinner flickering on auto-refresh (silent mode)
- Fix group chat room-list transparent background on mobile
- Fix group chat sidebar auto-opening on mobile entry
- Fix page-header title overlapped by hamburger button on mobile
- Move hamburger button position to top: 10px
- Add changelog note about upgrading hermes-agent for kanban support
- Add i18n translations for all 8 locales

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-09 12:18:26 +08:00
ekkoandClaude Opus 4.7 c3738cf1c3 fix(docker): resolve container networking and DB compatibility issues (#560)
- Auto-detect Docker container environment and use service name
  'hermes-agent' as default host instead of 127.0.0.1
- Replace hardcoded column names with SELECT * in session DB queries
  to compat with older Hermes agent state.db schemas
- Remove unused UPSTREAM env var from docker-compose.yml
- Include err.message in syncFromHermes failure logs
- Add group chat rule to prevent self-mentioning

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-09 11:37:26 +08:00
ekkoandClaude Opus 4.7 448f780568 chore: bump version to 0.5.15 and update changelog (#557)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-09 09:49:30 +08:00
ekko 9507cbcc71 fix(website): improve mobile responsiveness (#554) 2026-05-09 08:43:05 +08:00
ekko 9045f2a987 Revert "修复审批请求在聊天中无提示且无法响应 (#467)" (#553)
This reverts commit 56c7b59eaf.
2026-05-09 08:36:13 +08:00
ekko 51fde26797 refactor remove upstream env dependency (#551) 2026-05-08 20:46:22 +08:00
ekko bba4920fee fix hermes markdown media and sync retry (#550) 2026-05-08 19:55:55 +08:00
ekko 6291f0d589 add website homepage metadata (#543) 2026-05-08 15:53:26 +08:00
ekko 39acd3574a fix wsl default listen host (#542) 2026-05-08 15:47:03 +08:00
ekko d54f9479b9 add hermes tts playback (#541) 2026-05-08 15:34:11 +08:00
ekkoandClaude Opus 4.7 10d2f892ff fix: group-chat agent client use dynamic port instead of hardcoded 8648 (#539)
The connect() method defaulted to port 8648, causing websocket connection
refused errors when the server was started with a custom port via
`hermes-web-ui start <port>` or PORT env var. Now reads from process.env.PORT.

Closes #536

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 14:04:51 +08:00
ekko e55792acbb [codex] fix kanban session matching (#538)
* fix kanban session matching

* tighten kanban task session lookup

* remove favicon svg
2026-05-08 13:53:40 +08:00
ekkoandClaude Opus 4.7 9edb76ac64 feat: add landing page and docs website (#537)
* feat: add landing page and docs website package

Add packages/website — a Vue 3 + Naive UI static site with landing page
and documentation, sharing the Pure Ink monochrome design with the main
app. Features: particle network hero animation, screenshot carousel,
feature grid, install guide tabs, GitHub star history, scroll reveal
animations, and Chinese/English bilingual support.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* chore: add favicon to website package

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix: use dynamic theme param for star history chart

Switch from CSS media query to JS-based dark mode detection so the
star-history SVG matches the current theme toggle state.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix: resolve TypeScript strict mode errors in website components

- Remove unused isDark import in HeroSection
- Add null check for canvas parent element
- Rename unused img loop variable in ScreenshotsSection
- Remove unused NIcon import in SiteHeader

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix: resolve TS narrowing errors in canvas resize closure

Use canvasRef.value directly inside resize() with local null check
instead of relying on outer closure narrowing.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 13:36:11 +08:00
ekko b0e03ae838 add hermes kanban board (#534) 2026-05-08 11:32:47 +08:00
ekkoandClaude Opus 4.7 9fbff08098 chore: add changelog for version 0.5.14 (#525)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-07 22:25:59 +08:00