ai-bridge — 크라우니AI 사람 초대 + 메신저 브릿지
개요
crowny.org AI(:9852)는 단일유저↔AI 1:1 대화였다. 6561 AI집사 turn은 기존 /api/chat 그대로 두고,
사람 참여만 ADDITIVE로 분기. 실시간 전파는 메신저 talk-api(:9766)/talk-ws(:9767)를 SSOT로 재사용
(자체 멀티유저 채널 신설 금지).
무엇을 했나
server.js (ADDITIVE 라우트 3개):
POST /api/conversations/:id/message — 사람 turn append (LLM 미경유, role:'user' 유지 + sender/senderName/kind 추가, append-only). rate bucket 'humanmsg'. notifyTalk로 talk-api 전파.
POST /api/conversations/:id/invite — crypto.randomBytes 게스트토큰 + participants append-only 머지 + inviteUrl 반환.
GET /api/conversations/:id/guest?t= — 토큰 권한 검사 후 conv 열람.
/api/chat extras에 convId의 사람 참여자 → '[멀티 참여]' 1줄 systemPrompt 주입.
POST/PUT conv에 participants 필드 ADDITIVE 보존.
라우트 충돌 수정: 기존 generic GET/PUT/DELETE에 split('/').length===4 가드 추가 → /message·/invite·/guest 서브경로가 generic 핸들러에 먹히지 않게(권한 우회 방지).
public/index.html:
appendMsgEl 3분기(나/다른사람human/AI), .msg-avatar.human + .msg-human-tag(골드 #C9A961).
guestState/talkSocket 상태, sendHumanMessage, inviteHuman+모달, subscribeTalk(talk-ws) + 폴백 폴링(append-only 머지), enterAsGuest(?conv&t).
토픽바 '사람 초대' 버튼. init()에서 ?conv&t 게스트 입장.
/api/chat body에 convId 추가(집사 사람 인지).
사람초대.한선 (동반본, 컴파일+실행 검증):
토큰만들기/참여자추가/사람메시지추가/권한있나/사람참여안내. JSON.한선 배열형 맵, append-only.
검증
- node --check server.js OK, index.html 인라인 JS 추출 검사 OK.
- hanseonc_high 사람초대.한선 → 컴파일 OK, crownyc run 전 단언 통과.
- 임시포트(9853) 통합테스트: invite/guest(valid 200·bad 403)/message(role 보존·wrong token 403)/generic GET 200 모두 통과.
관련 파일
- /Users/ef/crowny-ai/server.js
- /Users/ef/crowny-ai/public/index.html
- /Users/ef/crowny-ai/사람초대.한선
잔여 이슈 (followups)
- talk-ws 구독: window.CROWNY_TALK_WS 미설정 시 wss://talk.crowny.org/ws 기본. 메신저 WS의 SUBSCRIBE 프로토콜/인증 토큰과 guestToken 정합은 메신저(call-av/메신저) 세션과 합의 필요.
- talk-api /api/broadcast 엔드포인트가 메신저 백엔드에 실제 존재하는지 확인 필요(없으면 폴백 폴링만 동작 — 기능은 정상).
- 게스트는 AI 응답을 트리거하지 못함(설계대로 사람 append만). 호스트만 /api/chat 호출.
- 라이브 :9852 재기동은 ops/launchd 담당(본 세션은 코드만, 라이브 미재시작).