본문으로 건너뛰기

세이프 모드

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

세이프 모드가 하는 일

세이프 모드는 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와 토큰 오버라이드를 로드하기 전의 단일 게이트로 이를 사용하며, 같은 함수를 대체 호스트에서도 사용할 수 있습니다.

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