| 2026-04-08 |
Add context token counter: 64k default, live UI display
...
- config: ollama_num_ctx default 8192 → 65536
- LLMChunk: add prompt_tokens / completion_tokens fields
- OllamaBackend.stream: populate token counts from final chunk
(prompt_eval_count + eval_count when chunk.done)
- StreamEnd: add context_tokens and max_context_tokens
- Agent.run_stream: capture token counts, pass to StreamEnd
- websocket: include context_tokens / max_context_tokens in stream_end
- index.html: split chat-header into title span + token-counter span
- sidebar.js: updateChatHeader targets #chat-header-title, not innerHTML
- app.js: updateTokenCounter() shows "X/Y (Z%) tokens", colors:
gray <50%, amber 50–79%, red ≥80%
- style.css: .token-counter, .warn, .danger styles
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
on 8 Apr
|
Client review fixes: bug fix, dead code, deduplication, CSS vars
...
- renderPreviewStrip: fix index-capture bug (splice by value, not index)
- api.js: remove dead sendMessage (messaging goes via WebSocket only)
- utils.js: extract shared esc() and timeLabel() from chat.js + sidebar.js
- enrichSession: remove unnecessary async/Promise.all wrapper
- style.css: thinking-card colors moved to CSS variables in :root
- WsClient: remove unused #sessionId field
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
on 8 Apr
|
Add thinking blocks UI: collapsible reasoning display
...
Thinking card appears on first thinking_delta, auto-collapses on
thinking_end. Re-openable like tool cards. Blue color scheme to
distinguish from regular tool results.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
on 8 Apr
|

Add multimodal image support and client UX improvements
...
Server:
- Add ImageViewTool (load image from file/URL, returns base64)
- Add images field to Message model with created_at timestamp
- Agent run/run_stream accept images param; inject image messages after image_view tool calls
- WebSocket handler accepts images array from client, strips data URI prefix
- All profiles include image_view tool
- Fix tool call serialization (model_dump mode=json for datetime)
- Add no-store cache headers for static files
Client:
- Image attachment: file picker button + clipboard paste + preview strip with remove
- Images rendered in chat bubbles; loaded from history
- Tool cards rebuilt as div+CSS toggle (fixes details/overflow-hidden collapse bug)
- Tool cards appear before response bubble (lazy bubble creation on first stream_delta)
- Typing indicator persists through tool calls, removed only when text starts streaming
- Tool cards restored from history on page reload
- Message timestamps stored via created_at field, shown correctly in history
- Session ID reflected in URL hash for bookmarking; restored on page load
- Remove localStorage session tracking (server last_active used instead)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
on 8 Apr
|
Pin sessions + larger code font
...
Server:
- Session.pinned field (bool, default False)
- SqliteSessionStore: ALTER TABLE migration for existing DBs, set_pinned(),
ORDER BY pinned DESC, last_active DESC
- PATCH /sessions/{id}/pin endpoint
Client:
- Pin/unpin button appears on hover (📌/📍)
- Pinned sessions get blue left border and always-visible pin icon
- Local sort mirrors server sort (pinned first)
- Code blocks font-size bumped from 0.82em to 0.9em
Eugene Sukhodolskiy
committed
on 8 Apr
|
Markdown rendering, syntax highlighting, tool card accordion
...
- marked.js (v12) renders assistant messages as markdown
- highlight.js (v11) highlights code blocks with atom-one-dark theme
- During streaming: raw text; on stream_end: rendered to markdown
- Tool cards redesigned as <details> accordions:
- Shows tool name, icon, success/fail indicator
- Click to expand: arguments grid + scrollable result pre
- Slide-in animation on open
Eugene Sukhodolskiy
committed
on 8 Apr
|
Persistent sessions and client module refactor
...
Server:
- SqliteSessionStore replaces InMemorySessionStore as default backend
- Sessions survive server restarts (stored in navi.db)
- DB_PATH configurable via .env
Client:
- Split monolithic app.js into ES modules:
js/api.js — REST calls
js/ws.js — WebSocket wrapper (WsClient class)
js/chat.js — message area DOM helpers
js/sidebar.js — session list and header helpers
js/app.js — state, wiring, boot
- Active session persisted in localStorage — restored on page reload
Eugene Sukhodolskiy
committed
on 8 Apr
|
Dark theme and session delete
...
- Switch to dark color palette via CSS custom properties
- Delete button appears on hover for each session item
- Deleting active session resets chat to empty state
Eugene Sukhodolskiy
committed
on 8 Apr
|
Add web chat client
...
- Single-page chat UI served as static files from FastAPI
- Sidebar with profile selector, new chat button, session list
- WebSocket streaming: shows tool calls and text deltas in real time
- Typing indicator, streaming cursor, auto-resize textarea
- Session history loads on switch
Eugene Sukhodolskiy
committed
on 8 Apr
|