Add an AI-powered portfolio assistant that lets users ask natural-language
questions about their holdings, run allocation simulations, and receive
strategy recommendations via a terminal-themed chat UI.
The agent runs as a separate microservice (available as an npm package).
Ghostfolio proxies authenticated requests to it. The feature is fully
optional — if AGENT_SERVICE_URL is not set, all endpoints return 503
and the UI route is inactive.
Architecture:
- NestJS proxy module (REST + WebSocket + SSE streaming)
- Angular lazy-loaded chat page with real-time tool execution visibility
- Strategy questionnaire component for guided portfolio recommendations
- Zero impact on existing features when disabled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(lib): resolve typescript errors in portfolio filter form
* fix(lib): type safety in template
* feat(lib): implement takeUntilDestroyed
* feat(lib): replace constructor params with injections
* feat(lib): change accounts to input signal
* feat(lib): change assetClasses to input signal
* feat(lib): change holdings to input signal
* feat(lib): change tags to input signal
* fix(lib): implement signal for disabled
* fix(lib): implement model signal for disabled
* fix(lib): reduce any types
* feat(lib): resolve typescript errors
* feat(lib): make input a view child signal
* feat(lib): remove unsubscribe subject
* feat(lib): remove ngOnDestroy
* feat(lib): make currencies an input signal
* feat(lib): make formControlName an input signal
* fix(lib): resolve typescript errors
* feat(lib): migrate to takeUntilDestroyed
* fix(lib): resolve type errors
* feat(lib): implement output signal
* feat(lib): clean up variables
* fix(lib): resolve input is deprecated
* feat(lib): implement input signal on placeholder
* feat(lib): implement input signal on isLoading
* fix(lib): add type annotations for date adapter
* fix(lib): handle form value possibly null
* fix(lint): use arrow fn for validators
* fix(lib): accounts table typings
* fix(lib): remove unsubscribeSubject due to lack of observable
* fix(lib): remove validators variable
* feat(lib): implement inject functions
* feat(lib): make locale an input signal
* feat(lib): make showActions an input signal
* feat(lib): make accountId an input signal
* feat(lib): make accountCurrency an input signal
* feat(lib): make accountBalances an input signal
* feat(lib): make sort a viewChild signal
* feat(lib): implement isNil