본문으로 건너뛰기

세이프 모드

세이프 모드는 시각적 계층의 복구 메커니즘입니다. 타사 테마와 플러그인을 비활성화하여 인터페이스가 항상 작동 상태로 돌아가게 합니다.

세이프 모드가 하는 일​

세이프 모드는 URL의 ?safe=1로 활성화됩니다. 어떤 패키지 코드도 로드되기 전에 처리됩니다.

  • 타사 테마 CSS와 토큰 오버라이드가 문서에 추가되지 않습니다.
  • 레거시 진입점을 포함해 타사 플러그인 진입점이 실행되지 않습니다.
  • 기본 제공 테마와 기본 제공 플러그인 런타임은 활성 상태로 남습니다.

인터페이스는 항상 존재하는 기본 제공 라이트/다크 토큰으로 폴백합니다. 세이프 모드를 벗어나면 이전에 저장된 활성 테마 및 플러그인 상태가 복원됩니다. 벗어난다고 선택이 바뀌지 않습니다.

망가진 테마가 복구를 막을 수 없는 이유​

여러 보장이 사용자를 망가진 테마로부터 보호합니다.

  • 적용 전 미리보기 — 테마는 활성화 전에 미리 보여지며, 패키지를 설치한다고 자동으로 활성화되지 않습니다.
  • 세이프 모드는 패키지 이전 — ?safe=1은 테마 레지스트리가 참조되기 전에 처리되므로 CSS가 렌더러를 크래시시키는 테마도 절대 로드되지 않습니다.
  • 초기화 버튼 — 초기화 작업은 기본 제공 테마로 돌아가고 런타임 CSS 링크를 제거하며 인라인 --st-* 오버라이드를 지웁니다. 활성 테마를 삭제해도 저장된 테마 선택이 초기화됩니다.
  • 테마는 설정을 숨길 수 없음 — 내비게이션 레일은 항상 설정 항목에 접근할 수 있게 유지합니다. 생략된 시스템 항목이 표준 순서로 복원되기 때문입니다. 세이프 모드에서는 기본 제공 레일 순서가 사용되고 메뉴 토글은 계속 사용할 수 있습니다.
  • 코드 실행 없음 — 테마에는 JavaScript가 전혀 없습니다. CSS, 토큰, 선언적 레이아웃일 뿐이므로 세이프 모드가 적용되기 전에 실행될 수 있는 테마 코드가 없습니다.

테마 패키지 제한​

테마 패키지는 채팅, API 키, 파일 시스템에 대한 접근을 절대 받지 않습니다. 스타일시트는 받아들여지기 전에 금지된 구문(@import, 원격 URL, javascript: URL, expression(), !important 등)에 대해 검증되고, 토큰은 안전한 CSS 값이어야 합니다. Theme SDK에는 실행 가능한 진입점이 없습니다.

플러그인용 세이프 모드​

같은 스위치가 타사 플러그인을 비활성화합니다. 플러그인 샌드박스, 프로세스 격리, 호스트가 강제하는 정리는 런타임 계층이고, 세이프 모드는 신뢰할 수 없는 코드가 처음부터 로드되지 않게 하는 이중 안전 스위치입니다. 플러그인 측 세부 사항은 플러그인 샌드박싱을 참조하세요.

세이프 모드 프로그래밍 방식 확인​

@neotavern/theme-sdk 패키지는 getSafeModeFromSearch(search)를 내보냅니다. URL 검색 문자열을 파싱해 ?safe=1이 있는지 반환합니다. 호스트는 패키지 CSS와 토큰 오버라이드를 로드하기 전의 단일 게이트로 이를 사용하며, 같은 함수를 대체 호스트에서도 사용할 수 있습니다.

세이프 모드에서도 사용할 수 있는 셸 영역은 셸 계약을 참조하세요.