fix(security): response headers, rate limits, auth, CI tests, a11y (0.42.2)
Server security:
- Add CSP (default-src 'self', script-src 'self', frame-ancestors 'none'),
X-Frame-Options DENY, X-Content-Type-Options nosniff, Referrer-Policy
- Rate limit blob uploads (30/min), version creation (30/min),
ICS proxy (10/min), push subscribe (10/min)
- AI proxy: require Tailscale auth on chat completions + models endpoints
- AI proxy: validate message objects — role whitelist (system/user/assistant),
content length cap (100KB), message count cap (100)
Infrastructure:
- CI: add test job (npm test + typecheck) before Docker build
- Docker: run as non-root appuser (groupadd + useradd + chown)
- Vite: explicit sourcemap:false to prevent accidental leaks
Accessibility:
- Passphrase dialog: role=dialog, aria-modal, aria-labelledby, focus trap
- Share dialog: role=dialog, aria-modal, aria-label, focus trap,
focus restoration to trigger button on Escape
Closes #638, #639, #640, #641, #642, #643, #644, #645