- Agent chat: markdown rendering, feedback buttons, sidebar search, category tabs, admin panel with display toggles
- Report page: /report route with Angular lazy loading and auth guard
- Eval pipeline: snapshot generator + deterministic checker (12/12 golden sets passing)
- Pre-commit hook: runs eval:check against saved snapshots (no LLM, milliseconds)
- GitHub Actions: agent-eval.yml CI workflow runs same check on PRs to main
- Golden data tuned to match actual agent response patterns
Static imports fail TS compilation since packages lack type declarations.
Use require() with try/catch and explicitly install @langfuse/otel and
@opentelemetry/sdk-node in the dist directory during Docker build.
- Switch to static imports for @langfuse/otel and @opentelemetry/sdk-node
so webpack includes them in the production bundle
- Redesign agent chat UI: black + teal color scheme matching main app
- Add animated ghostfolio_squash.webm video as logo in header and welcome
- Add /agent/video endpoint to serve the animation
- Update Dockerfile to copy video asset to production build
Add OpenTelemetry-based Langfuse tracing to the AI agent. Every
generateText call now emits spans with tool calls, token usage, and
metadata (userId, conversationId) to Langfuse for monitoring.
Add a new agent module to Ghostfolio with 3 tools (portfolio_summary,
market_data, transaction_history) using Vercel AI SDK + OpenAI. Includes
a chat UI served at /api/v1/agent/ui and an "Agent" link in the main nav.
* fix(lib): update displayedColumns type
* feat(lib): use input function for holdings
* feat(lib): make isLoading a computed signal
* feat(lib): make paginator and sort viewchild signals
* feat(lib): make dataSource a computed signal
* feat(lib): use input function for hasPermission fields
* feat(lib): make displayedColumns a computed signal
* feat(lib): remove ngOnChanges
* feat(lib): update types in holdings mock
* fix(lib): update imports for treemap chart component
* fix(lib): remove unused routeQueryParams variable
* fix(lib): prevent creating new table data source every time the signal changes
* fix(lib): remove unused unsubscribe subject as there is no observable subscription
* fix(lib): revert changes to dataSource in the template
* fix(lib): changed locale to input signal
* fix(lib): change ignoreAssetSubClasses to protected
* fix(lib): create canShowDetails function
* fix(lib): remove unused baseCurrency and deviceType inputs
* fix(lib): remove unused baseCurrency and deviceType inputs from stories
* feat(lib): make constructor as public
* fix(lib): prevent table data source to be created every time
* fix(lib): remove unused unsubscribeSubject variable
* fix(lib): change to protected methods
* feat(lib): change locale to signal input
* feat(lib): remove unused deviceType input
* feat(lib): change hasPermissionToOpenDetails to signal input
* feat(lib): change showFooter to signal input
* feat(lib): change activitiesCount to signal input
* feat(lib): change baseCurrency to signal input
* feat(lib): change totalBalanceInBaseCurrency to signal input
* feat(lib): change totalValueInBaseCurrency to signal input
* feat(lib): change outputs to signal outputs
* Adapt accounts and tags of assistant in impersonation mode
* Update changelog
---------
Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>