Commit graph

463 commits

Author SHA1 Message Date
jedarden
aaa622d410 feat(ui): implement command palette (Component 34) with tests
- commandpalette.js: CommandPaletteManager with fuzzy scorer, time parsing,
  command registry (20 commands), recent history, entity search, mode gating
- commandpalette.css: modal overlay, search input, result list styles
- commandpalette.test.js: 64 tests covering fuzzy match, time parsing, commands
  completeness, keyboard nav, recent history, expert-mode gating, positioning
- app.js: spaxelGetState() exposure and Ctrl+K fallback listener
- index.html: includes commandpalette.css and commandpalette.js
- explainability.js + explain.go: detection explainability backend/frontend
- hub.go + server.go: dashboard WebSocket and API updates

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 19:51:16 -04:00
Argo Workflows CI
2df378a666 ci: auto-bump version to 0.1.193 2026-04-13 23:08:17 +00:00
jedarden
823b67c630 feat(events): implement activity timeline with two-phase shutdown and test fixes
- StorageSubscriber: refactor to two-phase shutdown (forwarders drain
  EventBus channels into queue, then worker drains queue to SQLite)
  ensuring no in-flight events are lost on Stop()
- Fix bus_test: increase channel capacity to avoid non-blocking drops
  in TestEventBusConcurrentPublish
- Fix events_test: set MaxOpenConns(1) for in-memory SQLite to prevent
  concurrent-connection data visibility issues
- Fix storage_test: remove manual ctx/cancel initialization after
  StorageSubscriber struct was refactored to separate workerCtx/forwarderCtx
- Fix api/events.go: zone_id and person_id always take precedence;
  until timestamp uses < (cutoffMs+1000) to include full RFC3339 second
- Fix api/events_test: default mode is expert, simple mode requires
  explicit ?mode=simple parameter

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 19:08:02 -04:00
Argo Workflows CI
0ed2ecbc58 ci: auto-bump version to 0.1.192 2026-04-13 22:08:30 +00:00
jedarden
76156b9c22 test(notify): add comprehensive tests for notification system
- Floor-plan renderer: 300x300 PNG dimensions, zone boundary pixel
  coordinates, blob colors (identified green, fall red, unknown blue)
- Batching: 3 LOW events produce 1 merged notification; URGENT bypasses
  batch queue and sends immediately
- Quiet hours gate: LOW suppressed, URGENT delivered; midnight-crossing
  range handled correctly
- Morning digest: queued events bundled and sent at digest time;
  sendMorningDigest clears queue and sets digestSentToday flag
- ntfy delivery: mock HTTP server verifies Title/Tags/Priority headers
  and body; image attachment in X-Image header
- Webhook delivery: JSON structure verified, base64 PNG image field
  decoded correctly; custom headers forwarded
- Test-notification endpoint: integration tests for ntfy and webhook
  channels with real HTTP mock servers
