Skip to content

feat: improve notifications, interface scaling, and transcript UX - #34

Merged
devswha merged 7 commits into
devswha:mainfrom
Yoonwoo-Ha:fix/notification-deeplink-font-size
Aug 12, 2026
Merged

feat: improve notifications, interface scaling, and transcript UX#34
devswha merged 7 commits into
devswha:mainfrom
Yoonwoo-Ha:fix/notification-deeplink-font-size

Conversation

@Yoonwoo-Ha

@Yoonwoo-Ha Yoonwoo-Ha commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

배경

모바일·PWA에서 ChatMux를 사용할 때 확인된 다음 문제를 함께 개선합니다.

  1. 완료 알림을 눌러도 해당 대화가 아니라 홈으로 이동하는 경우가 있었습니다.
  2. 코드 에디터 글꼴 설정이 실제 편집기 전체에 반영되지 않았고, 채팅·사이드바·설정 화면의 전체 글꼴 크기는 조절할 수 없었습니다.
  3. ChatMux에서 Codex 응답을 중단하면 turn만 멈추는 것이 아니라 Codex CLI 프로세스까지 종료될 수 있었습니다.
  4. 이미지가 포함된 긴 transcript는 미리보기를 사용하지 않아도 이미지 정보를 전송했고, 대용량 Codex JSONL은 페이지를 열 때마다 처음부터 다시 읽었습니다.
  5. 대용량 도구 출력이 standalone tool_result와 tool card 안에 중복으로 포함되어 응답 크기와 렌더링 비용이 커졌습니다.

변경 사항

알림 딥링크

  • 외부 CLI 완료 알림 URL에 내부 alias가 아닌 실제 ChatMux appSessionId를 사용합니다.
  • 아직 앱 세션으로 매핑되지 않은 generation은 존재하지 않는 세션 URL 대신 /로 이동합니다.
  • service worker가 /session/:id의 세션 ID를 보존합니다.
  • 알림 클릭 시 열린 클라이언트에 notification:navigate를 먼저 보내 SPA 라우팅을 수행합니다.
  • iOS에서 WindowClient.navigate()가 거부되어도 클릭 처리가 실패하지 않도록 보조 경로를 유지합니다.

인터페이스 및 에디터 글꼴

  • CodeMirror 본문과 gutter에 에디터 글꼴 크기를 명시적으로 적용합니다.
  • 기본 에디터 글꼴 크기를 외관 설정과 같은 14px로 맞춥니다.
  • 외관 설정에 전체 인터페이스 글꼴 크기를 추가합니다.
    • 작게: 14px / 87.5%
    • 중간: 16px / 100%
    • 크게: 18px / 112.5%
  • 채팅, 세션 목록, 설정, 버튼과 상태 배지가 같은 비율로 조절됩니다.
  • 설정값은 localStorage에 저장하고 React 렌더링 전에 적용해 초기 깜박임을 줄입니다.
  • 10개 지원 언어에 설정 문구를 추가합니다.

Codex 중단 동작

  • Codex 외부 CLI의 정지 동작은 Ctrl+C 대신 Escape를 전달해 현재 turn만 중단합니다.
  • 다른 provider는 기존 Ctrl+C 동작을 유지합니다.
  • Codex turn_aborted를 사용자 입력 대기 상태로 정규화해 중단 후 잘못 RUN으로 남지 않게 합니다.

이미지 미리보기 설정

  • 외관 설정에 채팅 이미지 미리보기 on/off를 추가합니다.
  • OFF에서는 이미지 컴포넌트를 mount하지 않아 파일 및 blob 요청을 만들지 않습니다.
  • history API에도 includeImages=false를 전달해 이미지 attachment와 base64 데이터를 응답에서 제외합니다.

