Commit Graph

3 Commits

Author SHA1 Message Date
jsonet 7e7fe90483 fix(chat): isolate concurrent session events and workspace dialog i18n (#351)
* feat: per-session workspace with folder picker, HERMES_HOME support, esbuild fix

* fix(chat): isolate concurrent session events and workspace dialog i18n

Two user-visible bugs are fixed here:

1. Workspace dialog title showed the raw i18n key 'chat.setWorkspaceTitle' because the key was never added to en.ts / zh.ts. The dialog is opened from ChatPanel.vue but only 'setWorkspace' existed. Add the missing 'setWorkspaceTitle' translation in both locales.

2. With two concurrent runs the assistant text from session A would show up in session B (and vice versa). The /chat-run namespace uses a single shared Socket.IO connection on the client; every startRunViaSocket() call registers its own listeners on the same socket. The server fans events out via 'session:<id>' rooms, but a single socket can be in multiple rooms at once and there was no per-event filtering on the client. Each run's closure captured its own sid and wrote into the wrong session. The server already tags every payload with session_id, so the fix is a guard inside handleEvent() that drops events whose session_id does not match this run's body.session_id. Untagged events are still accepted for backwards compatibility.

3. Also fix a related crash where setting a workspace on a session that had not been persisted yet (no first message sent) threw because the row did not exist. Create the row on demand inside setWorkspace controller.

* fix: upgrade esbuild to 0.27+ for vite 8 compatibility

---------

Co-authored-by: ekko <fqsy1416@gmail.com>
2026-04-30 20:17:38 +08:00
Zhicheng Han e82674039c fix: recover legacy session_usage migration (#345)
Quote SQL defaults when rebuilding legacy usage tables and recover rows left in session_usage_old by failed migrations.
2026-04-30 17:17:20 +08:00
ekko 6511033ed8 refactor(db): unify SQLite table schema management and initialization (#310)
Centralized all 11 Hermes SQLite table definitions and initialization logic
into a single schemas.ts file to eliminate duplication and improve maintainability.

Changes:
- **NEW**: packages/server/src/db/hermes/schemas.ts
  - Centralized schema definitions for all 11 tables
  - Unified initAllHermesTables() function with migration logic
  - Includes usage table PRIMARY KEY migration (session_id → id)

- **Refactored**: packages/server/src/db/hermes/init.ts
  - Simplified from async to sync (all operations are synchronous)
  - Single responsibility: delegate to schemas.ts

- **Refactored**: packages/server/src/db/hermes/session-store.ts
  - Removed schema definitions (now in schemas.ts)
  - Removed initSessionStore() function
  - Imports table constants from schemas.ts

- **Refactored**: packages/server/src/db/hermes/usage-store.ts
  - Removed initUsageStore() function and migration logic
  - Migration moved to schemas.ts for consistency
  - Only handles CRUD operations now

- **Refactored**: packages/server/src/db/hermes/compression-snapshot.ts
  - Removed initCompressionSnapshotStore() function
  - Fixed duplicate getCompressionSnapshot definition
  - Imports table constant from schemas.ts

- **Refactored**: packages/server/src/services/hermes/group-chat/index.ts
  - Removed ensureTable() calls (now in schemas.ts)
  - Only handles index creation now
  - Imports table constants from schemas.ts

- **Updated**: packages/server/src/index.ts
  - Removed await from initAllStores() call (now sync)

Benefits:
- 🎯 Single responsibility: schemas.ts manages all tables, stores only do CRUD
- 📋 Centralized maintenance: all table definitions in one place
- 🔄 No duplication: each table created exactly once with proper migrations
- 🚀 Clean architecture: clear separation between initialization and operations

Tables managed (11 total):
1. session_usage (usage statistics)
2. sessions (session metadata)
3. messages (message content)
4. chat_compression_snapshots (compression snapshots)
5. gc_rooms (group chat rooms)
6. gc_messages (group chat messages)
7. gc_room_agents (room agents)
8. gc_context_snapshots (group chat snapshots)
9. gc_room_members (room members)
10. gc_pending_session_deletes (pending session deletes)
11. gc_session_profiles (session profiles)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 20:22:07 +08:00