Diagnostics
Node + tsx 충돌
Node + tsx "__name is not a function" 충돌
상태
해결되었습니다. 이 충돌은 package.json에 고정된 현재 tsx 버전
(4.22.3)이나 최신 Node 릴리스에서는 재현되지 않습니다. 향후
tsx/esbuild 업그레이드로 문제가 다시 발생할 경우를 대비해 이 문서를 유지합니다.
원래 증상
tsx를 통해 OpenClaw 개발 스크립트를 실행하면 시작 시 다음 오류가 발생했습니다.
[openclaw] Failed to start CLI: TypeError: __name is not a function at createSubsystemLogger (src/logging/subsystem.ts) at <caller> (src/agents/auth-profiles/constants.ts)원래 충돌 이후 두 파일이 모두 변경되어 특정 줄이 더 이상 일치하지 않으므로 줄 번호는 생략했습니다.
Bun을 선택 사항으로 만들기 위해 개발 스크립트가 Bun에서 tsx로 전환된 후
(2871657e, 2026-01-06) 이 문제가 나타났습니다. 이에 해당하는 Bun 기반 경로에서는
충돌이 발생하지 않았습니다. 원래 macOS의 Node v25.3.0에서 관찰되었으며, Node 25를
실행하는 다른 플랫폼도 영향을 받을 가능성이 큰 것으로 간주되었습니다.
원인
tsx는 변환 옵션에 keepNames: true를 하드코딩하여 esbuild를 통해 TS/ESM을
변환합니다. 이 설정을 사용하면 축소 및 번들링 후에도 fn.name이 유지되도록
esbuild가 이름이 지정된 함수/클래스 선언을 __name 헬퍼 호출로 감쌉니다.
이 충돌은 영향을 받는 tsx/Node 조합에서 해당 모듈의 호출 지점에 헬퍼가 없거나
다른 선언에 가려져, __name(...)이 래핑된 값을 반환하는 대신 예외를 발생시켰음을
의미합니다.
현재 재현 확인
node --versionpnpm installnode --import tsx src/entry.ts status최소 격리 재현(원래 스택 추적의 모듈만 로드):
node --import tsx scripts/repro/tsx-name-repro.ts현재 두 명령 모두 정상 종료됩니다. 둘 중 하나에서 다시 __name is not a function 오류가 발생하면 업스트림에 보고하기 전에 정확한 Node 버전, tsx 버전
(node_modules/tsx/package.json), 전체 스택 추적을 수집하세요.
해결 방법(충돌이 다시 발생하는 경우)
-
node --import tsx대신 Bun으로 개발 스크립트를 실행합니다. -
형식 검사를 위해
pnpm tsgo를 실행한 다음,tsx를 통해 소스를 실행하는 대신 빌드된 출력을 실행합니다.bash pnpm tsgonode openclaw.mjs status -
다른
tsx버전을 사용해 보면서(저장소 정책에 따라pnpm add -D tsx@<version>은 종속성 변경이므로 승인이 필요함), 번들에 포함된 esbuild 버전에서 버그가 재발했는지 이분 탐색합니다. -
다른 Node 주/부 버전에서 테스트하여 오류가 특정 버전에서만 발생하는지 확인합니다.