대용량 transcript 성능

  • Codex history cache를 raw JSONL 크기가 아닌 실제 normalized message 크기로 제한합니다.
  • 96MB LRU 한도 안에서 큰 rollout도 유지해 같은 파일을 매 요청마다 다시 읽지 않습니다.
  • 다음 요청에서는 기존 byte offset 이후의 append만 읽습니다.
  • 파일 교체·truncate는 inode, 크기와 4KB boundary 비교로 감지해 캐시를 안전하게 재구축합니다.
  • standalone tool_result는 제거하고 대응하는 tool-use card에만 결합합니다.
  • 페이지 total, limit, offset이 실제 표시 메시지와 동일한 기준을 사용합니다.
  • 64KB가 넘는 도구 출력은 앞·뒤 미리보기만 전송합니다.
  • 사용자가 전체 출력 불러오기를 누르면 별도 endpoint에서 원문을 지연 로드합니다.

호환성과 안전성

  • 기본 글꼴은 중간, 이미지 미리보기는 ON이므로 기존 기본 화면은 유지됩니다.
  • 서버 DB 스키마와 migration 변경은 없습니다.
  • 도구 출력 원문과 transcript 파일은 수정하거나 삭제하지 않습니다.
  • 전체 출력은 명시적으로 요청할 때만 전송됩니다.
  • Codex 캐시는 최대 4개 entry와 normalized 96MB LRU로 제한됩니다.
  • 서버 재시작 뒤 첫 접근은 파일을 한 번 읽지만 이후 요청은 증분 처리됩니다.

검증

  • npm run typecheck 통과
  • npm run lint 통과
  • npm run build 통과: client, server, Rust core
  • 클라이언트 테스트 260개 통과
  • Codex history 관련 테스트 13개 통과
  • 실제 97MB Codex rollout
    • 기존: 요청마다 약 1.1~1.4초
    • 변경: 첫 요청 약 1.20초, 이후 약 0.002~0.003초
  • 대용량 도구 출력 세션
    • 기존 history 응답 약 8.9MB
    • 변경 history 응답 약 220KB
    • 축약된 2MB 원문을 전체 출력 endpoint에서 정상 로드 확인
  • 로컬 release 빌드를 3001 포트에 배포해 health, 페이지네이션, 이미지 제외, 전체 출력 로드를 확인했습니다.

@Yoonwoo-Ha Yoonwoo-Ha changed the title feat: add interface font scaling and fix notification deep links feat: improve notifications, interface scaling, and transcript UX Aug 10, 2026

@devswha devswha left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes for six correctness/performance regressions. The focused Codex and service-worker tests pass (19/19), but they do not exercise these edge cases. No path traversal was found in the new full-tool-result route; default image behavior remains enabled.

Comment thread server/modules/providers/list/codex/codex-sessions.provider.ts Outdated
Comment thread server/modules/providers/list/codex/codex-sessions.provider.ts
Comment thread server/modules/providers/list/codex/codex-sessions.provider.ts
Comment thread server/modules/providers/services/sessions.service.ts Outdated
Comment thread public/sw.js Outdated
Comment thread src/components/chat/hooks/useChatSessionState.ts
@Yoonwoo-Ha

Copy link
Copy Markdown
Contributor Author

리뷰 6건을 c5383a4에 모두 반영했습니다.

  • Codex 캐시: 단일 oversized 항목 비캐시, tail/boundary 용량 포함, 동일 길이 덮어쓰기 ctime 무효화
  • 전송 미리보기: UTF-8 안전 경계 절단 및 한글 회귀 테스트
  • 알림: 구형 서비스 워커 payload의 세션 ID fallback
  • 이미지: 미리보기 재활성화 시 현재 bounded window만 백그라운드 재조회

검증 결과:

  • 관련 서버/클라이언트 집중 회귀: 35/35 통과
  • typecheck, lint, build, check:core(19/19), check:identity 통과
  • GitHub CI Verify Node 22 / Node 24 모두 통과

각 리뷰 스레드에도 변경 내용과 회귀 케이스를 답변하고 resolved 처리했습니다. 재검토 부탁드립니다.

@devswha devswha left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-reviewed head 17ad2b0. The cached image refresh now fences stale session results, all ten locales contain the full-tool-output strings, the new regression test passes, and the full local npm run verify gate completed successfully.

@devswha
devswha merged commit 0674f79 into devswha:main Aug 12, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants