Skip to content

feat: session archive, file open actions, reasoning effort, search fix#1241

Open
Vision0220 wants to merge 9 commits into
EKKOLearnAI:mainfrom
Vision0220:main
Open

feat: session archive, file open actions, reasoning effort, search fix#1241
Vision0220 wants to merge 9 commits into
EKKOLearnAI:mainfrom
Vision0220:main

Conversation

@Vision0220

Copy link
Copy Markdown

Summary

Four features bundled in one PR:

1. Session Archive

  • Archive/unarchive sessions via sidebar right-click context menu
  • Collapsible "Archived Sessions" section fixed at sidebar bottom
  • Backend: archived column auto-migrated via syncTable, POST endpoints for archive/unarchive
  • Filter archived from default session list, support includeArchived=true query param
  • Profile filter change clears and reloads archived list

2. File Open Actions

  • Right-click context menu on file attachments and markdown file cards
  • Three actions: open with default app, show in folder, download
  • Backend: POST /api/hermes/open-file and /api/hermes/open-in-explorer
  • Cross-platform: Windows (PowerShell Start-Process, explorer), macOS (open), Linux (xdg-open)
  • Uses execFile with argument arrays to prevent command injection

3. Reasoning Effort Setting

  • Exposes existing agent.reasoning_effort config option in Agent Settings panel
  • Options: default / low / medium / high / xhigh
  • i18n translations for all 9 locales

4. Search Fix

  • Archived sessions now appear in search results with an "archived" badge
  • Preserves archived state when opening search results (fixes sidebar placement)
  • tableHasColumn guard handles older DBs that may lack the archived column

Testing

  • Updated test mocks for NDropdown, openFileWithDefault, openInExplorer
  • Added archived column to test DB schema in sessions-db-lineage test
  • All existing tests pass

Vision and others added 9 commits June 1, 2026 20:53
@
feat: add session archive with collapsible sidebar section

Add ability to archive sessions so they are hidden from the main session list
but remain accessible in a collapsible "Archived Sessions" section at the
bottom of the sidebar.

Backend:
- Add `archived` column to sessions table (auto-migrated via syncTable)
- Add POST /sessions/:id/archive and /unarchive endpoints
- Filter archived sessions from default list/search queries
- Support `includeArchived=true` query parameter

Frontend:
- Session store: add `archived` field to Session interface, fallback
  fetchSession in switchSession for sessions not in main list (e.g. archived)
- ChatPanel: collapsible archived section fixed at sidebar bottom,
  archive/unarchive in context menu, filter archived from pinned/unpinned
- ChatView: route guard handles archived session IDs via switchSession
- HistoryView: archive/unarchive in context menu
- i18n: translations for all 9 locales
@
Add right-click context menu to file attachments and markdown file cards
with three actions: open with default app, show in folder, and download.

Backend:
- POST /api/hermes/open-file: opens file with system default application
- POST /api/hermes/open-in-explorer: reveals file in system file manager
- Cross-platform: Windows (cmd/start, explorer), macOS (open), Linux (xdg-open)

Frontend:
- MessageItem: right-click context menu on file attachments (skips blob URLs)
- MarkdownRenderer: right-click context menu on file cards and file links
- Client API: openFileWithDefault() and openInExplorer() functions
- Original left-click download/preview behavior preserved
- sessions-routes: add archive/unarchive controller mocks
- sessions-db-lineage: add archived column to test DB schema
- markdown-rendering: add NDropdown mock, openFileWithDefault/openInExplorer
- markdown-special-mentions: add missing download API mock exports
- markdown-rendering-mermaid-import-timeout: add NDropdown mock
- message-item-highlight: add NDropdown mock
Expose the existing agent.reasoning_effort config.yaml option in the Web UI
settings panel. Users can now select low/medium/high/xhigh to control model
thinking depth (e.g. GPT-5.5 xhigh). The value is written to config.yaml
and read by the Python bridge automatically.
Remove archived filter from searchSessions so archived sessions are
discoverable via the search modal. Add an 'archived' badge in search
results to distinguish them from active sessions.
When opening an archived session from search results, the archived
field was not being passed to addOrUpdateSession, causing the session
to appear in the regular sidebar instead of the archived section.
P1 fixes:
- sessions-db: use buildSessionSelect with tableHasColumn guard to safely
  handle Hermes state.db that may not have the archived column
- download: replace cmd /c start with PowerShell Start-Process to prevent
  command injection via filenames containing metacharacters

P2 fixes:
- download: await execFile callback before responding to surface file-open
  failures to the client instead of silently returning ok
- ChatPanel: include archived session IDs in pruneMissingSessions call
  after archiving to preserve pin state
- ChatPanel: clear and reload archived sessions when profile filter changes
- HistoryView: disable archive action for non-imported Hermes sessions
- ChatView: validate activeSession after switchSession fallback to handle
  stale route IDs correctly
HermesSessionRow already includes archived and workspace fields,
so updateSession Partial type accepts them directly.
HistoryView SessionSummary also has archived field, so no cast
is needed there either.
Adds session archiving with collapsible sidebar section, file right-click context menus (open/show in folder/download), reasoning effort setting in agent settings, and fixes search to include archived sessions with state preservation.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant