Closes the biggest content gap found against PRD.md §3.1 P0: group chat catch-up was one of only two v1 MVP scenarios and had zero implementation. Backend (core-backend): - ConversationParticipant.LastReadMessageID read marker. - POST /conversations/:id/read advances the caller's marker (never backward). - GET /conversations/:id/summary builds context from messages since that marker and calls ai-service's new POST /summarize; returns unread_count and needs_reply. - GET /conversations now reports unread_count per room. - Safety: group conversations now unconditionally block twin-authored sends (POST /conversations/:id/messages), regardless of the sender's global autonomy level. PRD.md §2.3-③ requires this scenario stay L0-fixed with no auto-send; autonomy level is a per-user global setting today, so this closes the only path a global L2 whitelist match could otherwise auto-send into a group. AI service (ai-service): new summarize.py module (same Gemini-call shape as generation.py's draft_reply, no escalation/identity gating since nothing generated here is ever sent) + POST /summarize. Mobile: "새 대화" dialog now supports adding/removing multiple peer fields (2+ peers -> is_group:true automatically); unread badge on conversation rows; ChatScreen takes isGroup and renders its L1 panel as L0-locked for groups; new "안 본 동안 요약" AppBar action opens a dialog with the summary and, when a reply looks needed, a button that feeds straight into the existing draft-request flow. Verified with a real Flutter build against a live core-backend + ai-service instance (Playwright driving 3 demo accounts through group creation, unread badges, and the summary dialog) — this caught a real ordering bug: marking the read marker on chat *open* meant the summary was always empty by the time you could tap it, since opening the room already advanced the marker past everything you'd come to catch up on. Fixed by marking read on screen *exit* (dispose) instead, so the marker reflects what was unread that whole visit and updates once you leave. go test / pytest / flutter analyze+test all pass. |
||
|---|---|---|
| ai-service | ||
| backend | ||
| core-backend | ||
| deploy | ||
| docs | ||
| mobile | ||
| poc/tone-corpus | ||
| scripts | ||
| secrets | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| README.md | ||
| docker-compose.yml | ||
README.md
hikikomori / 와카뷰 (가칭)
카카오톡 대안 메신저 — "나를 대신해 남과 대화하는 AI 와카뷰".
구조
| 경로 | 역할 |
|---|---|
docs/ |
기획·PRD·기술설계·로드맵·PoC 계획 |
core-backend/ |
Go 코어 (가입·메시지·WebSocket·자율성·안전장치) |
ai-service/ |
Python AI 내부 API (/draft, /escalate/check) |
backend/ |
초기 Python 프로토타입 (참고용) |
poc/tone-corpus/ |
PoC 실험 스크립트 |
mobile/ |
Flutter 클라이언트 (Android 우선) |
문서
- 기획:
docs/PLANNING.md· 결정:docs/decision-log.md(Q1~Q7 확정) - Vision / PRD / 기술설계:
docs/vision.md·docs/PRD.md·docs/tech-design.md - 로드맵 (작업 체크리스트):
docs/roadmap.md - 배포·잔여 실행 트랙:
docs/deploy-checklist.md(N1 스모크 → N2 Docker → … → N5 사람 PoC) - 베타 직전(C):
docs/invite-ops.md·docs/android-release.md·docs/prototype.md - PoC 계획/준비물:
docs/poc-plan.md·docs/poc-materials.md
AI 에이전트 규칙
AGENTS.md·CLAUDE.md- 브랜치: 작업·머지는 항상
main - 리모트: GitHub
origin+ Giteagitea(iykyka) —main갱신 후./scripts/push-both.sh
현재 단계
- Phase 1 A~C + N2 컷오버 + N3 안정화 완료 — 라이브:
https://msn.iykyka.com - 테스터 안내:
docs/tester-guide.md· 데모 코드DEMO-YKAVU - 다음 (선택): N4 FCM·Android QA
- 맨 마지막: N5 / D — 사람 PoC (
docs/roadmap.md§3). §3 기본값 추측 금지 - 프로토타입 공유 URL은
docs/prototype.md의SHARE_URL에 Master가 기입
로컬 실행 (요약)
# 터미널 1 — AI 서비스
cd ai-service && pip install -r requirements.txt
export GEMINI_API_KEY=... # or repo-root .env
uvicorn app.main:app --port 8001
# 터미널 2 — 코어 백엔드
cd core-backend
export ADMIN_API_TOKEN=dev-admin-token
go run . migrate && go run .
# 초대 코드 발급 예:
# curl -X POST http://localhost:8080/invites -H "Authorization: Bearer $ADMIN_API_TOKEN"
# 터미널 3 — Flutter (Android)
cd mobile && flutter run --dart-define=CORE_API_BASE=http://10.0.2.2:8080
Docker (N2-B / msn.iykyka.com)
- 구성:
docs/deploy-docker.md - Portainer·컷오버:
docs/deploy-portainer.md - 서버 기동:
./scripts/server-up.sh(호스트에서.env채운 뒤)
cp .env.example .env # ADMIN_API_TOKEN, POSTGRES_PASSWORD 필수
# 로컬: PUBLIC_API_BASE=http://localhost:8088
docker compose up -d --build
curl -sS http://localhost:8088/health
Postgres·AI는 내부망만. 엣지 프록시는 web:80(또는 WEB_HOST_PORT)만 공개.