- Coverage: 81.2% on internal/notify (exceeds 80% requirement)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 17:42:26 -04:00
Argo Workflows CI
7679c7ebeb ci: auto-bump version to 0.1.191 2026-04-13 20:24:20 +00:00
jedarden
de272331b6 fix(health): don't degrade status when no nodes are connected
Zero connected nodes is valid for headless/standby deployments. The
5-minute grace period was causing an infinite crash loop: healthz
returned 503 after 5min uptime → liveness probe failed → pod restarted.
The "no nodes connected" reason is still reported but no longer sets
status to degraded.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:24:07 -04:00
Argo Workflows CI
ecad097c2b ci: auto-bump version to 0.1.190 2026-04-13 16:28:32 +00:00
jedarden
d67ec45d15 fix(auth): serve minimal login page for unauthenticated page requests
Instead of serving the full dashboard HTML (which exposes the UI shell
when the auth overlay is deleted), serve a minimal page that only loads
the auth JS and CSS. Deleting the overlay now reveals a blank page.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 12:28:16 -04:00
Argo Workflows CI
d83846b1f3 ci: auto-bump version to 0.1.189 2026-04-13 15:01:13 +00:00
jedarden
2976cc08a5 fix(auth): register middleware before routes (chi requirement)
Chi panics if r.Use() is called after any route registration.
Move the auth middleware registration before RegisterRoutes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 11:01:01 -04:00
Argo Workflows CI
8cb15e0c6e ci: auto-bump version to 0.1.188 2026-04-13 14:50:34 +00:00
jedarden
3cd10f6f07 fix(auth): enforce PIN authentication server-side on all API/WS routes
The PIN overlay was client-side only — deleting the DOM element bypassed
auth entirely. Add global chi middleware that returns 401 on protected
endpoints when no valid session cookie is present. Static files pass
through so the login page renders. During onboarding (no PIN set), all
routes remain open.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 10:50:18 -04:00
Argo Workflows CI
b8aa830329 ci: auto-bump version to 0.1.187 2026-04-12 21:27:36 +00:00
jedarden
6bcd4711f1 fix: guard migration 7 ALTER TABLE with column existence check
SQLite doesn't support IF NOT EXISTS on ALTER TABLE ADD COLUMN.
The error_message and error_count columns already exist in the
triggers table from v0.1.33, causing migration 7 to fail on upgrade.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 17:27:24 -04:00
Argo Workflows CI
22a5bfe561 ci: auto-bump version to 0.1.186 2026-04-12 21:14:23 +00:00
jedarden
1cf11ac197 fix: resolve compilation errors breaking CI builds
- fleet/handler.go: add ota. package prefix to NodeOTAProgress
- notification_settings.go: remove duplicate declarations of
  testNotificationRequest, validateChannelConfig, writeJSON, and
  writeJSONError that conflict with notifications.go and utils.go;
  fix missing closing brace in validateTimeFormat
- cmd/mothership/main.go: use sigproc.HealthLogEntry (the actual
  return type of GetHealthHistory) instead of diagnostics.LinkHealthSnapshot

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 17:14:05 -04:00
Argo Workflows CI
6557977be2 ci: auto-bump version to 0.1.185 2026-04-12 02:42:09 +00:00
jedarden
136b2ecd97 feat: add OTA progress tracking to fleet status page
Add real-time OTA update progress broadcasting to dashboard clients:
- Hub.BroadcastOTAProgress() sends progress updates over WebSocket
- OTA Manager now broadcasts state transitions: pending → downloading → rebooting → verified/failed/rollback
- Dashboard can show live OTA status per node during fleet updates
- Includes test suite for fleet page functionality

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 22:41:51 -04:00
jedarden
c9d25cde17 Update fleet status page bead (spaxel-0w4) - implementation complete
The fleet status page is fully implemented with all required features:
- HTML structure with navigation, filters, bulk actions, modals
- JavaScript with state management, filtering, sorting, inline editing, camera fly-to, CSV export
- CSS with responsive design and comprehensive styling
- REST API endpoints for all fleet operations
- Comprehensive test coverage

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 22:41:51 -04:00
Argo Workflows CI
531b953f0a ci: auto-bump version to 0.1.184 2026-04-12 01:37:49 +00:00
jedarden
ff71d48962 feat: add OTA progress tracking to fleet status page
- Show "updating" status for nodes undergoing OTA updates
- Add OTAInProgress field to FleetNode response
- Improve updateAllNodes to trigger rolling OTA updates

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 21:37:37 -04:00
Argo Workflows CI
c83dccf576 ci: auto-bump version to 0.1.183 2026-04-12 01:03:04 +00:00
jedarden
d500900e0b feat: add feature discovery notification UI to proactive dashboard
Adds frontend implementation for feature discovery notifications:
- Polls /api/help/notifications every 30 seconds
- Displays notification cards with slide-in animation
- Handles action button clicks for navigation
- Persists dismissed notifications to prevent re-display
- Auto-dismisses after 30 seconds

