Commit Graph

1414 Commits

Author SHA1 Message Date
Eric
2e69f58f1c feat: v1.0.0 — profiles, knowledge browser, MCP settings, skills hub, eslint
feat: add Knowledge, Profiles, MCP settings, and skills hub upgrades
v1.0.0
2026-04-10 01:49:25 -04:00
Eric
fb17b5f86f feat: v1.0.0 — profiles, knowledge browser, MCP settings, skills hub upgrade, eslint, security contact update
New features:
- Multi-profile management (create, switch, rename, delete)
- Knowledge browser with document viewer
- MCP server settings screen
- Skills hub with marketplace search fallback
- Context usage tracking and display

Improvements:
- eslint added and auto-fixed (69 issues resolved)
- Settings dialog restructured (Agent, Smart Routing, Voice, Display sections)
- Navigation updated with Profiles tab across desktop/mobile
- Security contact updated to GitHub advisories + X DM
- .gitignore hardened (.runtime/, internal dev docs)
- Version bumped to 1.0.0

Build: clean | TypeScript: 0 errors | Tests: 4/4 passing
2026-04-10 01:49:13 -04:00
Eric
e4c2a6e97d feat: add profiles, MCP settings, skills hub fallback, and context fixes
Adds the second wave of Hermes Workspace upgrades:

- Profiles screen backed by ~/.hermes/profiles with create/activate/rename/delete
- MCP Servers settings page with config inspection and reload flow
- Skills marketplace hub/fallback search plus install/uninstall API routes
- Context usage fixes: correct 1M limits for Claude 4.6 / GPT-5.4, exclude cache
  tokens from active window usage, and improve session fallback
- Navigation updates for Profiles across desktop/mobile surfaces
- Remove duplicate legacy context meter in chat

This complements the Knowledge Browser work already on the branch and rounds out
this release into a broader workspace management update.
2026-04-08 22:01:22 -04:00
Aurora
6b829e5b0a feat: add knowledge browser tab to memory screen
Adds a Knowledge tab alongside the existing Memory tab under /memory.
The knowledge browser renders markdown wiki pages from ~/.hermes/knowledge/
with support for:

- YAML frontmatter parsing (title, type, domain, status, tags)
- Directory-based navigation with folder tree sidebar
- [[wikilink]] resolution as clickable in-app navigation
- Backlinks ('Pages that link here')
- Full-text search across all wiki pages
- Tag filtering
- Metadata display (type, domain, status, created/updated)
- Graph view dialog showing page connections
- 'Ask agent about this' button linking to chat
- Graceful empty state when no knowledge directory exists

Server side:
- src/server/knowledge-browser.ts — wiki scanner, frontmatter parser,
  wikilink extractor, graph builder
- 4 API routes: /api/knowledge/list, /read, /search, /graph

Frontend:
- src/routes/memory.tsx — tabbed layout (Memory | Knowledge)
- src/screens/memory/knowledge-browser-screen.tsx — full browser UI

Knowledge tab works independently of gateway capabilities (reads local
filesystem directly). No new dependencies added.

