크라우니터미널6561 네이티브 앱 셸 — A단계(데몬 정적 서빙)
개요
설계 문서(/Users/ef/crowny-terminal6561/설계/네이티브앱셸-설계.md §1.3)의 결론대로,
WKWebView loadFileURL은 부모 디렉토리 밖 CSS를 조용히 차단하는 함정이 있어
crowny-terminald(:9830)가 화면 21본(HTML)+토큰 CSS를 HTTP로 직접 서빙하도록
터미널데몬.한선을 확장했다. 네이티브 앱이 loadRequest로 이 데몬을 여는 것이 B단계 이후 과제.
무엇을 했는지
POST /ui/<별칭>→ 화면 HTML을 화이트리스트 방식(_정적화이트리스트44요소 flat 배열)으로만 서빙. 미등재 이름·..·/etc/류는 세그먼트 자체가 안 걸려 자동 404(별도 트래버설 검사 불필요).GET *.css(경로 무관, 확장자만 검사) →토큰/크라우니캔버스.css고정 서빙. 화면 HTML의../토큰/...상위참조가 브라우저에서 퍼센트인코딩되어(%ED%86%A0...) hanseonc_high엔 디코딩 API가 없는 함정을 확장자 매칭으로 우회.GET /ui/→ 22엔트리(화면 21본+되물음 변형) 링크 인덱스 HTML.- 라우트는 문자열 대신 마커
"@@FILE@@<절대경로>|||<콘텐츠타입>"을 반환하고, 메인 루프가 이를 감지해 헤더만TCP쓰기, 본문은파일소켓전송(opcode 856, C레벨 fread→write 스트리밍)으로 내보낸다 —읽기()의 16384B 한계를 우회해 39.5KB 화면도 byte-identical 전송. - 별칭 6종:
2b-ask→2b-되물음.html,2b-palette→2b-팔레트.html,2j-mobile→2j-모바일.html,2j-bar→2j-바타입.html,2j-mail→2j-메일.html,1e-1-live→1e-1.라이브.html. 나머지 16종은 ASCII 그대로. - 메모리 회귀 실측 후 추가 수리: 정적 서빙(GET, 읽기 전용)도 기존
/api/audit되감기와 같은 급으로 취급해문자열마크/되감기(str풀) +메모리마커/메모리복원(배열힙)을 함께 적용. 문자열되감기만으로는 요청당 ~44~51KB RSS 증가가 지속됐고(데몬_경로세그먼트/분리()가 매 요청 배열힙에 임시 배열을 남김), 배열힙 회수까지 추가하니 웜업(mem_count≥10000, MEM_RESTORE 가드) 후 요청당 ~5.6~6.9KB로 축소.
검증 결과
launchctl kickstart -k gui/$(id -u)/org.crowny.terminald) 후 curl 실측:/ui/1a 200, size_download=40404B = 실제 파일크기와 정확히 일치(잘림 없음, tail 확인 </html>로 정상 종료)/ui/1b 200, 39160B 일치.css 요청 200, 12375B, Content-Type: text/cssGET /ui/ 200/ui/../한선씨/터미널데몬.한선, /ui/etc/passwd) 전부 404/api/health 200, /api/audit?...&format=rows 정상크라우니AI검증.sh shot) 캡처 /tmp/a단계-2a.png, /tmp/a단계-1a.png — 육안 확인 결과 다크테마+골드 액센트 CSS가 정상 적용된 화면으로 렌더됨(맨 HTML 아님).관련 파일
/Users/ef/crowny-terminal6561/한선씨/터미널데몬.한선(수정 — 정적 서빙 라우트/헬퍼/마커 스트리밍/셀프테스트 6건 추가)/Users/ef/crowny-terminal6561/설계/네이티브앱셸-설계.md(§1.3 근거 문서, 무변경)/Users/ef/crowny-terminal6561/화면/*.html,/Users/ef/crowny-terminal6561/토큰/크라우니캔버스.css(서빙 대상, 무변경)/Users/ef/crowny-terminal6561/터미널데몬기동.sh,~/Library/LaunchAgents/org.crowny.terminald.plist(기존 그대로 사용, 무변경)
잔여 이슈
- 네이티브 앱 셸(B단계 이후: NSMenu·트래픽라이트·
loadRequest연결)은 이번 범위 밖. - 맥 스페이스 16 바인딩 공식 API 불가 등 설계 문서 §4·§8의 미해결 항목은 그대로 유효.
- 메모리 회귀는 웜업(mem_count≥10000) 전까지는
메모리복원이 가드에 막혀 no-op — 데몬이 막 재기동한 직후 저트래픽 구간에서는 이전 수준(~44KB/req)으로 증가하다가 이후 안정화된다. 장시간 초저트래픽 운영 시나리오라면 임계값을 낮추는 VM 레벨 변경이 필요할 수 있으나 이번 범위(A단계) 밖.