Completes the feature discovery notifications feature for Phase 9,
complementing the backend notifier and monitor implementations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 21:02:43 -04:00
Argo Workflows CI
362ba60895 ci: auto-bump version to 0.1.182 2026-04-11 23:52:26 +00:00
jedarden
70745bb577 feat: implement proactive quality prompts with link diagnostics
- Show non-blocking prompt card when ambient confidence drops below 0.6 for >5 minutes
- Add 'Diagnose' button that fetches and displays root cause analysis
- Add 'Dismiss for today' option with localStorage persistence
- Implement pulsing amber highlight on 3D link lines for degraded links
- Display diagnostic results in plain English with possible causes and actions
- Do NOT show prompts for transient drops (< 5 minutes)
- Add GetDiagnosticFor method to diagnostics package for timestamp-based queries
- Wire up /api/links/{linkID}/diagnostics endpoint with health snapshots

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 19:51:57 -04:00
Argo Workflows CI
479ee7e3d9 ci: auto-bump version to 0.1.181 2026-04-11 21:56:00 +00:00
jedarden
4734e62aa1 feat: implement notification configuration UI for dashboard
Add comprehensive notification settings with delivery channel selector,
channel-specific credential fields, test notification button, event
type toggles, quiet hours picker, smart batching, and morning digest.

Backend:
- Add NotificationSettingsHandler with GET/PUT /api/settings/notifications
- Add POST /api/notifications/test endpoint
- Support ntfy, pushover, webhook channels with validation
- Store settings in settings table with proper JSON encoding

Frontend:
- Integrate notification settings into settings panel
- Channel selector with dynamic credential fields
- Event type toggles for filtering notifications
- Quiet hours time picker with day-of-week bitmask
- Smart batching toggle (default on)
- Morning digest toggle (default on)
- Test notification button with immediate feedback

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 17:55:31 -04:00
Argo Workflows CI
adfacf1951 ci: auto-bump version to 0.1.180 2026-04-11 17:37:29 +00:00
jedarden
2d34f77d87 feat: implement expert vs simple mode for timeline panel
Add mode switching for timeline panel. Expert mode shows all event
types with system events as secondary (smaller, greyed). Simple mode
shows only person-relevant events: ZoneTransition, FallDetected,
AnomalyDetected, SleepSessionEnd. Mode is set by dashboard mode and
passed as ?mode=expert or ?mode=simple to API.

Changes:
- dashboard/index.html: Add sidebar timeline panel HTML and script include
- dashboard/js/sidebar-timeline.js: Add sidebar timeline with mode switching
- dashboard/js/sidebar-timeline.test.js: Add tests for mode switching behavior
- mothership/internal/ingestion/server.go: Add health score to link info

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 13:37:17 -04:00
Argo Workflows CI
5735d000b3 ci: auto-bump version to 0.1.179 2026-04-11 17:22:48 +00:00
jedarden
6bfe4aad01 feat: implement expert vs simple mode for timeline panel
- Add mode switching for timeline panel with ?mode=expert or ?mode=simple
- Expert mode displays all event types with system events as secondary (smaller, greyed)
- Simple mode shows only person-relevant events: ZoneTransition, FallDetected, AnomalyDetected, SleepSessionEnd, zone_entry/exit, portal_crossing, fall_alert, anomaly, security_alert
- Backend defaults to expert mode when mode parameter is empty or invalid
- Frontend syncs dashboard mode with SpaxelSimpleModeDetection for mode changes
- Add CSS styling for new event types (ZoneTransition, FallDetected, AnomalyDetected, sleep_session_end)
- Update isValidEventType to include new event types
2026-04-11 13:22:34 -04:00
Argo Workflows CI
c9b36092d5 ci: auto-bump version to 0.1.178 2026-04-11 14:34:44 +00:00
jedarden
5d78e08441 fix: correct test expected responses to include newline
The writeJSON function uses json.NewEncoder which adds a newline
character. Changed raw string literals to interpreted strings
so \n becomes an actual newline character.
2026-04-11 10:34:31 -04:00
jedarden
a984576be9 feat: complete fleet status page implementation
- Added dropdown menu for More actions button with options:
  - Re-assign Role
  - View Health History
  - View Event History
  - Remove from Fleet