Closes #30
2026-04-08 20:32:11 -04:00
Eric
16181cc7de feat: activate context bar, fix token counting, port 3002 (#32)
- Render ContextBar in chat screen (was imported but never placed)
- Pass sessionId to context-usage API for accurate token data
- Count all tokens (cached + uncached) for real context window usage
- Model-aware max tokens (200k for Claude, 128k for GPT)
- Return model name in context-usage response
- Remove header border-b (context bar replaces separator)
- Remove context bar own border-b for clean look
- Change dev server port from 3000 to 3002

Co-authored-by: outsourc-e <eric@outsourc.e>
2026-04-08 20:11:28 -04:00
dontcallmejames
d1ab68bbc0 fix: remove orphaned redaction test step — file never existed (#33)
The scripts/qa/test-redaction.ts file was referenced in CI but never
created. The step was added in 31a7062, removed in 051d136, then
accidentally reintroduced in 4f848a4. pnpm test (vitest) is the
actual test command and is sufficient.

Co-authored-by: dontcallmejames <dontcallmejames@users.noreply.github.com>
2026-04-08 20:11:07 -04:00
Aurora
85f178561a fix: ModelCard missing sessionsAvailable variable on dashboard
ModelCard component referenced sessionsAvailable from parent scope
but it's a separate function component. Added local useFeatureAvailable
call to fix the ReferenceError crash on the dashboard page.
2026-04-06 22:53:29 -04:00
Eric
9cb80d43d9 Merge pull request #31 from outsourc-e/fix/onboarding-api-server-hint
fix: onboarding mentions API_SERVER_ENABLED=true requirement
2026-04-06 21:50:57 -04:00
Aurora
2315dc41cd fix: connection startup screen also mentions API_SERVER_ENABLED
Adds the API_SERVER_ENABLED=true step to the manual setup guide
shown on the initial connection startup screen, not just the
onboarding wizard.
2026-04-06 20:22:15 -04:00
Aurora
edf6450e46 fix: onboarding mentions API_SERVER_ENABLED=true requirement
When the Hermes gateway is running but the HTTP API server is not
enabled, the onboarding screen shows generic advice that doesn't
address the actual problem. Users can have a fully functional gateway
(serving Telegram, Discord, etc.) while the workspace can't connect.

Changes:
- Onboarding connection error now shows step-by-step instructions:
  1. Add API_SERVER_ENABLED=true to ~/.hermes/.env
  2. Restart the gateway
- Updated .env.example to document the requirement
- Added Ollama/LiteLLM/vLLM as explicit alternative backend options

Fixes #26
2026-04-06 20:19:46 -04:00
DiamondEyesFox
ea8df214a5 fix: add /api/memory parent route for workspace-relative memory access (#23)
The inspector panel already uses relative /api/memory paths (fixed in main),
but the parent GET route was missing — requests fell through to the client
router and returned HTML instead of JSON.

This adds a proper TanStack createFileRoute handler that proxies memory
requests through the workspace server with auth, so the inspector works
correctly over Tailscale, LAN, and remote access.

Rebased from PR #4 onto current main.
2026-04-06 00:47:39 -04:00
dontcallmejames
171e0e0f05 fix: refresh dashboard activity chart fixes on current upstream/main (#22)
Co-authored-by: dontcallmejames <dontcallmejames@users.noreply.github.com>
2026-04-06 00:47:31 -04:00
Eeshan Srivastava
548d4c767e fix: use gateway auto-detection in auth-check endpoint (#25)
The auth-check endpoint had its own isBackendReachable() function that
hardcoded http://127.0.0.1:8642 and never tried the fallback port 8643.
This bypassed the multi-port auto-detection logic in gateway-capabilities.ts,
causing the startup screen to loop on 'Connecting...' when the gateway
was running on an alternate port.

Replace the standalone reachability check with ensureGatewayProbed() which
already handles port auto-detection (8642 → 8643) and caches the result.
2026-04-06 00:47:21 -04:00
outsourc-e
b4775f8efd fix: dark mode for model picker + actions sheet
- Drag handles: bg-neutral-300 → dark:bg-neutral-600
- Section headers: dark:text-neutral-400
- Action icon backgrounds: dark variants (orange/indigo/red/green)
- All model picker elements already had dark: variants — verified
2026-04-04 00:46:16 -04:00
outsourc-e
53baaead83 feat: ClawSuite-style model picker — grouped by provider, pinned models, local tags
- Models grouped by provider (openai-codex, openrouter, anthropic, ollama, etc.)
- Pinned models section at top with star toggle (persisted to localStorage)
- Pin/unpin on hover for each model entry
- Active model shows accent border + dot indicator
- Local models show 'local' badge
- Empty state with helpful message
- Matches ClawSuite model switcher design on both mobile and desktop
2026-04-04 00:46:16 -04:00
outsourc-e
65bbd514b4 feat: model selector sends per-model provider, shows local tag
Each model in the dropdown now sends its own provider (e.g. ollama for
local models, openai-codex for cloud) instead of the global current
provider. Local models show a 'local' badge.
2026-04-04 00:46:16 -04:00
outsourc-e
5a3956db1d fix: populate model selector when gateway returns empty models list
Falls back to /v1/models, then to /api/config current model so the
dropdown always has at least the active model to show.
2026-04-04 00:46:16 -04:00
outsourc-e
cb0fc4efb3 fix: model selector crash — use modelsQuery.data.models instead of Object.entries
modelsQuery.data is {ok, models, configuredProviders, ...} not a
Record<string, Array>. Object.entries iterated all fields and called
.map on non-array values like 'ok' and 'currentProvider'.
2026-04-04 00:46:16 -04:00
outsourc-e
51cb72cce9 feat: wire model selector to actual Hermes models — desktop dropdown + mobile sheet
- Desktop: model badge is now clickable, opens dropdown with all available models
- Mobile: model sheet renders actual model list instead of hardcoded 'Hermes Agent'
- Handles both string and object ModelCatalogEntry types
- Highlights currently active model with accent dot
- Calls existing handleModelSelect/switchModel on selection
- Falls back gracefully when no models available (portable mode)
2026-04-04 00:46:16 -04:00
Aurora
1b1ee97881 docs: add local model setup guide (Ollama, LM Studio, vLLM)
Adds dedicated section for portable mode (direct to Ollama) and
enhanced mode (through Hermes gateway with custom_providers config).
Updated troubleshooting for common Ollama issues.
2026-04-03 19:28:05 -04:00
Aurora
8b6b4b845f fix: dashboard dark mode — replace Tailwind dark: with theme CSS vars
Tailwind dark: prefix doesn't work with the data-theme system.
Replaced all dark: prefixes with var(--theme-text), var(--theme-muted),
var(--theme-card2), var(--theme-accent-border) for proper theming.

Quick action card labels now use var(--theme-text) directly.
2026-04-03 18:37:12 -04:00
Aurora
8e33421a4d fix: dashboard dark mode text + auto-refresh polling
- Quick action cards: dot separators dark:text-neutral-500
- Timestamps, section labels, session counts: add dark:text-neutral-400
- Dashboard sessions query: add refetchInterval 30s for live updates
2026-04-03 18:34:38 -04:00
Aurora
2b1c99e6fd fix: replace Monaco editor with textarea in file preview dialog
Monaco loads its core from CDN asynchronously, causing the file preview
to show 'Loading...' indefinitely when the CDN is slow or blocked.
Replaced with a plain textarea — simpler, faster, no external deps.

Also fixed file tree depth (maxDepth 0→3) so folder contents are
visible on initial load.
2026-04-03 18:12:39 -04:00
Aurora
2aafe2ac34 fix: pass message_count and tool_call_count through toSessionSummary
Dashboard activity chart flatlined because these fields were never
mapped from the gateway session response to the frontend summary.
Emits both snake_case (dashboard compat) and camelCase variants.
2026-04-03 17:53:07 -04:00
Aurora
c6ece7a232 fix: unblock startup for Ollama and OpenAI-compat backends
auth-check previously only probed /health, which Ollama doesn't expose
(returns 404). This caused the ConnectionStartupScreen to permanently
block users from reaching the workspace — even when chat completions
and model listing both worked fine.

Now probes three endpoints in priority order:
  1. /health (Hermes gateway)
  2. /v1/models (OpenAI-compat — Ollama, LiteLLM, vLLM, etc.)
  3. / root (Ollama returns 200 'Ollama is running')

If ANY responds, the backend is considered reachable and the workspace
loads. Capability detection still runs in the background to determine
which enhanced features (sessions, memory, skills) are available.

Fixes: users stuck on 'Connecting to your backend...' splash screen
when using local Ollama or any non-Hermes OpenAI-compatible backend.
2026-04-03 17:21:42 -04:00
Joey
59f24e333a docs: fix Docker setup instructions and add troubleshooting guide (#21)
Clarifies Docker quickstart, required ANTHROPIC_API_KEY setup, gateway command updates, and troubleshooting for auth/connectivity issues. Credit: @joeynyc
v2.1.0 v2.1.2
2026-04-03 14:37:55 -04:00
ClintMoody
4b15ee929f fix: client-side capability detection after SSR hydration (#19)
Replaces static isFeatureAvailable() with useFeatureAvailable() React hook that fetches from /api/gateway-status. Fixes enhanced features always showing 'unavailable' after client hydration. Credit: @ClintMoody
2026-04-03 10:28:07 -04:00
Eric
3fdbcadbca docs: add Ollama CORS troubleshooting to README (#20)
Co-authored-by: Aurora <aurora@MacBookPro.lan>
2026-04-03 10:27:57 -04:00
mgnyc11
f8380b55c7 fix: send Bearer token auth on all gateway API calls (#15)
Previously hermes-api.ts helper functions (hermesGet, hermesPost,
hermesPatch, hermesDeleteReq, streamChat) sent no Authorization header,
causing 401 'Invalid API key' errors when the gateway has API_SERVER_KEY
configured.

Also exports BEARER_TOKEN from gateway-capabilities.ts so hermes-api.ts
can import and reuse it for auth headers.

Co-authored-by: mgnyc11 <mgnyc11@users.noreply.github.com>
2026-04-02 18:43:17 -04:00
outsourc-e
49a845efda feat: expandable tool cards, mobile nav fixes, dashboard dark mode text 2026-04-02 14:21:45 -04:00
outsourc-e
b9b967565d fix: streaming pipeline, tool data preservation, duplicate messages, vision multimodal 2026-04-02 14:21:38 -04:00
outsourc-e
1c8562a212 chore: remove internal docs, strip private refs, update README for hermes --gateway 2026-04-02 14:21:24 -04:00
outsourc-e
4a6fa13fb1 fix: clipboard fallback for insecure origins (cherry-pick PR #5)
Co-authored-by: DiamondEyesFox <DiamondEyesFox@users.noreply.github.com>
2026-04-02 11:19:26 -04:00
Eric
903615ca12 Merge pull request #3 from DiamondEyesFox/codex/pr-api-ping
Standalone ping route, no conflicts.
2026-04-01 23:23:36 -04:00
Eric
368e5e2b9e Merge pull request #12 from kcgcom/polish/chat-composer-surface
Clean CSS polish, no conflicts.
2026-04-01 23:23:13 -04:00
outsourc-e
d5a9b87be0 fix: streaming and tool call rendering improvements
- skipPublish prevents duplicate streaming in enhanced mode
- display:none on empty streaming placeholder
- Hermes patches: mergeRealtimeAssistantMetadata, streamToolSections
- chat-event-bus conditional publishing
2026-04-01 18:27:29 -04:00
kcgcom
d8e374f8e4 Align chat composer surfaces with theme tokens
The composer used explicit light/dark background classes across
layout modes, so it now relies on the shared `bg-surface` token
and simpler border styling for more consistent theming.

Constraint: Must preserve existing layout behavior while changing only presentation
Rejected: Add a new composer-specific surface abstraction | unnecessary for a 1-file polish
Confidence: medium
Scope-risk: narrow
Reversibility: clean
Directive: Prefer shared theme tokens here unless design introduces a dedicated composer token
Tested: Not run locally
Not-tested: build, test, and manual light/dark visual QA
2026-04-01 16:38:40 +00:00
outsourc-e
4378663d4c fix: clear stale streaming text on new message send
Prevents previous response from briefly flashing when sending
a second message in portable and enhanced modes.
2026-04-01 12:08:02 -04:00
outsourc-e
74fe759f5c fix: bypass Zustand store for portable mode streaming
In portable mode, streaming state now reads directly from
useStreamingMessage's local React state instead of going through
the Zustand store. Eliminates timing bugs where messages got stuck
on 'Thinking...' or disappeared after streaming completed.

Also adds conversation history support — last 20 messages sent
with each request for multi-turn context.

Remaining: duplicate message on first render, model pill display
2026-03-31 22:31:22 -04:00
outsourc-e
d02d8bab1c feat: portable mode - chat works without fork
- SSE streaming pipeline: send-stream → openaiChat → chat-store → UI
- Session key normalization: all portable mode uses 'main'
- Conversation history: last 20 messages sent with each request
- localStorage persistence: messages survive page refresh
- Thinking/content separation: Qwen3 reasoning → thinking events
- Auto-start guard: skip fork when HERMES_API_URL is external
- Legacy message normalization: ensureAssistantTextContent
- Streaming text handoff: completedStreamingTextRef bridges done→render
- Buffer cleanup disabled in portable mode (prevents message disappear)
- Test page: /test-streaming.html for direct SSE testing

Known issues:
- waitingForResponse handoff sometimes sticks (refresh fixes)
- Model pill shows wrong model name
- ClawSuite gateway banner unrelated
2026-03-31 22:03:27 -04:00
outsourc-e
3c6160a402 fix: portable mode chat messages render correctly
Three fixes for 'Thinking... forever' in portable mode:

1. derivedStreamingInfo: Don't report isStreaming=true when last message
   is a complete (non-streaming) assistant message. Previously this caused
   streamingButEmpty=true (isStreaming=true, streamingText=undefined) which
   kept ThinkingBubble visible even after the response arrived.

2. waitingForResponse clearing: Track last assistant message identity at
   send time (not just count). Fast Ollama responses arrive in the same
   React batch as waitingForResponse=true, so finalDisplayMessages.length
   never grows (was already 2 when the effect snapshotted it). Now we also
   check if the assistant message identity changed.

3. isRealtimeStreaming transition: Clear waitingForResponse immediately
   when SSE streaming ends (isRealtimeStreaming true→false). This is the
   most reliable signal in portable mode since useChatStream is a stub
   and never calls onDone, so lastCompletedRunAt is always null.
2026-03-31 19:42:39 -04:00
outsourc-e
c24d899a27 feat: portable-first onboarding and docs (Step 6) 2026-03-31 16:12:12 -04:00
outsourc-e
bab5be5acd feat: advanced screen capability gating (Step 5) 2026-03-31 15:46:46 -04:00
outsourc-e
6a2a9ae66c feat: local thread persistence helper for portable mode (Step 4) 2026-03-31 14:18:32 -04:00
outsourc-e
3337136b38 feat: portable OpenAI-compat streaming in send-stream (Step 3)
- Branches on getChatMode(): portable vs enhanced-hermes
- Portable path: streams via /v1/chat/completions, no session creation
- Emits same SSE events (started/chunk/done) the frontend expects
- Enhanced path: untouched, existing Hermes flow preserved
- tsc clean
2026-03-31 14:17:01 -04:00
outsourc-e
a6c8d0972b feat: chat backend abstraction layer (Step 1)
- chat-mode.ts: resolves backend type from gateway capabilities
- openai-compat-api.ts: OpenAI-compatible /v1/chat/completions client with SSE streaming
- chat-backends.ts: unified sendChatUnified/streamChatUnified that routes to correct backend
2026-03-31 14:10:54 -04:00
outsourc-e
612938193c refactor: two-tier capability probing (core vs enhanced)
- Core: health, chatCompletions, models, streaming
- Enhanced: sessions, skills, memory, config, jobs
- New exports: getCoreCapabilities(), getEnhancedCapabilities(), getChatMode(), getConnectionStatus()
- Probes /v1/chat/completions via OPTIONS with POST fallback
- Backward compat: getCapabilities() still returns full flat object
- Logging now shows mode + core/enhanced split
2026-03-31 14:03:06 -04:00
outsourc-e
7e44362b38 fix: increase stuck-sending threshold to 120s for long tool calls 2026-03-31 13:37:26 -04:00
outsourc-e
bdd9d38aba revert: star history back to working svg api format 2026-03-31 12:35:13 -04:00
outsourc-e
edd8e603af fix: star history use raw githubusercontent URL 2026-03-31 12:34:00 -04:00