Three remaining TODOs resolved:
1. NudgeToast (in-app nudge display):
- New NudgeToast.svelte in bottom-stack alongside SuggestionToast
- Evaluates Pulse Rules every 60s, shows nudges as toasts
- Action button navigates to module route, dismiss records outcome
- Badge shows count when multiple nudges are queued
2. Server LLM fallback:
- Companion engine now tries local LLM (Gemma/WebGPU) first
- Falls back to mana-api /api/v1/chat/completions if no WebGPU
- isCompanionAvailable() returns true if either path works
- Graceful error messages when neither is available
3. Trigger-Event bridge (legacy automation migration):
- event-bridge.ts maps 13 domain event types to legacy
(appId, collection, op) format
- Existing user automations now fire on domain events too
- Domain events carry decrypted data → condition matching on
encrypted fields (title, etc.) works correctly
- Bridge wired into layout startup/cleanup
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>