- Added CSS styles for dropdown menus with proper positioning
  and hover states

- Extended FleetHandler with additional API endpoints:
  - PATCH /api/nodes/{mac}/label - update node label
  - POST /api/nodes/{mac}/locate - send identify command
  - POST /api/nodes/{mac}/role - assign new role
  - DELETE /api/nodes/{mac} - remove from fleet

- Added label validation (max 32 characters)

- Improved test code quality with helper functions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 10:34:31 -04:00
Argo Workflows CI
3d17b0f888 ci: auto-bump version to 0.1.177 2026-04-11 12:54:40 +00:00
jedarden
2824affde7 feat: crowd flow visualization implementation
Implements comprehensive crowd flow visualization for the Spaxel
WiFi CSI-based indoor positioning system. The feature tracks movement
patterns over time and renders them as directional flow maps and dwell
hotspot heatmaps.

Key components:
- FlowAccumulator: Subscribes to TrackManager updates (10 Hz) and
  accumulates trajectory data with 0.2m sampling threshold
- SQLite tables: trajectory_segments, dwell_accumulator, detected_corridors
- Flow map computation: Bresenham's line algorithm for grid traversal,
  5-minute cache, time/person filtering
- Dwell heatmap: Stationary detection (< 0.1 m/s), normalized 0-1
- Corridor detection: Circular variance analysis, connected components
- 3D visualization: Animated arrows (flow), heatmap patches (dwell),
  raised platforms (corridors)
- REST API: /api/analytics/flow, /api/analytics/dwell, /api/analytics/corridors
- Dashboard controls: Time/person filters, layer toggles, auto-refresh

Background tasks:
- Daily pruning of trajectory segments older than 90 days
- Weekly corridor detection and recomputation

Load shedding integration:
- Suspends crowd flow accumulation at Level 1 (≥80ms iteration time)
- Respects ShouldAccumulateCrowdFlow() flag from loadshed package

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 08:54:10 -04:00
Argo Workflows CI
c1c4d5a751 ci: auto-bump version to 0.1.176 2026-04-11 12:34:41 +00:00
jedarden
a97960bf67 fix: resolve analytics API test failures and improve corridor response format
- Fix TestAnalyticsHandler_ErrorHandling to use proper in-memory database
  instead of nil database which caused nil pointer dereference
- Update handleGetCorridors to return corridors wrapped in {corridors: [...]}
  for consistency with frontend expectations from crowdflow.js

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 08:34:24 -04:00
Argo Workflows CI
7cd5297f66 ci: auto-bump version to 0.1.175 2026-04-11 12:15:13 +00:00
jedarden
bbb29a2629 fix: resolve remaining Go compilation errors across mqtt, analytics, localization, ingestion
- cmd/mothership/main.go: fix GetAllZones (single return), LastSeenAt vs LastSeenMs,
  remove undefined fusionEngine block, fix weights.GetLinkWeight usage, hoist
  learningHandler scope, remove unused recordingBuf/lastDetectionEvent vars, remove
  sync import, fix computeZoneQuality pointer dereference, fix pred field names
  (PredictedNextZoneID/PredictionConfidence), fix AccuracyStats.TotalPredictions,
  add GetNodeOfflineDuration to healthProviderAdapter, fix GetAccuracyDelta stub
- internal/api/guided.go: refactor GuidedManager interface to use time.Duration for
  TriggerNodeOffline, use any for zonesHandler/nodesHandler, remove diagnostics.Tooltip
  dependency, add GetTooltipAny type-assertion approach for cross-package tooltip access
- internal/api/tracks.go: unify TracksProvider to use signal.TrackedBlob directly via
  type alias to resolve interface mismatch
- internal/api/diurnal.go: add signalProcessorManagerAdapter and
  NewDiurnalHandlerFromSignal to bridge signal.ProcessorManager to DiurnalProcessorManager
