# InsuRo M1: Supabase `as any` 타입 보완

## 작업 레벨: Lv.2

## 프로젝트 시스템 3문서
- InsuRo: `/home/jay/workspace/memory/plans/insuro-system/plan.md`

## 배경
InsuRo 프론트엔드에서 Supabase 응답에 `as any` 캐스트가 32건 잔존. 타입 안전성이 떨어지고 런타임 에러 위험이 있음.

## 작업
Supabase 타입 정의를 보완하여 `as any` 캐스트를 제거한다.

### 대상 파일 (32건)
```
src/hooks/usePlanFeatures.ts (3건) — plan_id 타입
src/hooks/use-user-tokens.ts (3건) — plan_id 타입
src/hooks/use-fcpa-config.ts (1건)
src/hooks/use-setting-presets.ts (2건) — settings 타입
src/hooks/use-pricing-data.ts (1건)
src/lib/activity-logger.ts (1건)
src/components/PwaInstallPrompt.tsx (1건) — navigator.standalone
src/components/GenerateSettingsPanel.tsx (3건)
src/components/AIUsageTab.tsx (2건)
src/components/ImageGeneratorPanel.tsx (1건)
src/components/ContentCalendarTab.tsx (1건)
src/components/crm/ConsentTab.tsx (1건)
src/components/ChatNotificationListener.tsx (2건)
src/pages/AdminImageFeedback.tsx (1건)
src/pages/AdminFcpa.tsx (3건)
src/pages/CustomerChat.tsx (1건)
src/pages/AdminAnalytics.tsx (1건)
src/pages/CrmMessenger.tsx (1건) — window.Kakao
src/pages/AdminAIConfig.tsx (4건)
```

### 접근법
1. `src/integrations/supabase/types.ts` 확인 — Supabase 자동생성 타입 파일
2. 누락된 테이블/컬럼 타입을 Database 인터페이스에 추가
3. 각 파일에서 `as any` → 적절한 타입으로 교체
4. `window.Kakao`, `navigator.standalone` 같은 브라우저 API는 declare 또는 타입 가드 사용
5. `tsc --noEmit`으로 타입 에러 0건 확인

### 주의사항
- Supabase 타입은 `npx supabase gen types` 로 재생성 가능하면 그게 최선
- 타입 변경으로 기존 로직이 깨지지 않도록 주의
- `as any`를 `as unknown as SomeType`으로 바꾸는 건 개선이 아님 — 실제 타입 정의가 필요

## 검증 시나리오
1. `npx tsc --noEmit` 에러 0건
2. `as any` grep 결과 0건 (또는 불가피한 브라우저 API만 잔존)
3. `npm run build` 성공
