feat: encrypted user secrets for webhook actions
Add AES-256-GCM encrypted secret storage so users can store API keys,
auth tokens, and JWTs that are injected into webhook HTTP headers at
dispatch time. Secrets are never returned in API responses or logs.
Backend:
- Per-user key derivation via HKDF-SHA256 (SECRETS_KEY env var)
- CRUD API at /api/secrets with audit logging
- {{secret:name}} references in webhook custom headers
- Header validation, sanitization, template namespace guard
- Graceful degradation when SECRETS_KEY is not set
UI:
- Dashboard page at /dashboard/secrets with SecretsManager island
- Custom headers section in webhook action editor
- Nav link to Secrets in header
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>