# 작업로그 · 2026-09-16 (수) | 시간 | 내용 | |------|------| | 17:21 | CodeAssist 백엔드를 OpenCode+Django 로 가는 분석 — 프론트 계약(envelope·쿠키·/chat/stream SSE) vs ABAP_OPENCODE Django(JWT·전역 SSE·OpenCode 미러 없음) 차이표 뽑고, Django 에 어댑터 앱 + OpenCode 컨테이너 분리 안으로 docs/tech/opencode-django-backend.md 작성 | | 17:29 | OpenCode+Django 결정 5개 확정 반영 — Django 새로(5_django_backend 제안, web/BE 에서 accounts·opencode_service·deploy 복사), 토큰 localStorage, Entra 501 고정, OpenCode 분리 인스턴스, 스니펫 로컬 유지. 단계표 0~6 갱신 | | 17:38 | 5_django_backend 뼈대 — ABAP_OPENCODE web/BE 에서 settings·accounts·opencode_service 복사해 CodeAssist 용으로 다듬음. envelope renderer/예외 핸들러(CommonResponse), 이메일 로그인·refresh(body)·logout·me·entra 501. pytest 13개 통과 | | 17:44 | 세션 미러(ChatSession/ChatMessage) + 목록·생성·검색·메시지·취소 API, OpenCode /event 버스, POST /chat/stream 어댑터(prompt_async → part delta→token, session.updated→title, idle 때 tokens/cost→usage→done, 에러 시 부분답변 저장·isGenerating 해제, 클라 끊겨도 턴 감시 태스크가 DB 마무리). opencode/ workspace(AGENTS.md·agent·opencode.json). pytest 29개 통과 | | 17:55 | 프론트 Bearer 모드 — tokenProvider 에 refresh 토큰·localStorage 영속, client/sse refresh 를 body {refreshToken} 로, 로그인 저장·로그아웃 삭제. vitest 225 통과·build OK | | 17:55 | 진짜 OpenCode 1.18.6 붙여 스모크 — (1) 서버가 멀티 프로젝트라 요청마다 ?directory= 안 붙이면 세션이 ABAP_OPENCODE 프로젝트에 생기고 prompt 가 조용히 실패 → OPENCODE_DIRECTORY 전 요청에 부착. (2) 이 Mac 의 OPENCODE_CONFIG_DIR(orca) 가 workspace config 덮음 → README gotcha. (3) 첫 이벤트 60초 무응답이면 error 로 끝냄. 기본 제목 'New session -' 무시. session.error→error 프레임 1초 내 확인, isGenerating 해제 확인. 실제 답변은 유효한 LLM 키 없어 미확인 | | 18:05 | Tauri 앱 맥에서 돌리기 — rustup 설치, windows crate 를 cfg(windows) 타깃 의존성으로, paste/capture 를 cfg 분기 + 맥용 _stub 껍데기(붙여넣기·캡처는 Windows 전용 안내), hwnd 접근을 window::native_handle 로 모음 | | 18:08 | 맥에서 cargo check·test 통과(8개), tauri dev 로 앱 실제 기동 확인(프로세스·Vite·Django 헬스). 핫키 3개 등록 에러 없음 | | 18:13 | ABAP_OPENCODE 의 OpenRouter 키로 OpenCode 띄워 실제 답변 스트림 확인 — 실서버는 글자 단위가 message.part.delta(SDK 타입엔 없음, 파트 타입은 part.updated 로 알아둠) 로 오고 제목은 idle 뒤에 오기도 해서 둘 다 어댑터에 반영. token 90개·title·usage·done, 미러에 토큰·비용·제목 저장 확인. pytest 32 | | 19:53 | 프론트를 ABAP_OPENCODE 디자인(Dark Workspace)에 맞춤 — DESIGN_SYSTEM.md 라이트/다크 토큰을 shadcn 토큰으로 이식(다크 기본, radius 8px, success/warning/shadow-float 추가), 시스템 산세리프로 서체 통일, PwC 로고(LogoMark) 로그인·헤더·목록·히어로에, 세리프 이탤릭·S 타일·Snap Mate 문구 제거, 세션 카드에 항상 border, 스크롤바·선택색 토큰화. detect 0건 | | 20:04 | 백엔드 폴더가 repo 밖 ABAP_CODE_ASSISTANT_BACKEND/ 로 옮겨져 있어 거기서 venv 마저 설치·migrate 후 Django·OpenCode 재기동 — 앱 500 원인은 Django 다운(Vite 프록시 ECONNREFUSED). 문서 경로 갱신 | | 20:10 | 대화 목록 화면 재구성 — 검색줄을 명령줄처럼(오른쪽에 새 대화), 목록은 테두리 블록 하나에 40px 행·옅은 구분선, 테마·로그아웃은 떠 있는 상자 대신 상단 바(웹 헤더/Tauri 제목줄)로, 키 안내 한 줄. 검색 결과에서 코드펜스 기호 제거. Playwright 로 다크/라이트/검색 스크린샷 확인 | | 20:23 | 로그인(Tauri 중복 헤더 제거·가운데 정렬)과 새 대화 화면 재구성 — 목록과 같은 760px 열, 빈 레일 제거, 로고·제목·한 줄 설명·예시 질문 칩 3개(누르면 바로 시작), 입력창을 테두리 상자 하나에 도구줄(고스트 버튼)로 축소, 대화 헤더 뒤로가기도 같은 스타일 | | 20:27 | 대화 화면 입력창을 본문 열 안으로 — 레일 오른쪽 열에 메시지·입력창을 같이 묶어 같은 폭(760px)·같은 왼쪽 끝. 전체 폭 기준 가운데라 본문과 어긋나던 것 해소 | | 20:43 | 대화 말풍선 흰 배경 제거 — 메시지 영역의 theme-light 강제 해제, AI 답변은 상자 없이 본문, 질문은 연한 칩. ABAP 흰 에디터 룩 코드블럭은 라이트 모드에서만(themeStore.resolved), 다크는 어두운 코드 테마. 스니펫 미리보기도 같은 규칙 | | 21:28 | 백엔드 폴더를 repo 안 5_django_backend/ 로 복귀(밖으로 나가 있던 건 내 실수), venv 재생성·pytest 32 통과, 문서 경로 원복, Django·OpenCode 재기동 |