- internal/guidedtroubleshoot/quality.go: add RecordEdit, MarkHintShown, GetTooltipAny
  methods to Manager to satisfy api interfaces
- internal/fusion/fusion.go: remove unused log import, fix oy declared-and-not-used

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 08:15:00 -04:00
Argo Workflows CI
ba4074e84d ci: auto-bump version to 0.1.174 2026-04-11 11:37:16 +00:00
jedarden
33e96d82d0 feat: add person filter dropdown to crowd flow visualization
The crowdflow.js module expected a person filter dropdown in the patterns
section of the dashboard UI. This dropdown allows filtering flow and dwell
data by specific people or viewing all people together.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 07:37:05 -04:00
Argo Workflows CI
0ca4b47f28 ci: auto-bump version to 0.1.173 2026-04-11 11:27:32 +00:00
jedarden
f99dc15a2d feat: complete crowd flow visualization implementation
- Fix Viz3D exports to include flow visualization functions
- Export setFlowLayerVisible, setDwellLayerVisible, setCorridorLayerVisible
- Export setFlowTimeFilter, setFlowData, setDwellData, setCorridorData
- Remove duplicate setDwellLayerVisible function definition

This completes the crowd flow visualization feature that was
already implemented in the backend (flow.go) and frontend
(crowdflow.js, viz3d.js) but had missing exports in the Viz3D module.
2026-04-11 07:27:21 -04:00
Argo Workflows CI
26553ed954 ci: auto-bump version to 0.1.172 2026-04-11 10:39:26 +00:00
jedarden
abaf070f47 test: add missing GetSystemMode method to mockDetectorProvider
Fixes compilation error in security tests by implementing the
GetSystemMode() method that was added to the DetectorProvider
interface.
2026-04-11 06:39:16 -04:00
Argo Workflows CI
d5a5b74e0c ci: auto-bump version to 0.1.171 2026-04-11 10:30:20 +00:00
jedarden
af64a30af6 feat: home automation integration (MQTT and webhooks)
Add comprehensive MQTT and webhook integration for Home Assistant and external services:

MQTT Client (internal/mqtt/client.go):
- Optional MQTT client with exponential backoff reconnect (5s-120s)
- TLS support for mqtts:// connections
- Home Assistant auto-discovery for persons, zones, fall detection, system health, system mode
- Topic structure: spaxel/{mothership_id}/person/{id}/presence, zone/{id}/occupancy, etc.
- LWT (Last Will and Testament) for availability
- Dynamic configuration updates via API
- Retained messages for presence and occupancy states

MQTT Publisher (internal/mqtt/publisher.go):
- Event bus subscriber publishing zone entry/exit, fall alerts, anomalies
- Person presence tracking across zones with home/not_home states
- Zone occupancy counting with occupants list
- Periodic system health publishing (60s interval)
- HA discovery methods for all entity types
- Person and zone discovery removal on delete

System Webhook (internal/webhook/publisher.go):
- Single webhook URL receiving all events with X-Spaxel-Event header
- JSON payload with event_type, timestamp, zone, person, blob_id, severity, detail
- Retry policy: one retry after 30s on 5xx errors
- Test webhook endpoint for configuration verification

API Integration Handler (internal/api/integrations.go):
- GET/POST /api/settings/integration for MQTT and webhook configuration
- POST /api/settings/integration/test for testing connections
- Settings persisted in database settings table
- Integration with existing MQTTClient and WebhookPublisher interfaces

Dashboard Integration UI (dashboard/integrations.html, js/integrations.js):
- Settings panel with MQTT broker URL, username, password (masked), TLS toggle
- Discovery prefix configuration
- Test Connection and Publish Discovery buttons
- System webhook URL configuration with enable toggle
- Connection status indicator with error messages

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 06:29:51 -04:00
Argo Workflows CI
022296cce2 ci: auto-bump version to 0.1.170 2026-04-11 09:23:48 +00:00