Pulse/internal/api
rcourtman a3d953172c feat(ai): Add LLM memory system for patrol findings
Implements a comprehensive feedback system that allows the LLM to 'remember'
user decisions about findings, preventing repetitive/annoying alerts.

Backend changes:
- Extended Finding struct with dismissed_reason, user_note, times_raised, suppressed
- Added Dismiss(), Suppress(), SetUserNote(), IsSuppressed() methods to FindingsStore
- Added GetDismissedForContext() to format dismissed findings for LLM context
- Enhanced buildPatrolPrompt() to inject user feedback context
- Added POST /api/ai/patrol/dismiss and /api/ai/patrol/suppress endpoints
- Updated IsActive() to exclude suppressed findings

Frontend changes:
- Added Dismiss dropdown with options: Not an Issue, Expected Behavior, Will Fix Later
- Added Never Alert Again option for permanent suppression
- Expected Behavior prompts for optional note to help LLM understand context
- Added visual badges: recurrence count (×N), dismissed status, suppressed indicator
- Display user notes in expanded finding view

Also fixes:
- Fixed 403 error on Run Patrol (compilation errors from partial refactoring)
- Removed non-LLM patrol checks - patrol now uses LLM analysis only
- Fixed function signature mismatches in alert_triggered.go

The LLM now receives context about previously dismissed findings and is
instructed not to re-raise them unless severity has significantly worsened.
2025-12-10 22:55:34 +00:00
..
ai_handlers.go feat(ai): Add LLM memory system for patrol findings 2025-12-10 22:55:34 +00:00
alerts.go Refactor alert system: fix race conditions, memory leaks, and improve code quality 2025-12-02 23:31:36 +00:00
alerts_test.go
auth.go
auth_helpers_test.go style: Apply gofmt to 37 files 2025-12-02 17:21:48 +00:00
auth_scope_test.go
bootstrap_token.go
bootstrap_token_test.go
charts_test.go feat: AI integration, Docker metrics, RAID display, and infrastructure improvements 2025-12-09 09:29:27 +00:00
config_handlers.go feat: AI features, agent improvements, and host monitoring enhancements 2025-12-05 10:37:02 +00:00
config_handlers_auto_reg_test.go
config_handlers_auto_register_test.go
config_handlers_cluster_test.go
config_handlers_host_test.go style: Apply gofmt to 37 files 2025-12-02 17:21:48 +00:00
config_handlers_pve_user_test.go style: Apply gofmt to 37 files 2025-12-02 17:21:48 +00:00
config_handlers_sanitize_test.go
config_handlers_setup_script_test.go
config_handlers_temperature_test.go
config_handlers_transport_guard_test.go
csrf_store.go
csrf_store_test.go
demo_middleware.go
demo_middleware_test.go
diagnostics.go
diagnostics_test.go style: Apply gofmt to 37 files 2025-12-02 17:21:48 +00:00
DO_NOT_EDIT_FRONTEND_HERE.md
docker_agents.go security: Add request body size limits to API handlers 2025-12-02 16:43:13 +00:00
docker_agents_test.go
docker_metadata.go feat(ai): Add URL discovery tool - AI can find and set resource URLs 2025-12-10 00:29:07 +00:00
export_test.go
frontend_embed.go
guest_metadata.go feat(ai): Add URL discovery tool - AI can find and set resource URLs 2025-12-10 00:29:07 +00:00
host_agents.go security: Add request body size limits to remaining API handlers 2025-12-02 16:47:13 +00:00
host_agents_test.go
host_metadata.go feat(ai): Add URL discovery tool - AI can find and set resource URLs 2025-12-10 00:29:07 +00:00
http_metrics.go
http_metrics_test.go
metadata_provider.go feat(ai): Add URL discovery tool - AI can find and set resource URLs 2025-12-10 00:29:07 +00:00
middleware.go
middleware_test.go
notification_queue.go security: Add request body size limits to remaining API handlers 2025-12-02 16:47:13 +00:00
notifications.go security: Add request body size limits to notification handlers 2025-12-02 16:37:30 +00:00
notifications_test.go
oidc_handlers.go
oidc_handlers_test.go
oidc_service.go
oidc_service_test.go
rate_limit_config.go
rate_limit_config_test.go style: Apply gofmt to 37 files 2025-12-02 17:21:48 +00:00
ratelimit.go docs: Add godoc comments to exported functions 2025-12-02 15:58:59 +00:00
ratelimit_test.go
README.md
recovery_tokens.go
recovery_tokens_test.go
resource_handlers.go fix: Populate resources on-demand when /api/resources is called 2025-12-07 14:47:29 +00:00
router.go feat(ai): Add LLM memory system for patrol findings 2025-12-10 22:55:34 +00:00
router_arch_test.go
router_download_test.go
router_integration_test.go
router_test.go style: Apply gofmt to 37 files 2025-12-02 17:21:48 +00:00
security.go feat(ai): Add LLM memory system for patrol findings 2025-12-10 22:55:34 +00:00
security_oidc.go
security_setup_fix.go
security_setup_fix_test.go
security_test.go
security_tokens.go refactor: Remove unreachable dead code branches 2025-12-02 14:41:53 +00:00
security_tokens_test.go
session_store.go
session_store_test.go
system_settings.go security: Add request body size limits to remaining API handlers 2025-12-02 16:47:13 +00:00
system_settings_temperature_test.go
system_settings_utils_test.go
system_settings_validate_test.go
temperature_proxy.go security: Add request body size limits to remaining API handlers 2025-12-02 16:47:13 +00:00
temperature_proxy_command_test.go
temperature_proxy_test.go
types.go feat: AI integration, Docker metrics, RAID display, and infrastructure improvements 2025-12-09 09:29:27 +00:00
unified_agent.go
unified_agent_test.go
updates.go security: Add request body size limits to remaining API handlers 2025-12-02 16:47:13 +00:00
updates_test.go style: Apply gofmt to 37 files 2025-12-02 17:21:48 +00:00

Internal API Package

This directory contains the API server implementation for Pulse.

Important Note About frontend-modern/

The frontend-modern/ subdirectory that appears here is:

  • AUTO-GENERATED during builds
  • NOT the source code - just a build artifact
  • IN .gitignore - never committed
  • REQUIRED BY GO - The embed directive needs it here

Frontend Development Location

👉 Edit frontend files at: /opt/pulse/frontend-modern/src/

Why This Structure?

Go's //go:embed directive has limitations:

  1. Cannot use ../ paths to access parent directories
  2. Cannot follow symbolic links
  3. Must embed files within the Go module

This is a known Go limitation and our structure works around it.