변경 로그

VelaTerm의 모든 주요 변경 사항, 가장 최신 순서로 정렬됨.

v0.1.91은 첫 번째 공개 버전입니다. 이전 버전 번호들은 내부 테스트용이므로 포함되지 않았습니다.

v0.1.108

최신 정보
  • Claude, Codex, OpenCode에 실험적 대화 보기를 추가했습니다. 스트리밍 응답, 사고 과정, 도구 상세 정보, 권한 승인 및 질문 양식을 지원합니다. 최초 설정의 기본값은 계속 터미널 보기입니다.

  • 각 엔진의 기능에 따라 모델 설정, 메시지 대기열, 끼어들기, 파일 자동 완성 및 이미지 첨부를 사용할 수 있습니다.

  • 대화 검색, 파일 링크, 이미지 작업 및 별도 대화 글꼴로 긴 대화를 읽기 편하게 개선했습니다. 원격 기록은 점진적으로 불러오며 도구 상세 정보는 필요할 때 가져옵니다.

  • 메시지 제출 확인 기록으로 연결 중단 후 결과를 대조합니다. 결과가 불확실한 제출은 확인 대기 상태로 유지하며 자동으로 재전송하지 않습니다.

  • 다른 세션을 읽는 vrefer와 검색하는 vsearch를 추가했습니다. vrefer --ask는 읽기를 에이전트에 위임합니다. vorchvstat는 여러 에이전트의 조정 및 상태 조회를 제공합니다.

  • 메모리 항목에 태그, 본문 직접 편집, 저장하지 않은 변경 보호 및 정리 설정을 지원합니다. 기록 가져오기의 필터와 선택, 그래프 탐색도 개선했습니다.

  • 공개 공유 클라이언트는 계정·기기 연결, 범위가 제한된 AI 세션 접근 및 암호화 중계 연결을 지원합니다. 방문자의 이미지 업로드와 복잡한 MCP 양식은 아직 지원하지 않습니다.

  • Codex 재개 ID를 저장된 기록과 대조합니다. 기록 누락이 확인되면 빈 세션을 시작하지 않고 명확한 오류를 표시합니다. 실행 중인 터미널에는 다시 연결할 수 있습니다.

  • 되돌리기 범위는 엔진 기능을 따릅니다. Codex는 대화만 되돌리며 파일은 복원하지 않습니다. OpenCode의 범위 처리와 디렉터리 사전 검사에는 알려진 제한이 있습니다.

  • 릴리스 버전 변경 시 잠긴 의존성 버전을 유지합니다. 플랫폼별 설치·업그레이드 및 실제 AI 연동 인수 검증은 아직 진행되지 않았으며 자동 검사가 이를 대신하지 않습니다.

v0.1.107

최신 정보
  • 🧠 글로벌 메모리(실험 기능): Claude 또는 Codex가 대화를 주제별 공유 위키로 정리합니다
  • 🕸️ 코드 그래프(실험 기능): 작업 디렉터리를 색인하고 심벌 관계를 살펴보며 메모리와 서로 연결합니다
  • 🔎 세션에서 vknowledge로 코드와 메모리를 조회할 수 있습니다
  • 🖥️ SSH로 원격 데스크톱 앱을 미러링할 수 있습니다. 탭, 분할, 활성 세션이 양쪽에서 동일하게 유지됩니다
  • 🪟 SSH 원격 접속 대상이 Windows여도 됩니다
  • 📥 프로젝트 폴더에 있는 기존 Codex, Claude, OpenCode 세션을 가져올 수 있습니다
  • 🤖 새 에이전트 OMP 추가
  • 🎚️ vspawn에서 하위 세션이 사용할 모델과 추론 강도를 지정할 수 있습니다
  • 🌿 vspawn-tree를 컬렉션에서도 쓸 수 있고, 실행 중인 워크트리 세션에 브랜치 아이콘이 표시됩니다
  • 🔤 검색이 단어 단위 일치를 먼저 찾고, 실제로 일치한 부분을 강조합니다
  • 🖱️ 탭을 가운데 버튼으로 클릭하면 닫힙니다
  • ⌨️ macOS 브라우저에서 ⌘D와 ⌘⇧D로 화면을 분할할 수 있습니다
  • 💬 입력기 조합 중에 화면이 흔들리지 않고, 조합 문자열 안에서 커서가 보입니다
  • 🪓 메뉴에서 실행한 분할은 포커스된 창에만 적용되며, 모든 분할이 logs/split.log에 기록됩니다
  • 📁 원격 폴더 선택 대화상자가 입력한 경로를 유지합니다
  • ℹ️ 정보 패널: 시작 시각과 실행 시간을 한 줄에 표시하고, macOS에서는 부하 평균도 보여줍니다
  • 🔑 비밀번호 입력란에 브라우저 자체 표시 버튼이 나타나지 않습니다

v0.1.106

최신 정보

작업 공간

  • 사이드바에 특정 디스크 폴더에 묶이지 않는 최상위 컨테이너 '컬렉션(Collection)'이 추가되었습니다. 원격 세션, 브라우저 페이지, 간단한 테스트용 터미널 등은 원래 특정 저장소에 속하지 않는 작업입니다. 하지만 지금까지는 마땅히 둘 곳이 없어 프로젝트 안에 넣어야 했고, 이 때문에 구조가 어색해지는 문제가 있었습니다. 컬렉션은 실제 디스크 폴더 없이 이름만 가지는 독립 항목입니다. 연결된 프로젝트 루트가 없으므로, 지원하지 않는 기능을 실행했다가 오류가 나지 않도록 불필요한 UI를 아예 숨겼습니다. 이제 컬렉션에서는 'New Worktree Session', 'Move to Worktree…' 메뉴와 새 세션 대화상자의 워크트리 선택기가 모두 표시되지 않습니다. 대신 새 세션 대화상자에 데스크톱 네이티브 폴더 선택기가 포함된 'Working directory' 필드가 추가되었으며 기본값은 홈 디렉터리로 지정됩니다. 작업 디렉터리를 따로 지정하지 않고 시작한 세션 역시 앱 실행 경로(macOS 기준 /)를 상속하지 않고 홈 디렉터리에서 시작됩니다.

  • 리소스(Resources) 패널에서 현재 세션뿐만 아니라 시스템 전체 상태를 확인할 수 있습니다. 기존에는 패널에 현재 세션의 프로세스 트리가 사용하는 CPU와 메모리만 표시되어, 해당 세션이 자원을 많이 쓰는 것인지 시스템 전체에 과부하가 걸린 것인지 파악하기 어려웠습니다. 이제 리소스 패널이 'THIS SESSION'과 'SYSTEM' 섹션으로 나뉩니다. SYSTEM 섹션에는 CPU, 메모리, 스왑 사용량을 보여주는 프로그레스 바가 표시되며(70% 초과 시 주황색, 90% 초과 시 빨간색으로 변경), OS별 전용 지표도 함께 제공됩니다(macOS의 메모리 압박도, Linux의 코어 수 기준 정규화 부하 평균, Windows는 해당 지표 없음). 현재 세션의 리소스만 보고 싶다면 패널 상단에서 'system' 옵션을 끄면 됩니다. 시스템 관련 항목이 숨겨지며 백그라운드 리소스 측정(샘플링)도 완전히 중단됩니다. 이 설정은 저장되어 모든 세션 패널에 공통으로 적용됩니다.

  • Windows와 Linux에 Alt 키로 열 수 있는 메뉴 바가 추가되었습니다. macOS는 네이티브 시스템 메뉴를 지원하지만, Windows와 Linux에서는 타이틀 바 아이콘을 눌러야만 설정, 업데이트 확인, 창 분할 등의 기능에 접근할 수 있었습니다. 이제 Alt 키를 단독으로 눌렀다 떼면 메뉴 바가 열리고 닫힙니다. 기존 Alt 키 조합 단축키는 그대로 유지됩니다. 터미널에서 Alt 키는 Meta 접두사 역할을 하므로 Alt+B나 Alt+F 같은 단축키는 셸에 정상 전달되며, 다른 키와 조합되지 않은 순수 Alt 키 입력만 메뉴를 엽니다. 메뉴 바에는 File(설정, 업데이트 확인), Terminal(새 터미널, 오른쪽 분할, 아래쪽 분할), Help(웹사이트, 피드백, 공유) 메뉴가 제공되며 사용자가 설정한 커스텀 단축키 안내도 함께 표시됩니다. 마우스 클릭과 키보드 탐색을 모두 지원하며, Esc 키를 누르면 열려 있던 메뉴가 닫히고 메뉴 바가 숨겨지면서 포커스가 터미널로 돌아갑니다.

  • 메뉴의 'Clear notification badges' 기능으로 사라지지 않던 알림 배지를 말끔히 정리할 수 있습니다. 독(Dock) 배지에는 읽지 않은 세션 수와 응답하지 않은 세션 생성 확인 카드 수가 합산되어 표시됩니다. 하지만 기존 사이드바의 지우기 버튼은 읽지 않은 세션이 있을 때만 나타났고 해당 세션의 알림만 지울 수 있었습니다. 이 때문에 이미 닫힌 창이나 삭제된 세션에 응답 대기 상태인 확인 카드가 남아 화면에 카드가 더 이상 표시되지 않는 경우, 독 배지에 숫자 1이 계속 남아 지울 방법이 없었습니다. 새로 추가된 메뉴 항목을 실행하면 모든 세션이 읽음 처리되고 대기 중인 생성 요청도 모두 거절 상태로 처리되어 OS 배지 숫자가 즉시 0으로 초기화됩니다. 앱을 재시작해도 독 배지 숫자가 그대로 유지되던 macOS 환경에서 특히 유용합니다.

  • 명령어가 파일을 읽거나 시스템 응답을 기다리는 동안에도 창이 멈추지 않습니다. 기존에는 동기식 Tauri 명령어가 메인 스레드에서 실행되어 작업이 끝날 때까지 UI가 멈추는(프리즈) 현상이 있었습니다. 앱 내 43개 명령어를 전수 점검하여 메인 스레드에서 I/O 작업을 처리하던 13개 명령어를 찾아냈습니다. 여기에는 macOS 알림 권한 요청 시 사용자 응답을 최대 1분 동안 기다리며 블로킹되거나, 오래 실행된 세션의 녹화 데이터를 64KB 단위로 수십 메가바이트씩 읽어오고, 스크린샷 붙여넣기 시 디스크에 직접 쓰거나, 세션의 작업 디렉터리를 가져올 때 lsof를 실행하는 등의 작업이 있었습니다. 이제 이 13개 명령어가 모두 메인 스레드 밖에서 비동기로 실행됩니다. 빠른 반응이 필요한 키 입력 처리는 기존의 패스트 패스(fast path)를 그대로 유지합니다.

원격 접속

  • 호스트에서 어떤 원격 클라이언트가 접속해 있는지 확인할 수 있습니다. 세션 미러링은 양방향으로 동작하므로 원격 클라이언트가 호스트의 화면 레이아웃을 변경할 수도 있습니다. 하지만 이전에는 호스트 입장에서 누가 접속해 있는지, 심지어 연결되어 있는지조차 알 방법이 없었습니다. 이제 타이틀 바에 "Mirrored by N" 배지가 표시되며, 배지를 클릭하면 연결된 클라이언트의 이름, IP 주소, 접속 시각 목록을 확인할 수 있습니다. 클라이언트 이름은 암호화된 핸드셰이크 과정에서 안전하게 전달되며, 별도로 지정하지 않은 경우에는 기본값으로 "Unnamed"가 표시됩니다.

AI 에이전트

  • 계정 사용량 조회가 세션별이 아닌 기기 단위로 한 번만 수행됩니다. 사용량 한도는 계정 단위로 적용되지만, 기존에는 세션마다 Info 패널이 사용량을 따로따로 조회했습니다. 세션이 10개 열려 있으면 동일한 정보에 대해 10번이나 중복 요청을 보냈고, 그 결과 Claude의 엄격한 속도 제한(rate limit)에 걸려 패널이 빈 화면으로 뜨는 문제가 잦았습니다. 이제 백엔드의 중앙 폴러(poller)가 단일 스냅샷을 유지하고 모든 세션이 이를 공유하며, 데이터가 바뀔 때마다 변경 사항을 한 번에 브로드캐스트합니다. 불필요한 권한 요청 팝업을 방지하기 위해 시스템 키체인에 접근하지 않고 ~/.claude, ~/.codex, ~/.grok/auth.json 파일의 존재 여부를 확인해 실제 사용하는 제공자만 똑똑하게 폴링합니다. 스냅샷은 디스크에 저장되므로 앱을 재시작해도 첫 폴링을 기다릴 필요 없이 캐시된 수치가 즉시 표시됩니다. 노트북이 절전 모드에서 깨어날 때도 다음 폴링 주기를 기다리지 않고 즉시 데이터를 갱신합니다. 연속해서 폴링에 실패하면 재시도 간격을 최대 8배까지 늘리는 백오프(backoff)가 적용됩니다. 설정 화면의 새로고침 주기 옵션에서도 모호했던 '0초' 설정 대신 직관적인 On/Off 토글을 제공합니다.

  • 사용량 갱신에 실패한 경우 최신 상태처럼 보이지 않고 만료(stale) 상태로 명확히 표시됩니다. 이전에는 새로고침 요청이 실패해도 클라이언트가 캐시된 데이터를 그대로 반환하면서, 마치 정상적으로 갱신된 것처럼 타임스탬프를 업데이트하고 오류를 지우며 백오프 타이머를 리셋했습니다. 이 때문에 속도 제한에 걸려도 패널은 정상 작동하는 것처럼 보이며 5분마다 무의미한 폴링을 계속 시도했습니다. 이제 요청이 실패하면 캐시된 값을 유지하되 제공자 옆에 주황색 stale 배지를 띄워 데이터가 만료되었음을 알립니다. 배지에 마우스를 올리면 실패 시각, 오류 원인, 표시된 수치의 경과 시간이 툴팁으로 표시됩니다. "Updated" 타임스탬프는 마지막으로 성공한 실제 동기화 시각을 반영하며, 서버의 속도 제한 재시도 대기(retry-after) 요청도 준수합니다(단, 수동 새로고침은 언제든 즉시 실행할 수 있습니다).

  • 사용량 패널에 모델별 주간 쿼터가 표시됩니다. 사용량 엔드포인트는 계정 전체의 5시간 및 7일 한도 외에도 모델별 주간 쿼터 정보를 제공합니다. 이전에는 이 정보가 누락되어 Fable 같은 모델을 사용할 때 모델별 잔여 할당량을 확인하지 못하고 계정 전체 사용량만 볼 수 있었습니다. 이제 총 사용량 아래에 모델 제품군별로 분류된 상세 사용 항목이 표시됩니다.

  • OpenCode 세션을 다시 열 때 대화 내역이 정상적으로 복원됩니다. 기존에는 현재 작업 디렉터리의 세션만 조회하는 opencode session list 명령어로 세션의 존재 여부를 확인했습니다. 하지만 데스크톱 앱이 자체 실행 디렉터리(macOS 기준 /)에서 구동되다 보니 기존 세션 ID를 찾지 못했고, 세션을 다시 열어도 대화 내역이 없는 빈 세션이 열리는 문제가 있었습니다. 이제 특정 세션 ID를 직접 조회하며, 명령어가 세션 삭제를 명시적으로 확인한 경우에만 삭제된 것으로 간주합니다. 그 외의 오류가 발생해도 섣불리 삭제된 것으로 처리하지 않고 세션 복구를 계속 진행하므로 소중한 세션 기록이 유실되는 것을 방지합니다.

인터페이스

  • 입력기(IME)로 입력할 때 조합 중인 글자가 정상적으로 표시됩니다. 기존에는 macOS, Windows, Linux 전 플랫폼에서 한글, 병음(Pinyin), 가나(Kana) 등 IME로 텍스트를 입력할 때 Enter 키를 눌러 입력을 확정하기 전까지 조합 중인 글자가 보이지 않았습니다. 원인은 커스텀 CSS 규칙 때문이었습니다. xterm은 너비 제한이 없는 오버레이 컨테이너에 조합 중인 글자를 렌더링하는데, 긴 줄바꿈 처리를 위해 넣었던 right 제약 조건이 너비 0으로 계산되었고 여기에 overflow: hidden 속성까지 겹쳐 글자가 완전히 잘려 나갔던 것입니다. 해당 CSS 규칙을 제거하고, 테마와 어울리지 않던 오버레이의 기본 흑백 색상 스키마만 재정의하도록 수정했습니다. 이와 함께 발생하던 연쇄 문제도 해결했습니다. xterm이 IME 후보창 위치 지정을 위해 숨겨진 textarea를 오버레이 크기만큼 확장한 뒤 원래대로 줄이지 않아, 투명한 오버레이가 해당 줄의 마우스 클릭과 텍스트 선택을 가로막던 현상을 수정했습니다.

  • macOS에서 Ctrl 단축키가 Command 단축키로 잘못 동작하지 않습니다. 기존 macOS 버전에서는 보조 키 판별 로직이 Cmd와 Ctrl을 동일하게 취급했습니다. 이로 인해 표준 터미널 단축키가 앱 단축키와 충돌하여, Ctrl+D(EOF) 입력 시 창이 분할되고, Ctrl+W(단어 삭제) 입력 시 창이 닫히며, Ctrl+F, Ctrl+T, Ctrl+O 등의 단축키가 앱에 가로채이는 문제가 있었습니다. 특히 별다른 안내 없이 새 창이 열리다 보니 의도치 않게 창이 계속 분할되는 불편이 있었습니다. 이제 macOS 데스크톱 앱에서는 단축키에 오직 Cmd 키만 사용되며, 다른 플랫폼(및 Mac에 접속한 웹 브라우저)에서는 기존처럼 Ctrl 키만 단축키로 사용합니다.

  • 드롭다운 메뉴에서 옵션을 선택했을 때 메뉴가 바로 다시 열리지 않습니다. 항목을 감싸고 있던 <label> 엘리먼트가 행 전체의 클릭 이벤트를 트리거 버튼으로 다시 전달(전파)하여, 항목을 선택하자마자 드롭다운 메뉴가 도로 열리던 문제를 수정했습니다.

수정

  • Linux: AppImage가 정상적으로 실행됩니다. Ubuntu 22.04에서 0.1.105 버전 AppImage가 WebKit 보조 프로세스를 생성하지 못해 창이 뜨기도 전에 비정상 종료되던 문제가 있었습니다. AppImage 패키징 도구는 바이너리 내의 리터럴 /usr 경로를 ././로 변환(인플레이스 패치를 위한 문자열 길이 유지 목적)하므로, 해당 경로를 올바르게 찾기 위해 실행 스크립트가 작업 디렉터리를 $APPDIR/usr로 변경해야 합니다. 0.1.105 버전에서는 자식 셸로 환경 변수가 유출되는 것을 방지하기 위해 커스텀 실행 스크립트를 도입했으나, 환경 변수 전달 과정에서 이 디렉터리 변경 작업이 누락되었습니다. 이제 실행 스크립트가 디렉터리를 정상적으로 변경하며, 문제 재발을 방지하기 위한 빌드 타임 검증(assertion)도 추가되었습니다. (0.1.104 이하 버전은 이 문제의 영향을 받지 않았습니다.)

  • Windows: 알림 소리가 다시 정상 재생되며, 알림을 클릭하면 해당 세션으로 바로 이동합니다. 기존 Windows 알림이 알림 플러그인에 macOS용 사운드 식별자를 전달하고 있었습니다. 해당 이름을 파싱할 수 없어 무음으로 처리되었고, 이로 인해 설정 여부와 관계없이 Windows 알림 소리가 전혀 재생되지 않았습니다. 두 버전 전 특정 이슈를 해결하기 위한 우회책으로 알림을 플러그인을 통해 전달하도록 변경했었으나, 당시 문제가 이미 해결되었으므로 해당 우회 처리를 원래대로 되돌렸습니다. 이제 알림이 네이티브 채널을 통해 전달되어 알림음 재생과 클릭 시 해당 세션으로 바로 이동하는 기능이 모두 정상 복구되었습니다.

  • Windows: 상자 그리기 문자 및 블록 문자의 정렬이 어긋나지 않습니다. 기존에는 터미널 프레임이 가변폭 대체 폰트로 렌더링되어 시각적으로 번져 보였습니다. 이를 수정한 이후에도 대체 폰트가 기본 터미널 폰트보다 약간 좁아, 프로그레스 바나 Claude Code 마스코트 등에 사용되는 블록 문자 셀의 오른쪽 가장자리에 미세하게 세로 틈새가 발생했습니다. 이제 두 문자 영역 모두 번들로 포함된 JetBrains Mono 서브셋 폰트로 렌더링되어 글리프 너비가 빈틈없이 완벽하게 일치합니다.

  • Windows: 풀 버전 Git Bash에서 git 명령어가 정상 동작합니다. 풀 버전 Git Bash가 정상적으로 설치되어 있어도 터미널에서 git을 실행하면 "command not found" 오류가 발생하고 Git Bash 전체 설치를 반복해서 안내하던 문제를 수정했습니다. Git Bash는 자신이 실행 중인 디렉터리 트리를 인자로 전달받아야만 mingw64/bin 경로를 PATH에 추가합니다. 하지만 앱의 셸 실행기가 이 매개변수를 누락하여 git, curl 등 해당 디렉터리에만 위치한 바이너리를 찾지 못했던 것입니다. 또한 다운로드 안내창에서 무조건 64비트 버전을 기본값으로 제공하는 대신 호스트 시스템 아키텍처에 맞는 설치 프로그램을 자동으로 안내하도록 개선했습니다.

  • Windows: 워크트리 삭제가 정상 동작하며, Kiro 훅 재설치 시 중복 추가되지 않습니다. 기존에는 워크트리 삭제 명령이 대상 워크트리 디렉터리 내부에서 실행되었습니다. Windows에서는 활성 프로세스의 현재 작업 디렉터리를 삭제할 수 없기 때문에 권한 오류가 발생하며 작업이 항상 실패했습니다. 이제 Git 명령어가 메인 저장소 루트에서 실행됩니다. 또한 훅 감지 로직이 슬래시(/) 경로와 Windows의 백슬래시() 경로를 제대로 일치시키지 못해 재설치할 때마다 훅 항목이 중복으로 계속 추가되던 문제도 해결했습니다.

v0.1.105

최신 정보

작업 공간

  • 세션 상태와 안 읽음 표시, 그리고 세션이 아직 실행 중인지를 이제 백엔드가 판단하며, 모든 클라이언트가 같은 답을 봅니다. 지금까지는 각 클라이언트가 저마다 관찰한 것만으로 이를 판단했기 때문에, "안 읽음"은 사실 "이 창에서 읽지 않음"이라는 뜻이었습니다. 브라우저에서 세션을 읽어도 데스크톱 쪽은 안 읽음으로 남았고, 동적 상태 필터가 그 항목을 공유 목록에 계속 다시 밀어 넣어서 "상태 새로 고침"으로도 지울 수 없었습니다. 상태 이벤트도 클라이언트가 직접 세션을 실행한 뒤에야 등록되었으므로, 막 접속한 브라우저는 자기가 연 세션에만 점을 표시하고 나머지는 아무것도 보여 주지 못했습니다. 이제 백엔드가 세션마다 하나의 기준 기록을 갖습니다 — 어떤 에이전트인지, 어떤 상태인지, 프로세스가 살아 있는지, 안 읽음 표시가 붙어 있는지입니다. 클라이언트가 접속하거나 다시 연결하면 한꺼번에 조회에 답하고, 바뀔 때마다 모두에게 알립니다. 클라이언트는 관찰한 것을 보고하고, 결론은 백엔드가 내립니다. 휴대폰에서 세션을 읽으면 데스크톱의 표시가 지워지고, 막 접속한 브라우저도 한 번도 연 적 없는 세션에 올바른 점을 표시합니다. 프런트엔드에 있던 판정 규칙도 그 이유와 테스트까지 함께 옮겨 왔습니다. 훅이 한 번이라도 보고한 세션에서는 출력만 보고 추측한 결과가 끼어들지 못하고, 출력이 계속 나온다는 사실로 작업 중이라고 보는 것은 에이전트가 있고 Codex가 아니며 아직 기준이 될 보고가 없는 세션뿐이며, 방금 시작한 작업이 바로 뒤따라 도착한 종료 이벤트에 취소되지 않도록 1200ms 동안 붙잡아 둡니다. 화면 읽기만은 예외입니다. 읽으려면 실제로 그려진 격자가 필요한데 그것은 클라이언트에만 있기 때문입니다. 터미널 크기를 쥐고 있는 클라이언트가 읽은 내용을 보고하고, 그것을 받아들일지는 백엔드가 정합니다 — 다른 클라이언트가 보낸 보고는 거부됩니다. 이 가운데 무엇이든 잘못 동작하면 localStorage에서 vlx-arbitrationfrontend로 지정해 예전의 프런트엔드 판정 경로로 되돌릴 수 있습니다.

  • 세션을 다시 시작해도 다른 클라이언트에서 탭이 닫히지 않습니다. pty://killed에 아무 정보도 실려 있지 않아서 상대편은 다시 시작인지 닫기인지 구분할 수 없었습니다. 그래서 전부 닫기로 처리해 분할 창을 없앤 뒤, 그 레이아웃을 그대로 되돌려 보냈습니다. 이제 이벤트가 어느 클라이언트가 왜 프로세스를 끝냈는지 알려 주므로, 다시 시작하는 경우에는 분할 창을 그대로 두고 새 프로세스가 올 때까지 기다립니다. 이유가 없거나 알 수 없는 값이면 여전히 닫기로 봅니다. 다시 돌아오지 않을 세션의 분할 창을 열어 두면 죽은 터미널이 화면에 남는데, 곧 다시 시작될 창을 닫아 버리는 것보다 나쁘기 때문입니다.

  • 작업 공간을 막 복원한 데스크톱에 브라우저가 접속해도 모든 세션이 실제로 시작되지는 않습니다. 작업 공간을 복원할 때는 프로세스를 띄우는 대신 자리 표시자 카드를 그립니다. 그런데 이 판단이 데스크톱에만 있어서, 미러된 레이아웃을 따라간 브라우저는 "실행 중이 아님"과 "실행 중이지만 여기서 연 적이 없음"을 구분하지 못한 채 터미널을 붙였습니다 — 터미널을 붙이는 것이 곧 실행하는 것입니다. 이제 남의 레이아웃을 따라 들어온 잎 노드는 백엔드가 뒤에 프로세스가 없다고 알려 주면 자리 표시자를 그립니다. 직접 세션을 여는 것은 여전히 시작하겠다는 뜻이고, 지금 보고 있는 터미널은 프로세스가 끝나도 카드로 바뀌지 않습니다. 출력해 놓은 내용을 아직 읽고 싶을 수 있기 때문입니다.

  • 설정을 바꾸면 다른 클라이언트에 곧바로 전달됩니다. 기준이 되는 설정은 원래부터 백엔드가 갖고 있었지만, 값을 바꿔도 아무에게 알리지 않아서 다른 클라이언트는 다음에 실행할 때에야 알았습니다. 원격으로 연결해 쓸 때는 화면이 서로 달라 보이는 정도로 끝나지 않았습니다. 한쪽에서 "상태 필터 동적 확장"을 꺼도 다른 쪽이 공유 목록에 계속 항목을 밀어 넣으면 아무 소용이 없었고, 살아 있는 탭 수 상한이 더 작은 클라이언트가 나머지 모두의 배경 탭을 대신 정리해 버렸습니다. 이제 설정을 쓰면 어떤 키가 바뀌었는지 알리고, 각 클라이언트는 시작할 때와 같은 경로로 그 값을 다시 읽습니다. 그래서 원격 호출자에게 보호된 값을 감추는 규칙도 그대로 적용됩니다 — 알림에는 키 이름만 실리고 값은 절대 실리지 않습니다. 지금까지 설정을 보내지도 받지도 않던 휴대폰도 이제 여기에 참여합니다.

  • 브라우저가 자기 레이아웃을 복원하기 전에 미러된 레이아웃을 기다립니다. 원격 창에는 레이아웃의 출처가 둘 있습니다 — 자기 localStorage에 있는 것과 미러 모드에서 호스트가 보내 주는 것입니다 — 그런데 먼저 도착한 쪽이 늘 나중 것에 덮어써졌습니다. 로컬 것을 먼저 띄우는 대가는 화면이 한 번 깜빡이는 정도가 아니었습니다. 터미널 잎 노드를 붙이면 실제 프로세스가 시작되는데, 프로세스가 이미 사라진 세션에서는 아무도 들여다보지 않을 셸이 새로 뜬다는 뜻이었습니다. 게다가 브라우저는 터미널을 종료하지 않고 분리하기 때문에 그 셸은 그대로 남았습니다. 이제 브라우저는 무엇이든 복원하기 전에 첫 정렬이 끝나기를 최대 2초까지 기다립니다. 백엔드가 느리거나 닿지 않으면 빈 창을 붙들고 있는 대신 로컬 레이아웃으로 되돌아갑니다. 휴대폰과 미러링이 꺼진 클라이언트는 기다리지 않고 바로 지나갑니다.

원격 접속

  • SSH로 연결하면서 그때 시작하는 서비스의 미러 모드를 켤 수 있습니다. 이 전환은 원격 접속 패널에 있는데, SSH는 상대 컴퓨터에서 화면 없는 서비스를 띄우므로 거기에는 누를 패널이 없습니다. 이제 Option을 누른 채 "Connect remote"를 클릭하면 SSH 입력 양식에 "Mirror UI across clients" 체크박스가 나타납니다. 기본값은 꺼짐입니다. 이 값은 연결과 함께 전달되어 상대 컴퓨터의 데이터베이스에 기록되지 않고 서비스의 메모리에만 머무릅니다. 원격 데스크톱의 데이터베이스를 그대로 함께 쓰는 경우, SSH 연결 한 번이 남의 패널에 있는 전환을 조용히 바꿔 버려서는 안 되기 때문입니다. 선택은 호스트별로 기억되므로, 기록에서 같은 컴퓨터를 다시 고르면 그 값이 따라옵니다. 이미 실행 중인 서비스를 다시 쓰려면 이제 버전과 데이터 모드, 미러 모드가 모두 같아야 합니다. 셋 중 하나라도 다르면 기존 서비스가 교체되고 그 위에서 돌던 세션도 함께 끝나므로, 이 옵션은 데이터베이스 전환과 나란히 Option 뒤에 두었습니다.

  • 미러를 따라가는 클라이언트가 그 사실을 알려 줍니다. 지금까지는 따라가는 쪽의 탭과 분할이 저절로 바뀌는데도 그 변화가 어디서 왔는지 화면에 아무 설명이 없었습니다. 이제 제목 표시줄에 Mirrored 배지가 붙고, 마우스를 올리면 설명이 나옵니다. 호스트에는 배지가 없습니다 — 전환을 쥐고 있는 쪽이니까요.

  • 내 컴퓨터와 터미널이 도는 컴퓨터 사이에서 파일을 주고받을 수 있습니다. 원격 접속은 상대 쪽 파일을 보여주기만 했을 뿐, 가져오거나 올려둘 방법이 없어 터미널에서 명령을 치는 수밖에 없었습니다. 이제 파일 패널의 파일 컨텍스트 메뉴에 다운로드가, 머리글에 업로드가 있고, 바탕화면에서 폴더 행으로 파일을 끌어다 놓아도 전송됩니다. 두 방향 모두 다른 기능과 같은 인증된 연결을 쓰므로 같은 네트워크의 브라우저에서도, 휴대폰에서도, 원격 접속 창에서도 똑같이 동작합니다. 전송은 조각으로 나뉘어 진행되고 트리 아래 목록에 진행률이 표시되며, 다른 패널을 보는 동안에도 계속됩니다.다운로드는 평범한 다운로드 링크이고, 처리는 브라우저의 다운로드 관리자가 합니다. 받으면서 바로 디스크에 쓰고, 속도와 남은 시간을 보여주며, 멈췄다 이어받을 수도 있습니다. 파일 크기와 상관없이 모든 브라우저에서, 휴대폰에서도 똑같습니다. 링크에는 그 파일 하나를 위해 발급되어 몇 분 뒤 만료되는 표가 들어 있습니다. 이 서버는 자격 증명을 헤더로 주고받는데, 링크를 여는 브라우저는 헤더를 보내지 않기 때문입니다. 업로드는 먼저 임시 이름으로 쓰고 전부 끝난 뒤에야 정식 이름으로 바꾸므로, 중간에 끊겨도 완전한 파일이 있어야 할 자리에 반쯤 쓰인 파일이 남지 않습니다. 같은 이름이 이미 있으면 아무것도 옮기기 전에 거절합니다.업로드는 속도와 남은 시간을 보여주고, 연결이 끊겨도 거기서 끝나지 않습니다. 실패한 조각은 간격을 늘려가며 1분쯤 다시 시도하는데, 그때마다 임시 파일이 실제로 어디까지 갔는지 서버에 물어봅니다. 이미 들어갔을지 모를 조각을 다시 보내지 않기 위해서입니다. 포기하더라도 그 바이트는 남습니다. 같은 파일을 같은 폴더에 다시 끌어다 놓으면 멈춘 지점부터 이어지고, 새로고침한 뒤에도 마찬가지입니다. 받다 만 파일을 버리는 건 취소했을 때뿐입니다.

AI 에이전트

  • Antigravity와 Copilot 세션의 이름을 첫 메시지에서 가져옵니다. 둘 다 자동 이름 변경에서 빠져 있어서 사이드바에 "Antigravity 1, 2, 3"이 줄줄이 남았습니다. Antigravity의 훅 이벤트에는 사용자가 입력한 글이 전혀 실리지 않고 대화 ID와 기록 파일 경로만 들어 있어서, 첫 메시지는 그 기록 파일에서 읽어 옵니다. 그 뒤에 붙는 메타데이터 블록은 제목에 넣지 않습니다. Copilot의 이벤트에는 이벤트 이름조차 없어서 생김새로 구분하는데, 프롬프트는 있고 도구 이름은 없는 본문을 이제 사용자가 보낸 입력으로 봅니다. 그래서 세션을 시작할 때 함께 넘긴 프롬프트와 도구 호출은 제목에서 제대로 빠집니다.

  • Antigravity 세션을 다시 열면 대화 기록이 함께 돌아옵니다. 이어서 실행하려면 대화 ID가 필요한데, 실행 인자에서 세션 ID를 뽑아내는 파서가 Antigravity의 표기를 알아보지 못했습니다. 그래서 --conversation=<id>가 가리킬 대상이 없었고, 다시 연 세션은 모두 빈 상태로 떴습니다.

  • vspawn --yes는 확인 카드 없이 하위 세션을 실행합니다. "실행 전 확인"을 켜 둔 사람은 한 번 돌릴 때 만들어지는 하위 세션마다 카드를 하나하나 눌러 넘겨야 했습니다. 이 플래그는 — -y--no-confirm으로도 쓸 수 있습니다 — 그 호출 한 번에 대해서만 카드를 건너뛰고 기본 설정으로 세션을 시작합니다. 설정 자체를 바꾸지는 않으므로, 플래그 없이 실행하는 다음번에는 다시 물어봅니다.

  • 하위 작업 카드의 모델 입력란에 무엇이든 직접 입력할 수 있습니다. 예전에는 그냥 드롭다운이라 목록에 있는 모델만 고를 수 있었습니다. 그런데 에이전트가 알아듣는 식별자는 그보다 훨씬 많습니다. claude-opus-4-6처럼 날짜가 붙은 이름, 공급자 이름이 앞에 붙은 이름, 각자 설정해 둔 별칭까지 있습니다. 이제는 입력란이고, 알려진 모델은 그 옆의 드롭다운에 바로 가기로 걸려 있습니다. 목록은 제안일 뿐 허용 목록이 아닙니다. 입력한 그대로 전달되고, 비워 두면 --model 자체가 붙지 않으며, 목록은 입력에 따라 걸러지다가 직접 적은 식별자와 맞는 것이 하나도 없으면 접힙니다.

인터페이스

  • 드롭다운을 하나로 통일했습니다. 앱 곳곳의 드롭다운은 같은 코드를 열 몇 번 복사해 만든 것인데, 그 뒤로 제각각 달라졌습니다. 패널 배경이 세 가지, 그림자가 네 가지, 마우스를 올렸을 때의 색이 세 가지였고, 여는 버튼의 높이는 26, 28, 32픽셀이 섞여 있었으며, 다중 선택 목록에만 필요한 체크 표시가 선택된 항목에 붙어 있었습니다. 이제 하나의 컴포넌트가 병합할 때의 브랜치 선택, 설정의 언어·기본 셸·글꼴 선택, 에이전트 선택, worktree 대화 상자, 새 세션과 복원된 세션의 에이전트 종류, 그리고 입력 양식 모달에 마지막으로 남아 있던 네이티브 select까지 모두 맡습니다. 어느 것에도 없던 키보드 조작도 함께 들어왔습니다. 화살표로 이동, Enter로 선택, Escape로 뒤에 있는 대화 상자는 닫지 않고 드롭다운만 닫기, Home과 End로 끝까지 이동입니다. 상태 표시줄의 메뉴 두 개는 예전 그대로 동작하고, 사이드바의 상태 필터는 체크 표시를 유지합니다. 그쪽은 실제로 다중 선택이기 때문입니다.

  • 원격 접속 패널의 비밀번호를 눈으로 확인할 수 있습니다. 그냥 비밀번호 입력란이라 무엇을 입력했는지 볼 수 없었습니다. 눈 모양 버튼은 이미 있었지만 연결 패널 자기 파일 안에만 있었습니다. 이제 둘이 하나의 컴포넌트를 함께 쓰며, 보이기 상태는 패널을 닫으면 초기화됩니다.

  • IP 선택기가 더 이상 시스템 컨트롤처럼 보이지 않습니다. 네이티브 select였는데, WKWebView가 여기에 시스템 외양을 입히는 탓에 어두운 패널 위에서 겉돌았습니다 — 위에서 교체한 드롭다운과 같은 문제입니다. 이제 공용 컴포넌트를 쓰고, 라벨은 "IP"로 줄였습니다. 옆의 문구가 이미 무엇에 쓰는 것인지 말해 주기 때문입니다.

수정

  • 업데이트 확인이 매번 서버에 실제로 물어봅니다. 계속 켜 둔 클라이언트는 처음 본 버전에 묶여 있었습니다. 0.1.101을 찾아 두었다면 0.1.104가 나온 뒤에도 계속 0.1.101을 권했고, "업데이트 확인"을 눌러도 같은 대화 상자가 다시 열릴 뿐이었습니다. 예전 코드가 안내를 이미 띄워 둔 상태에서는 그대로 돌아가 버렸기 때문입니다. 이제는 확인할 때마다 실제로 요청을 보냅니다. 더 새로운 버전이 있으면 화면의 안내를 바꿔 놓고, 같은 버전이거나 이미 내려받는 중이면 건드리지 않으며, 서버가 업데이트가 없다고 답하면 낡은 안내를 걷어 냅니다 — 그 버전이 내려갔거나, 그사이에 직접 설치했다는 뜻이니까요. "직접 내려받기" 버튼은 이제 웹사이트의 다운로드 페이지를 엽니다. 예전에는 업데이터가 쓰는 패키지를 그대로 건네주었는데, 그것은 제자리에서 풀리도록 만들어진 것이라 손으로 설치할 수 없습니다.

  • 터미널을 빠르게 정리할 때 전체 화면 오류 오버레이가 더 이상 뜨지 않습니다. xterm의 뷰포트는 만들어질 때 한 번, 초기화될 때 또 한 번 스크롤 영역 동기화를 예약해 두는데, 정리될 때 둘 다 취소하지 않습니다. 그래서 같은 작업 안에서 열렸다 닫힌 터미널은 — 원격으로 연결하면서 세션 트리를 다시 만드는 과정이 정확히 그렇습니다 — 그 콜백을 그대로 실행했고, 이미 비워진 렌더러를 만나 오류를 던졌습니다. 이 오류는 타이머에서 나오기 때문에 try/catch도 오류 경계도 닿지 못합니다. 그래서 전역에서 잡되 조건을 좁게 두었습니다. 스택이나 메시지에 그 동기화의 이름이 있고 렌더러나 그 크기까지 함께 언급된 경우에만 무해한 것으로 삼켜서 요청 로그에 적습니다. 진짜 오류는 예전처럼 오버레이를 띄웁니다.

v0.1.104

최신 정보

AI 에이전트

  • 하위 작업 카드가 이제 각 에이전트의 실제 모델과, 그 에이전트가 알아듣는 강도 플래그를 보여 줍니다. 카드는 어떤 에이전트든 --model--effort로 실행 인자를 만들었지만, 추론 강도를 그렇게 부르는 것은 Claude와 Kiro, Antigravity뿐입니다 — Grok과 Zoo는 --reasoning-effort, Cline은 --thinking이라고 합니다. 그래서 나머지 에이전트에서 강도를 고르면 CLI가 한 번도 들어 본 적 없는 플래그가 전달되었고, 세션은 시작되지 못했습니다. 이제 플래그 이름도 값도 각 에이전트가 직접 내놓습니다. 모델 선택란은 각 CLI가 알려 줄 수 있는 만큼을 따릅니다. 목록을 뽑아 줄 수 있는 쪽(OpenCode, Grok, Crush, Antigravity, Cursor, pi, Kiro)에는 물어봐서 실제 목록을 보여 주고, 정해진 집합이 있는 쪽(Claude, Codex, Kimi Code)은 그 집합을 보여 주며, 나머지는 어떤 형태를 기대하는지 예시를 곁들인 입력란으로 대신합니다. 설치되지 않았거나 로그인하지 않은 에이전트는 끝없이 돌아가는 대신 그 사실을 알려 줍니다. "기본값"을 고르면 예전 값이 남아 있는 대신 물려받은 설정이 해제되고, 강도를 골라도 부모 세션에서 물려받은 모델이 더 이상 빠지지 않습니다.

  • Kimi Code 세션에서 실행한 하위 작업은 계속 Kimi Code로 남습니다. 실행 경로가 부모의 에이전트를 물려받을 때 참조하는 목록에 Kimi Code가 빠져 있어서, 그 하위 세션은 조용히 기본 에이전트로 돌아왔습니다.

작업 공간

  • 그룹을 만든 뒤에도 worktree로 옮길 수 있습니다. worktree는 그룹을 만들 때 고르고 나면 그대로 고정이라, 생각이 바뀌면 그룹을 지우고 다시 만드는 수밖에 없었습니다. 이제 그룹을 오른쪽 클릭하고 "Move to Worktree…"를 고르면 새 worktree를 만들거나, 이미 있는 것을 연결하거나, 이미 연결된 그룹의 대상을 바꿀 수 있습니다. 바뀌는 것은 그룹 자체뿐입니다. 안에 이미 있는 세션은 만들어질 때의 디렉터리를 그대로 쓰고 — 실행 중인 세션을 그 아래의 다른 디렉터리로 옮길 수는 없습니다 — 그 뒤에 만드는 세션이 worktree에서 시작합니다.

  • 미러 모드가 사이드바 트리 전체를 다룹니다. 지금까지 공유된 것은 선택 상태와 접어 둔 패널뿐이었고, 검색창과 상태·마커 필터는 각자 로컬에 남았습니다. 그것까지 동기화하면 뭔가를 찾아보는 사람을 방해한다고 봤기 때문입니다. 이 판단은 거꾸로였습니다. 미러란 두 창이 같은 상태를 갖는다는 뜻이지, 한쪽이 다른 쪽의 키 입력을 따라 친다는 뜻이 아닙니다 — 여기서 켜진 필터는 저기서도 켜져 있습니다. 정작 사람을 방해하는 것은 양쪽이 서로 다른 트리를 보여 주는 쪽입니다. 이제 사이드바의 모든 표시가 그대로 전달됩니다. 분할 레이아웃, 각 표시의 이름, 검색어, 상태와 마커 필터, 그리고 저마다의 접힘 상태까지입니다. 스냅샷 형식은 버전 2로 올라갔고, 이전 버전을 쓰는 클라이언트는 한 프레임의 절반만 적용하는 대신 미러링을 멈춥니다. 업그레이드하는 동안 열어 둔 창이 있다면 새로 고쳐 주세요.

인터페이스

  • macOS에서 창을 닫을 때도 종료할 때와 같은 질문을 합니다. ⌘Q와 메뉴 항목은 앱 자체의 확인을 거쳤지만, 빨간 닫기 버튼은 창을 곧바로 없애 버렸습니다 — 그 창이 바로 확인 대화 상자가 올라가는 웹뷰입니다. 그래서 확인이 아예 나오지 않거나, "작업 공간 저장" 체크박스도 없고 문구도 번역되지 않은 간소한 네이티브 대체 창이 나왔습니다. 이제 세 플랫폼 모두 답할 때까지 창을 붙잡아 둡니다.

  • "작업 공간 저장"이 기본으로 켜져 있고, 바꾼 설정은 그대로 남습니다. 레이아웃을 잃는 쪽이 원치 않는 스냅샷 하나보다 손해가 크므로, 체크된 상태로 시작합니다. 그리고 이 설정은 잊히기도 했습니다. 데이터베이스 쓰기가 400ms의 디바운스를 거쳤는데 종료가 그사이에 프로세스를 끝내 버려서, 다음 실행 때 예전 값과 맞춰 보며 바꾼 내용을 되돌려 놓았습니다. 이제 쓰기는 종료 전에 반드시 밀어 넣으며, 백엔드가 멈춰도 확인 버튼이 계속 돌지 않도록 600ms 상한을 두었습니다. (FarhadGSRX 님이 기여했습니다.)

  • 원격 접속 패널의 비밀번호를 눈으로 확인할 수 있습니다. URL 비밀번호와 SSH 비밀번호 모두 눈 모양 버튼이 붙어서 가린 상태와 평문을 오갈 수 있습니다. 보이기 상태는 해당 입력란에만 적용되고 패널을 닫으면 초기화되므로, 비밀번호가 화면에 남아 있는 일은 없습니다.

  • 사이드바 필터 배지가 켜져 있는 필터를 모두 셉니다. 마커 필터는 버튼에 불만 켤 뿐 숫자에 들어가지 않아서, 두 개가 켜져 있어도 배지가 1로 보일 수 있었습니다. 이제 상태와 마커를 함께 세며 드롭다운의 체크와 일치합니다. 상태 필터가 하나뿐일 때는 예전처럼 색 점이 표시됩니다.

수정

  • macOS의 자동 업데이트가 다시 동작합니다. v0.1.103 패키지에는 AppleDouble 동반 항목(._VelaTerm.app)이 들어 있었습니다. 업데이터는 경로의 첫 요소를 떼어 내는데, 그러면 빈 경로가 남고 결국 아카이브를 아예 풀지 않았습니다. 두 아키텍처 모두 영향을 받아서 v0.1.103을 쓰던 macOS 사용자는 모두 그 버전에 발이 묶였습니다. 이제 패키징 과정에서 이런 항목을 만들지 않습니다.

  • 앱 테마가 시스템과 다를 때도 네이티브 컨트롤이 앱을 따라갑니다. 테마를 적용하면 앱 자체의 색만 바뀌고 color-scheme은 갱신되지 않았습니다. 이 값은 시작할 때 시스템 설정에서 한 번 읽힌 뒤로는 바뀌지 않아서, 어두운 시스템에서 밝은 앱을 쓰면 체크박스와 드롭다운, 스크롤바가 어두운 채로 남았습니다. (FarhadGSRX 님이 기여했습니다.)

  • 새로 클론한 저장소가 다시 빌드됩니다. Rust 크레이트는 컴파일 시점에 ../dist를 포함하는데 dev 명령은 그것을 만들지 않으므로, 갓 클론한 저장소는 실행에 이르기도 전에 컴파일에서 실패했습니다. 이제 빌드 스크립트가 해당 디렉터리가 없으면 만들어 줍니다. (FarhadGSRX 님이 기여했습니다.)

v0.1.103

최신 정보

수정

  • Windows에서 Codex 세션이 더 이상 시작을 거부하지 않습니다. Codex 세션을 열 때마다 unexpected argument '--codex-hook'이라는 오류와 함께 즉시 실패했습니다. 원인은 라이프사이클 훅의 TOML 테이블이 명령줄로 전달될 때 공백과 큰따옴표를 포함하는데, npm으로 설치된 codex.cmd가 cmd.exe를 통해 재해석하는 과정에서 따옴표가 제거되고 값이 공백으로 여러 인수로 분리되기 때문입니다. 이제 Windows에서는 훅 주입을 건너뛰고 상태 감지는 기존의 notify / screen / busy 휴리스틱으로 대체됩니다. 유휴·활성 상태는 계속 보고되지만 훅만큼 정확하지는 않습니다. macOS와 Linux는 영향을 받지 않으며 계속 훅을 사용합니다.

  • v0.1.102의 Windows IME 미리 편집 수정을 롤백했습니다. 중국어·일본어·한국어 입력의 미리 편집 오버레이를 복원한 수정이 배경색, 1px 테두리, 둥근 모서리까지 추가해서 입력 중 터미널 안에 미리 편집 텍스트를 감싸는 작은 상자가 나타났습니다 — 터미널 안에 이런 상자가 나타나서는 안 됩니다. 오버레이 크기 조정, 헬퍼 컨테이너 지오메트리, textarea 정리가 서로 의존하므로 변경 사항 전체를 롤백해야 했습니다. Windows에서 CJK를 화면 없이 입력하는 문제는 미해결 상태로 issue #6에서 추적 중입니다.

v0.1.102

최신 정보

AI 에이전트

  • 에이전트 프리셋 — 호환되는 CLI를 여러 개 나란히 쓸 수 있습니다. 지금까지 에이전트 종류는 실행 파일 하나에 고정되어 있어서, 포크 버전이나 나이틀리 빌드, 같은 프로토콜을 쓰는 다른 CLI를 들여올 방법이 없었습니다. 기존 종류의 실행 인자를 고쳐 쓰는 수밖에 없었고, 그러면 원래 설정은 사라졌습니다. 이제 프리셋은 자기 실행 파일과 아이콘, 실행 인자를 직접 갖고, 새 세션 메뉴에서 기본 제공 종류와 나란히 표시됩니다. 세션은 어떤 프리셋으로 만들어졌는지 기록하므로 포크해도 같은 실행 파일을 그대로 씁니다. 데스크톱에서 만든 프리셋은 페어링된 브라우저와 원격 클라이언트에도 아이콘까지 그대로 나타납니다. 아이콘이 한 컴퓨터의 경로가 아니라 데이터로 전달되기 때문입니다. 기존 세션은 전혀 건드리지 않으므로, 이전 버전에서 쓰던 데이터베이스도 예전과 똑같이 시작됩니다.

  • 하위 작업 확인 카드에서 모델과 추론 강도를 고르고, 한 번 답하면 모든 곳에 반영됩니다. 에이전트가 하위 작업 실행을 요청하면 이제 확인 카드에 모델 선택과 — 에이전트가 지원하는 경우 — 추론 강도 선택이 함께 표시됩니다. 둘 다 부모 세션의 실행 인자에서 미리 채워지므로 보통은 클릭 한 번이면 끝납니다. 카드에서 다른 에이전트로 바꾸면 둘 다 다시 계산되기 때문에, 한 CLI의 모델 이름이 다른 CLI의 명령줄에 섞여 들어갈 일이 없어졌습니다. 카드는 연결된 모든 클라이언트에 표시되며, 어느 한 곳에서 답하면 나머지에서는 사라집니다. 첫 응답이 서버에서 해당 작업을 선점하므로, 휴대폰과 데스크톱에서 같은 1초 안에 확인하더라도 worktree와 하위 세션은 두 개가 아니라 하나만 만들어집니다.

작업 공간

  • 미러 모드 — 모든 클라이언트가 하나의 레이아웃을 공유합니다. 터미널 출력은 원래부터 공유되었습니다. PTY 하나, 바이트 스트림 하나입니다. 하지만 그 주위의 배치는 각 클라이언트의 브라우저 저장소에만 있어서, LAN으로 접속한 브라우저는 자기만의 탭과 분할을 보여 주었고 한쪽 화면을 정리해도 다른 쪽은 그대로였습니다. 미러 모드를 켜면 탭, 분할, 활성 세션, 사이드바 선택, 접어 둔 패널이 모든 클라이언트에 전달되고 모두가 이를 따라갑니다. 전환은 호스트가 원격 접속 패널에서 조작합니다. 어느 쪽에서 배치를 바꿔도 반대쪽에 반영됩니다. 이 창의 레이아웃에서 빠진 세션은 종료되지 않고 분리되므로, 상대를 따라갔다는 이유로 누군가의 프로세스가 끝나는 일은 없습니다. 상대의 레이아웃을 적용해도 지금 로컬에서 입력 중인 사람에게서 키보드를 빼앗지 않습니다. 휴대폰은 여기에 포함되지 않습니다. 휴대폰의 2단계 내비게이션은 형태가 다른 UI이고, 데스크톱의 분할 트리를 그대로 옮겨 봐야 누구에게도 도움이 되지 않습니다.

  • 오른쪽 사이드바의 Git 탭이 쓸 만한 Git 클라이언트가 되었습니다. 예전에는 변경된 파일을 나열하기만 했습니다. 이제 파일 하나씩도, 그룹 전체로도 스테이징하고 해제할 수 있고, 변경 사항 버리기, 커밋 작성(amend 포함), 커밋마다 파일과 diff를 함께 보여 주는 커밋 기록까지 지원합니다. 목록은 스테이징됨, 변경됨, 추적되지 않음, 커밋됨 구역으로 나뉘고 각각 접을 수 있습니다. 경로는 저장소 루트를 기준으로 처리하므로 하위 디렉터리에서 연 세션도 화면에 보이는 그대로의 파일을 다루며, 분리된 HEAD 상태는 HEAD라는 이름의 브랜치가 아니라 분리된 HEAD로 표시됩니다.

인터페이스

  • ⌘Q도 창을 닫을 때와 같은 질문을 합니다. 애플리케이션 메뉴의 종료 항목은 시스템이 제공하는 것이라 프로세스를 곧바로 끝냈습니다. 그래서 ⌘Q를 누르면 닫기 버튼에서는 나오는 "작업 공간 저장" 확인이 건너뛰어졌고, 같은 의도의 동작이 어떻게 실행하느냐에 따라 다르게 작동했습니다. 이제 두 경로 모두 하나의 확인을 거칩니다. 확인을 띄우는 창이 그사이에 새로 고쳐졌거나 멈춰 버렸다면, ⌘Q를 다시 누를 때 확인을 다시 요청하고 그래도 안 되면 네이티브 대화 상자로 대체합니다. 앱을 종료할 수 없는 상태로 남겨 두지 않습니다.

  • 단축키 안내가 실제로 동작하는 키를 보여 줍니다. 기본 단축키는 플랫폼마다 다르고, 브라우저는 ⌘/Ctrl과 문자 조합을 자기 몫으로 예약해 둡니다 — ⌘D는 북마크, ⌘T는 새 탭. 그래서 macOS에서는 VelaTerm을 URL로 열었을 때 앱 자체의 ⌘ 단축키가 페이지까지 도달하지 못했습니다. 이제 일반 브라우저 탭에서는 어떤 운영체제든 Ctrl+Alt 조합을 쓰고, 데스크톱 앱과 원격 접속 창은 ⌘를 그대로 유지합니다. 툴팁과 빈 탭 안내는 하드코딩된 ⌘ 조합 대신 실제로 적용 중인 조합을 — 직접 바꾼 것까지 포함해 — 그대로 표시합니다. 그리고 터미널은 앱이 실제로 차지한 조합만 가로채므로, 어떤 동작의 단축키를 바꾸면 그 키의 처리도 함께 옮겨 갑니다.

  • 글꼴 프리셋에 Nerd Font와 CJK가 들어왔고, 설치되지 않은 글꼴을 직접 입력하면 그렇다고 알려 줍니다. 프리셋 목록에 널리 쓰이는 Nerd Font와 CJK 글꼴 계열이 추가되었습니다. 손으로 입력한 글꼴 이름은 그대로 다시 보여 주면서 확인까지 하므로, 시스템에 없는 글꼴이면 요청한 것과 전혀 다른 기본 글꼴로 조용히 되돌아가는 대신 설정 페이지에 그 사실을 표시합니다.

  • macOS의 텍스트 입력란이 입력한 내용을 마음대로 대문자로 바꾸거나 고치지 않습니다. 시스템의 자동 대문자 변환, 자동 수정, 맞춤법 검사가 앱의 모든 입력란에 적용되어 세션 이름이나 명령 입력란에서도 "npm"이 "Npm"이 되곤 했습니다. 이제 모든 곳에서 꺼져 있습니다.

Windows

  • 중국어·일본어·한국어를 입력할 때 조합 중인 글자와 후보 창이 다시 보입니다. 둘 다 보이지 않아서, 화면을 보지 못한 채 입력하고 Enter를 눌러야 결과를 확인할 수 있었습니다. 원인은 우리 쪽 CSS 규칙 두 군데였습니다. 조합 중인 글자를 얹는 오버레이의 컨테이너가 너비 0으로 접혔고, 그 안에서 오버레이의 right 값이 아무 위치도 가리키지 못했습니다. 운영체제가 오버레이의 사각형을 기준으로 후보 창의 위치를 잡기 때문에 후보 창도 함께 사라졌습니다. 이제 오버레이는 다시 그려지고 앱의 색을 따릅니다. 오버레이가 놓이는 보이지 않는 입력 요소도 조합이 끝나면 영역을 내놓으므로, 그 자리를 클릭하거나 드래그하면 예전처럼 빈 요소에 가로막히지 않고 터미널까지 전달됩니다.

  • 네이티브 제목 표시줄이 라이트/다크 설정을 따릅니다. 이 앱은 시스템 제목 표시줄을 그대로 쓰는데, Windows는 따로 알려 주기 전까지 제목 표시줄을 밝게 그리기 때문에 어두운 화면 위에 흰 띠가 얹혀 있었습니다. 이제 제목 표시줄이 앱과 같은 모습이 되며, SSH나 원격 접속 창처럼 나중에 열리는 창에도 적용됩니다. "시스템 설정 따르기"를 고르면 값을 고정하지 않고 운영체제에 제어를 돌려줍니다.

  • 시작할 때 잠깐 나타나던 작은 사각형이 사라졌습니다. 중복 실행을 막는 플러그인이 숨겨진 메시지 창을 만드는데, 그 창의 스타일이 약속한 투명도를 실제로는 적용해 주지 않았습니다. 그래서 Windows가 크기 0인 창을 최소 크기까지 키워 시작 중에 작은 사각형을 그리는 일이 가끔 있었습니다. 이제 제대로 투명하게 처리했으며, 중복 실행 방지 동작 자체는 그대로입니다.

성능

  • 원격 접속이 첫 화면을 띄우기까지 받는 양이 훨씬 줄었습니다. 이제 정적 자산은 요청 시점에 압축해서 캐시 검증 정보와 함께 전달하므로, 두 번째 방문부터는 다시 내려받는 대신 검증만 합니다. 언어 팩과 터미널의 선택적 렌더러도 첫 전송에 포함하지 않고 필요할 때만 불러옵니다. 그 결과 최초 전송량이 예전의 5분의 1 정도로 줄었습니다.

수정

  • 실행된 하위 세션이 요청한 세션과 같은 조건으로 시작됩니다. 하위 세션은 부모의 권한 모드도, 실행 인자도 물려받지 않았습니다. 그래서 확인을 건너뛰도록 설정된 세션의 하위 세션이 확인을 요구했고, 부모에 지정해 둔 모델도 빠졌습니다. 이제 둘 다 물려받으며, 없으면 해당 에이전트 종류의 전역 기본값 — "새 에이전트 세션" 메뉴가 적용하는 것과 같은 값 — 으로 되돌아갑니다.

  • 원격 창을 다시 연결할 때 "인증 실패"라고 잘못 알리지 않습니다. 창이 다시 연결할 때 새 WebSocket과 그것이 대체하는 기존 WebSocket이 서로 경쟁했고, 진 쪽의 정리 과정이 인증 실패로 보고되었습니다. 그 결과 아무 문제 없는 페어링이 거부된 것처럼 배너가 표시되었습니다.

  • 그룹을 자기 하위 트리 안으로 끌어다 놓을 수 없습니다. 그룹을 자기 자손 위에 놓으면 그 가지 전체가 트리에서 떨어져 나가, 안에 있던 세션들이 사이드바에서 사라진 뒤 데이터베이스를 손으로 고치기 전까지 돌아오지 않았습니다. 이제 이런 이동은 거부됩니다.

  • 다른 도구에서 VelaTerm을 실행해도 에이전트 출력의 색이 유지됩니다. 터미널은 자기를 실행한 쪽의 환경을 물려받으므로, NO_COLORCI, FORCE_COLOR=0을 내보내는 IDE나 에이전트 실행 환경에서 시작하면 터미널이 풀컬러를 지원한다고 알리는데도 VelaTerm 안의 에이전트 TUI가 모두 흑백으로 그려졌습니다. 이제 세션이 시작될 때 이렇게 물려받은 값들을 제거합니다. 사용자의 셸 프로필에서 내보낸 같은 변수는 그대로 적용됩니다. 그 프로필은 세션 안에서 실행되기 때문입니다.

v0.1.101

최신 정보

원격 접속

  • 공유 링크가 사용할 주소를 선택할 수 있고, Tailscale 주소도 이제 표시됩니다. 주소 목록이 기존의 사설 IPv4 대역만 허용했기 때문에, 캐리어급 NAT 대역(100.64.0.0/10)의 주소를 할당하는 Tailscale 같은 VPN 메시는 서버가 이미 그 경로로 접근 가능했음에도 원격 접속 패널과 페어링 링크에서 조용히 제외되었습니다. 이제 이 주소들이 목록에 표시되며, VPN 터널은 기본값이 되지 않도록 맨 뒤에 배치됩니다. 패널에 추가된 IP 선택기(시작 전과 실행 중 모두 표시)는 각 후보를 인터페이스 이름과 함께 보여 주고 VPN 터널을 표시합니다. 주소를 선택하면 해당 URL이 맨 앞으로 이동하고 페어링 링크가 정확히 그 호스트로 다시 생성되므로, 복사한 링크는 VPN을 통해서만 이 컴퓨터에 도달할 수 있는 기기에서도 URL을 손으로 수정하지 않고 그대로 동작합니다. 페어링 링크 아래의 QR 코드는 휴대폰으로 바로 스캔할 수 있습니다. 선택은 기억되며, 선택한 인터페이스가 사라지면 선택을 잊지 않은 채 '자동'으로 되돌아갑니다. 서버 자체는 변경되지 않았고 계속 모든 인터페이스에서 수신 대기합니다. 서버 시작 후에야 나타난 주소(예: 나중에 연결된 VPN)를 선택하면 이제 페어링 링크뿐 아니라 복사되는 URL과 QR 코드도 즉시 갱신됩니다(예전에는 다음 재시작까지 페어링 링크만 따라갔습니다). VPN 터널은 모든 플랫폼에서 LAN 주소 뒤에 정렬되고, 서버가 중지된 상태에서 고른 주소는 시작 후 첫 페어링 링크에 사용되며, 겹치는 링크 재생성이 더 새로운 링크를 더 오래된 링크로 덮어쓰는 일도 없어졌습니다.

  • 공유가 재시작 후에도 유지됩니다. 지금까지는 서버가 시작될 때마다 페어링 토큰이 새로 생성되어, VelaTerm을 종료했다가 다시 열면 공유한 링크가 모두 조용히 무효화되고 모든 기기를 다시 페어링해야 했습니다. 이제 토큰, 페어링된 기기, 기기 차단 목록이 데이터 디렉터리의 소유자 전용 파일에 저장됩니다. 이미 페어링된 기기는 재시작 후에도 저장된 URL로 다시 연결되며(액세스 비밀번호는 여전히 필수 2차 인증 요소입니다), 차단된 기기는 계속 차단된 상태로 남습니다. 또한 VelaTerm은 공유가 켜져 있었다는 사실을 기억합니다. 서버가 실행 중인 상태로 앱을 종료하면 다음 실행 시 같은 포트에서 자동으로 다시 시작됩니다 — 데스크톱 앱에서든 --serve로 동작하는 GUI 없는 서버에서든 동일합니다. 직접 중지한 경우에는 아무것도 자동으로 시작되지 않습니다. 포트가 사용 중인 경우처럼 자동 시작이 실패해도 앱은 정상적으로 실행되며 원격 액세스 패널에 원인이 표시됩니다. 포트 입력란은 기본값으로 되돌아가지 않고 실제로 사용한 포트를 기억합니다. "링크 재생성"은 여전히 명시적인 무효화 수단입니다. 즉시 새 토큰을 발급하고 기존 링크를 모두 무효화하며 저장된 상태를 덮어씁니다. 액세스 비밀번호 자체는 절대 디스크에 기록되지 않으며, 저장되는 것은 메모리 하드 해시(Argon2id)뿐입니다.

보안

  • 페어링된 기기가 더 이상 공유 자체를 관리할 수 없습니다. 지금까지는 페어링된 브라우저가 데스크톱 앱과 동일한 관리 명령을 호출할 수 있었습니다 — 새 페어링 링크 생성(기기 차단 목록도 함께 비워집니다), 다른 기기 목록 조회와 해지, 서버 중지와 재구성까지. 또한 설정 저장소는 접근 비밀번호의 메모리 하드 해시와 다음 실행이 읽는 자동 시작 설정을 포함한 전체 설정을 모든 클라이언트에 넘겨주었습니다. 이제 관리 명령은 데스크톱 앱과 Electron 셸 전용이며, 설정 API는 페어링된 기기의 읽기에서 원격 접속 키와 Gitea 토큰을 걸러내고 해당 키에 대한 쓰기를 거부합니다. 페어링된 기기는 페어링의 본래 목적 — 터미널 세션과 완전한 셸 접근 — 은 그대로 유지하지만, 비밀번호 검증값을 읽거나 다른 기기를 초대·추방하거나 다음 시작이 사용할 포트를 바꿀 수는 없습니다. 저장된 비밀 정보를 읽거나 쓰거나 삭제하는 명령 — Gitea 토큰과 기억된 호스트 비밀번호 — 도 이제 페어링된 기기에서는 거부되며, 경로를 받는 명령 — 읽기, 미리보기, 쓰기, 생성, 이름 바꾸기, 삭제는 물론 파일의 git diff 표시와 저장소를 복제할 폴더 선택까지 — 은 심볼릭 링크를 먼저 해석한 뒤 페어링 상태와 키가 보관된 VelaTerm 자체 데이터 디렉터리 내부 경로를 거부합니다. 그 외의 모든 경로는 그대로 동작하므로 원격 파일 탐색과 편집은 계속 사용할 수 있습니다. 경로를 받는 모든 원격 명령을 테스트가 열거하므로, 새 명령이 이 검사를 몰래 지나칠 수 없습니다. 이러한 보호 장치가 요청을 거부하면 브라우저에는 이제 영어 원문 오류 대신 제대로 번역된 메시지가 표시됩니다.

  • 해지나 링크 재생성이 이중 인스턴스 구성에서도 유지됩니다. 자동 시작을 켠 헤드리스 --serve 서버에서는 두 서버 인스턴스가 각자 저장된 페어링 상태 사본을 들고 전체를 다시 써서, 한쪽에서 수행한 해지나 새 페어링 링크가 다른 쪽에 의해 조용히 되돌려질 수 있었습니다. 이제 한 프로세스의 모든 인스턴스는 데이터 디렉터리별로 단일 페어링 상태를 공유합니다. 해지와 회전은 즉시 모든 곳에 적용되고, 파일 기록은 정확히 한 곳으로 모입니다. 파일은 실제 재시작을 넘어 유효한 원본으로 남습니다.

  • 반복된 로그인 실패는 제한됩니다. 접근 비밀번호 검증은 의도적으로 비용이 큰 Argon2id를 사용하며, 포트에 도달할 수 있는 누구나 시도할 수 있습니다. 같은 주소에서 다섯 번 실패하면 이후 시도는 해시 작업이 시작되기 전에 1분 동안 거부됩니다. 해시 계산 자체도 이제 서버의 이벤트 루프 밖에서 실행되며 동시 검증 수에 엄격한 상한이 있습니다. 잘못된 비밀번호를 쏟아부어도 서버를 메모리 하드 해시로 포화시키거나 이미 연결된 기기의 응답을 늦출 수 없습니다. 이 제한은 메모리에만 존재하며 서버 재시작으로 초기화됩니다. 실제 방벽은 여전히 페어링 토큰과 비밀번호입니다. 이 제한은 이제 같은 데이터 디렉터리를 사용하는 모든 서버 인스턴스가 공유하므로 --serve 이중 인스턴스 구성에서도 시도 예산이 두 배가 되지 않으며, 비밀번호 검증이 시작되기 전에 시도가 예약되므로 한 주소에서 오는 병렬 요청이 제한을 빠져나갈 수 없습니다. 제한된 브라우저에는 이제 비밀번호가 틀렸다는 안내 대신 로그인 화면에 전용 속도 제한 메시지가 표시됩니다. 또한 속도 제한은 더 이상 틀린 비밀번호처럼 기억되지 않습니다. 대기 시간이 지나면 페이지를 새로 고치지 않아도 다음 시도가 다시 처리됩니다. 중간에 중단된 시도(비밀번호 검증 중에 탭이 닫힌 경우)는 이제 남은 1분 동안 해당 주소에 계속 집계되는 대신 예약된 자리를 즉시 해제합니다. 또한 로그인에 성공해도 자신의 예약만 해제될 뿐 해당 주소의 기록 전체가 지워지지는 않습니다. 공유 네트워크 주소 뒤에서는 누군가 올바르게 로그인해도 공격자의 시도 예산이 초기화되지 않으며, 기록된 실패는 해당 1분이 지나야만 만료됩니다.

  • 디스크와 로그의 비밀 정보를 더 신중하게 다룹니다. 페어링 상태 파일과 종단 간 암호화 키는 첫 기록 후에 제한하는 대신 생성 시점부터 소유자만 읽을 수 있게 만들어지고, 비밀번호 해시가 담긴 세션 데이터베이스도 소유자로 제한됩니다. 헤드리스 --serve는 페어링 링크의 수명이 긴 비밀을 더 이상 로그에 출력하지 않습니다. 출력이 터미널이 아니면 링크를 감추고 안내만 표시하며, --print-pairing으로 명시적으로 되돌릴 수 있습니다. 기기 레지스트리는 이름 길이를 제한한 32개 항목으로 상한이 정해져 페어링된 클라이언트가 저장 파일을 무한정 키울 수 없고, 해지나 새 페어링 링크 저장이 실패하면 그 오류가 로그 한 줄이 아니라 호출자에게 전달됩니다. 자동 시작은 이미 수동으로 시작된 서버를 더 이상 대체하지 않으며, 오래된 자동 시작 오류는 서버를 직접 중지하면 사라집니다.

수정

  • Electron 셸에서도 페어링을 관리할 수 있게 되었습니다. 페어링 링크 생성, 페어링된 기기 목록 조회, 기기 해지는 데스크톱(Tauri) 명령으로만 존재했고, Electron 셸과 브라우저 클라이언트가 사용하는 WebSocket 디스패처는 "Unknown command"를 반환해 원격 접속 패널이 그곳에서는 동작하지 않았습니다. 이제 세 명령 모두 두 전송 방식에서 동일한 코어 함수를 거치므로 서로 어긋날 수 없으며, 실행 중인 로컬 서버를 상대로 실제 페어링 링크를 생성하는 테스트를 포함한 회귀 테스트가 새 디스패치 경로를 검증합니다.

v0.1.100

최신 정보

AI 에이전트

  • Kiro CLI가 일급 세션 유형으로 합류했습니다. Kiro 세션은 트리에서 자기 노드를 가지며, Kiro 자체 lifecycle hooks가 작업 중·대기 중 상태 표시등을 정확하게 몰아줍니다. 턴이 끝나면 알림이 오고, 노드를 다시 열면 같은 대화가 자동으로 이어지며, 실행 인자와 확인 건너뛰기 전환, vspawn을 통한 실행까지 다른 에이전트가 이미 갖고 있던 기능을 그대로 제공합니다. VelaTerm은 기본 Kiro 에이전트를 자체 vlx-term 에이전트로 복제하고, 복사본에만 관찰 전용 lifecycle hooks를 추가한 뒤 그것을 실행합니다. 사용자의 에이전트 파일은 전혀 수정되지 않으며 프롬프트, 도구와 MCP 서버는 그대로 따라옵니다. Kiro에는 권한 요청 hook이 없으므로 승인을 기다리는 동안에는 표시등이 작업 중으로 남습니다.

수정

  • 터미널에서 시작한 프로그램이 더 이상 AppImage 자체 환경을 물려받지 않습니다(Linux). AppImage 실행기는 PYTHONHOME, PYTHONPATH, PERLLIB, QT_PLUGIN_PATH와 GStreamer 플러그인 경로를 번들의 임시 마운트 디렉터리로 지정하고, PATHLD_LIBRARY_PATH의 맨 앞에 번들 디렉터리를 넣습니다. 터미널은 자신의 환경 전체를 시작하는 shell에 넘기므로, 시스템 python3가 표준 라이브러리를 번들 안에서 찾다가 아예 실행되지 못했고, 동적 링크된 다른 프로그램도 시스템 라이브러리 대신 번들에 든 사본을 먼저 불러왔습니다. 이제 VelaTerm은 shell이나 외부 도구를 시작하기 전에 이런 번들 경로를 제거하며, 사용자가 직접 설정한 값은 건드리지 않습니다. APPDIRAPPIMAGE는 그대로 남으므로 AppImage에서 실행 중인지 확인하는 프로그램은 여전히 답을 얻습니다. AppImage 빌드만 영향을 받았고 deb 패키지, macOS와 Windows는 이전과 동일합니다.

v0.1.99

최신 정보

터미널

  • Shift+Enter가 전송 대신 줄바꿈을 입력합니다. 터미널에는 수식 키를 포함한 Enter를 나타내는 인코딩이 없어서 Claude Code, Codex 같은 에이전트 CLI에는 일반 캐리지 리턴만 전달되었고, 입력을 마치기도 전에 프롬프트가 전송되었습니다. 이제 VelaTerm은 ESC+CR을 보냅니다. 해당 도구들이 iTerm2 키 매핑에서 기대하는 것과 같은 시퀀스이므로 여러 줄 입력이 가능해졌습니다. 그동안 사용자 지정 키 핸들러가 아예 설치되지 않았던 macOS도 포함됩니다. 입력기 조합 중에는 동작이 바뀌지 않으므로 Enter로 후보 단어를 계속 확정할 수 있습니다.

프로젝트 및 구성

  • 세션 하나만 상태를 다시 판정합니다. 상태 필터가 켜진 창에서 세션 메뉴에 상태 새로 고침이 추가되었습니다. 해당 창의 조건으로 그 세션만 다시 평가해 추가하거나 제외하며, 다른 세션은 그대로 유지됩니다. 이 동작은 메뉴를 연 창에 속하므로 재귀적으로 분할해도 다른 창의 필터를 가져다 쓰지 않습니다. 결과는 창별로 저장되어 재시작 후에도 복원됩니다.
  • 마크 해제가 한 번의 클릭으로 끝납니다. 이미 적용된 이모지를 다시 선택하면 해제되므로, 별도의 해제 항목과 구분선이 사라졌습니다. 필터 버튼의 이모지 배지도 제거했습니다. 버튼 강조만으로 마크 필터가 켜진 것을 알 수 있고, 어떤 이모지인지는 메뉴에 표시됩니다.

수정

  • Linux AppImage 데스크톱 통합이 어떤 컴퓨터에서도 설치됩니다. 포함된 아이콘이 빌드 머신의 절대 경로를 가리키는 심볼릭 링크여서, 애플리케이션 자체는 정상 실행되는데도 Gear Lever, AppImageLauncher 같은 도구가 아이콘을 추출하지 못했습니다. 이제 상대 링크로 바뀌었습니다. 실행 파일만이 아니라 함께 배포되는 라이브러리까지 측정한 결과 glibc 요구 사항도 2.35로 정정했으며, 이에 따라 데스크톱 애플리케이션이 지원하는 가장 오래된 배포판은 Ubuntu 22.04입니다.

v0.1.98

최신 정보

AI 에이전트

  • Grok Build가 VelaTerm의 일급 에이전트로 합류했습니다. Grok 4.5를 설치하고 시작하거나 이어서 실행할 수 있습니다. 안정적인 세션 ID, 공식 lifecycle hooks, 정확한 작업 및 권한 상태, 통합된 대화 기록, 사용량 세부 정보와 테마에 맞춰 바뀌는 공식 아이콘이 데스크톱, 브라우저, 모바일 화면에서 일관되게 제공됩니다.

프로젝트 및 구성

  • 프로젝트 사이드바를 서로 독립적인 작업 보기로 분할합니다. 어떤 트리 창도 아래쪽으로 다시 분할할 수 있으며, 창별 검색, 상태 및 이모지 필터, 접기 상태와 분할 비율이 재시작 후에도 복원됩니다. 모든 창은 백엔드가 관리하는 동일한 프로젝트 트리의 보기이므로 비즈니스 데이터를 복제하지 않고 편집 내용이 동기화됩니다.
  • 문맥을 잃지 않고 노드를 표시하고 필터링합니다. 프로젝트, 그룹과 세션에 이모지 표시를 붙일 수 있습니다. 표시된 컨테이너는 전체 하위 트리를 유지하고, 작업 중에는 상태 구성원이 안정적으로 유지됩니다. 동적 추가와 수동 새로 고침을 모두 지원하며 상태와 이모지 조건은 합집합으로 결합됩니다.
  • 빈 프로젝트를 바로 만듭니다. 상위 디렉터리를 선택하고 이름을 검증한 뒤 하나의 흐름에서 폴더를 생성하고 가져올 수 있습니다. 가져오기가 중간에 실패해도 디렉터리를 중복 생성하지 않고 가져오기만 다시 시도합니다.

인터페이스

  • 커뮤니티가 있는 곳에 VelaTerm을 공유합니다. 공유 창은 WeChat Moments, Weibo, Xiaohongshu, X, Reddit, Hacker News, LinkedIn, Facebook, Telegram과 WhatsApp을 지원합니다. WeChat용 QR 코드 흐름과 업데이트 창의 공유 안내도 추가했습니다.
  • 작은 상호작용도 더 세심해졌습니다. 임시 터미널 탭은 저장된 세션으로 바꾸기 전에도 이름을 바꿀 수 있습니다. 일반 입력란에서는 모바일 키보드의 자동 대문자 변환을 끄되 터미널 입력 동작은 바꾸지 않습니다.

v0.1.97

최신 정보

AI 에이전트

  • 세션이 더 이상 “작업 중” 상태로 멈추지 않습니다. Codex는 도구 활동과 턴 종료를 각각 별도의 짧은 프로세스로 전달하기 때문에 콜백 도착 순서가 뒤바뀌어 이미 끝난 턴이 계속 작업 중으로 표시될 수 있었습니다. 이제 자신의 턴이 끝난 뒤 도착한 중간 보고는 폐기하며, 완료 이벤트 없이 종료되는 세션을 위해 세션 종료 hook을 추가했습니다.
  • 중단된 턴이 몇 초 만에 정리됩니다. Esc를 누르거나 스트림 오류가 발생하면 Claude와 Codex의 턴은 완료 콜백을 전혀 보내지 않습니다. 이제 터미널이 6초 동안 아무것도 출력하지 않으면 해당 세션을 조용히 대기 중으로 교정하며 “응답함” 알림은 띄우지 않습니다.

인터페이스

  • macOS에서 분할 단축키가 안정적으로 동작합니다. 오른쪽 분할(Cmd+D)과 아래쪽 분할(Cmd+Shift+D)을 네이티브 Terminal 메뉴 명령으로도 등록해, macOS가 VelaTerm보다 먼저 키 입력을 가로채지 않습니다.
  • 한 번의 키 입력에 한 번만 저장합니다. Cmd+S가 전역 단축키와 포커스된 편집기 양쪽에서 처리되어 한 번의 입력으로 같은 파일을 두 번 기록할 수 있었습니다.

v0.1.96

최신 정보

AI 에이전트

  • Codex 상태는 터미널 추측이 아닌 lifecycle hooks를 신뢰합니다. 최신 Codex 세션은 공식 lifecycle hooks만 활동 상태의 기준으로 사용합니다. SessionStart 핸드셰이크로 연결을 확인하고, 콜백이 없으면 “상태 확인 불가”로 표시합니다. 터미널 텍스트나 출력 활동이 작업 중, 확인 필요 또는 완료 상태를 덮어쓰는 일도 없습니다.
  • 각 턴이 끝난 뒤 Codex 사용량을 더 빠르게 갱신합니다. Info 패널은 로컬 rollout 스냅샷을 즉시 표시한 다음 실시간 사용 한도와 대조합니다. Codex가 최종 token 스냅샷을 기록한 뒤 한 번 더 갱신하며, 이전 세션에서 늦게 도착한 응답은 무시합니다.

인터페이스

  • macOS에서 프로젝트 트리를 정확하게 조작합니다. 가상 행이 더 이상 컴포지터 transform에 의존하지 않아, 스크롤이나 트리 갱신 후 WKWebView의 오래된 히트 테스트 좌표 때문에 호버, 클릭 또는 드래그가 다른 행으로 전달되는 문제를 방지합니다.

v0.1.95

최신 정보

AI 에이전트

  • Kimi Code와 Zoo Code가 세션 트리에 추가되었습니다. 두 에이전트를 시작, 재개, 설치 및 구성할 수 있습니다. Kimi는 공식 lifecycle hooks로 작업·권한·대기 상태를 정확히 보고하며, Zoo Code는 안정적인 작업 ID와 터미널 감지를 사용합니다.
  • Codex 사용량 실시간 새로 고침. Info 패널이 Codex app server에서 현재 사용 한도를 조회하며, 실패하면 로컬 rollout 스냅샷으로 호환성 있게 돌아갑니다.

프로젝트와 터미널

  • vela <path>로 프로젝트 열기. 패키지 빌드에서 VS Code 스타일 shell 명령을 설치할 수 있습니다. 두 번째 호출은 중복 창을 만들지 않고 기존 VelaTerm 창으로 프로젝트를 전달합니다.
  • 진행 상황을 표시하고 취소할 수 있는 Git 복제. Git 단계, 백분율, 경과 시간을 표시하고 정체 시 경고합니다. 취소하면 Git 프로세스 트리와 미완성 디렉터리를 정리하며 오류 및 감사 로그에서 자격 증명과 query token을 숨깁니다.
  • Windows의 WSL 터미널. 설치된 모든 WSL 배포판을 감지하여 일반 터미널에서 PowerShell, cmd, Git Bash와 함께 선택할 수 있습니다. 에이전트 세션은 hooks와 실행 경로의 안정성을 위해 Windows 호스트 shell을 계속 사용합니다.

인터페이스와 안정성

  • 더 명확한 백그라운드 세션 제어. 메뉴에 각 세션의 실시간 상태가 표시되고, 제한 초과 대화상자에서 여러 탭을 한 번에 종료할 수 있습니다.
  • 더 안전한 종료와 다국어 업데이트 노트. 실행 중인 세션을 중지하기 전에 종료를 확인하고 Codex lifecycle의 정확한 ID를 우선합니다. 자동 업데이트 노트는 모든 내장 언어를 지원합니다.

v0.1.94

최신 정보

현지화

  • 베트남어 인터페이스. 언어 선택기에 ‘Tiếng Việt’가 추가되어 베트남어 시스템 설정 시 자동으로 선택됩니다.

브라우저

  • 내장 브라우저의 시작 속도 향상. 이제 모든 브라우저 탭에 ChatGPT, Claude, Gemini, Google에 대한 원클릭 단축키가 제공됩니다. 프로젝트 및 그룹 컨텍스트 메뉴를 통해 세션 트리의 해당 부분에 영구적인 브라우저 페이지를 만들 수도 있습니다.

이미지 및 문서

  • macOS에서 안정적인 이미지 경로 붙여넣기. WebKit이 복사된 이미지를 파일로 노출하지 않을 경우, VelaTerm은 이제 네이티브 클립보드에서 이미지를 읽어와 에이전트의 네이티브 이미지 대체물로 조용히 처리되는 대신 파일 경로 형태로 업로드합니다. 원격 창에서는 항상 이미지 붙여넣기 설정이 표시되며, 파일 경로 모드가 필요한 이유가 설명되고 사용 불가능한 네이티브 옵션은 비활성화됩니다.

  • 소스 문서에 이미지 붙여넣기. 이제 소스 편집기에서도 클립보드의 이미지를 받아들입니다. 저장된 Markdown 문서는 assets/ 아래 해당 문서 옆에 이미지를 저장하고 휴대용 Markdown 이미지 구문을 삽입합니다. 저장되지 않은 초안의 경우 임시 파일이 삭제되어도 이미지 데이터가 유지됩니다.

인터페이스

  • 컨텍스트 메뉴가 계속 표시되며 올바른 항목을 대상으로 합니다. 오른쪽 가장자리 근처에 열리는 메뉴는 정확하게 측정되어 이동됩니다. 트리 노드를 마우스 오른쪽으로 클릭하면 기존 선택 내용은 그대로 유지한 채 메뉴 대상만 강조 표시되며, 그룹 메뉴에는 해당 그룹에 국한된 터미널이 포함됩니다.

  • 더 깔끔해진 편집 기능 및 상태 표시. HTML 주석과 같은 시퀀스에 대해 더 이상 화살표 모양의 글꼴 결합 문자가 표시되지 않으며, 사용률 퍼센트는 명확하게 ‘used’로 표시됩니다. 또한 호스트 WebView의 관련이 없는 네이티브 컨텍스트 메뉴가 VelaTerm의 메뉴 뒤에 나타나지 않습니다.

수정 사항

  • Codex는 일반 터미널 기록에 그대로 남습니다. VelaTerm에 의해 시작된 Codex 세션은 이제 인라인 터미널 모드를 사용하므로, Esc 키를 눌러 중단하거나 이전 단계로 돌아가도 더 이상 터미널 화면 버퍼가 전환되거나 스크롤백 뷰포트가 상단으로 이동하지 않습니다. 사용자의 Codex 설정은 그대로 유지됩니다.

v0.1.93

최신 정보

업데이트

  • 설치하기 전에 변경된 사항을 미리 확인하세요. 새 버전이 출시되면 상태 표시줄의 아이콘과 전용 대화상자를 통해 해당 버전의 릴리스 노트가 표시됩니다. 지금 바로 업데이트하거나, 이 버전을 건너뛰거나, 백그라운드에서 계속 다운로드하거나, 설치 프로그램 다운로드를 수동으로 열 수 있습니다. 진행 상황이 실시간으로 표시되며 앱이 재시작되어 업데이트가 완료됩니다. 여러 버전을 건너뛴 경우 최신 버전뿐만 아니라 그 사이의 모든 버전에 대한 노트가 함께 표시됩니다.

AI 에이전트

  • Codex 세션은 자동으로 이름이 지정됩니다. Codex 세션은 첫 메시지를 보내는 순간부터 이름이 변경되며, 이는 이미 Claude 세션에서 적용되던 방식과 동일합니다. 따라서 트리에 “Codex 1”, “Codex 2”와 같은 이름들이 계속 쌓이는 일이 없습니다. 수동으로 지정한 이름은 절대 덮어쓰이지 않습니다.

  • vspawn와 vopen도 이제 Codex에서 작동합니다. 내장된 vspawn, vspawn-tree, vopen 스킬들은 Claude의 스킬 디렉토리뿐만 아니라 Codex의 스킬 디렉토리에도 설치되므로, $vspawn <task>$vopen <file>는 Codex 세션에서도 사용할 수 있습니다.

  • 더 안정적인 Codex 재개 기능. 나중에 재개하기 위해 Codex 대화 내용을 캡처할 때 더 이상 고정된 타이머 때문에 실패하지 않으므로, 첫 메시지를 입력하기 전에 일시 중지해도 정상적으로 작동합니다. 또한 같은 폴더에서 시작된 두 개의 Codex 세션은 더 이상 서로의 대화 내용과 연결되지 않습니다.

  • Codex의 모델 및 컨텍스트 사용 현황. 정보 패널은 이제 Claude와 마찬가지로 Codex 세션의 현재 모델, 컨텍스트 윈도우 사용량 및 실행 중인 도구를 세션의 실시간 정보를 바탕으로 표시합니다.

원격 및 터미널

  • 새롭게 재구성된 원격 파일 브라우저. 원격 세션용 디렉토리 선택기에는 입력하면서 검색 기능, ~를 사용한 경로로 바로 이동 기능, 위/홈/최근 항목으로 이동 기능, 그리고 인라인 ‘새 폴더’ 기능이 추가되었습니다.

  • 링크는 사용자의 로컬 컴퓨터에서 열립니다. 터미널 내의 링크 — 에이전트의 로그인 링크 포함 — 를 클릭하면 이제 로컬 브라우저에서 열리며, 원격 창에서도 마찬가지입니다.

  • “원격 데이터베이스 재사용” 옵션이 숨겨져 있습니다. 이 옵션은 ‘Connect to Remote’를 Option/Alt 키를 눌러 클릭할 때만 나타나며, 일반 클릭은 항상 독립적인 데이터베이스를 사용하여 연결됩니다.

수정 사항

  • Dock에서 실행할 때도 도구들이 정상적으로 찾아집니다. Dock이나 Finder에서 VelaTerm을 시작해도 더 이상 축소된 PATH 상태가 되지 않으므로, 에이전트들이 사용하는 git 및 기타 Homebrew로 설치된 도구들이 올바르게 위치합니다.

  • 새로운 터미널은 해당 폴더에 열립니다. 사이드바의 프로젝트나 그룹에서 터미널을 생성하면 이제 이전에 활성화된 세션의 폴더가 아닌 해당 노드의 디렉토리에 터미널이 열립니다.

v0.1.92

최신 정보

수정 사항

  • 더 이상 잘못된 “SSH 링크 손실” 경고가 나타나지 않습니다. 이전에는 포트 포워딩 자식 프로세스가 종료될 때 이를 링크 손실로 간주하여 빨간색 배너를 표시하고 터널을 재구성했습니다. 하지만 실제로는 포워딩 리스너가 ControlMaster 프로세스에 존재하므로 자식 프로세스가 종료된 후에도 포워딩은 계속 작동합니다. 따라서 UI가 링크가 끊어졌다고 표시하는 동안에도 터미널은 정상적으로 사용 가능했으며, 재구성 작업은 불필요하게 정상적인 연결을 끊어버렸습니다.

이제 링크는 두 단계로 확인됩니다. 자식 프로세스가 종료될 때 VelaTerm은 먼저 로컬 포워딩 포트에 리스너가 여전히 존재하는지 확인합니다. 리스너가 있으면 아무런 조치도 취해지지 않습니다. 포트도 사라졌을 때만 링크가 손실된 것으로 간주되어 터널이 재구성됩니다. 또한 빨간색 배너도 지연 처리되어 첫 번째 재구성 시도가 실패한 후에만 표시되므로, 몇 초 이내에 해결되는 일시적인 문제로 인해 더 이상 경고가 뜨지 않습니다.

정상적으로 끊긴 연결도 자동으로 복구됩니다. ControlMaster 프로세스가 종료되거나 네트워크가 장시간 끊기면 터널이 자동으로 재구축되며, 재시도 횟수가 소진되면 배너가 "SSH link is down"으로 변경되고 Reconnect를 통해 세션을 즉시 복원할 수 있습니다. 원격 프로세스는 계속 실행되어 중단된 지점부터 작업을 이어갑니다.

v0.1.91

최신 정보

** 첫 공개 버전.** 이 버전에 포함된 모든 기능이 여기에 있습니다.

AI 에이전트를 최우선으로 취급

  • Claude Code, Codex, OpenCode, Copilot CLI, Cursor CLI, Cline, Pi, Antigravity (Gemini CLI) 및 crush 등 9가지 에이전트에 대한 내장 지원이 제공됩니다. 세션을 생성할 때 유형을 선택하면 바로 사용할 수 있도록 시작됩니다.

  • 에이전트 상태는 추측이 아닌 실제로 보고됩니다. VelaTerm은 시작 시 각 공급업체의 공식 콜백 메커니즘( Claude용 훅, Codex용 notify, OpenCode용 플러그인 등)을 삽입하여 모든 상태 변화가 즉시 전달됩니다. 세션 트리에는 작동 중, 대기 중, 완료되었지만 아직 확인되지 않은 상태를 나타내는 점이 표시되며, 사이드바에서는 상태별로 필터링할 수 있고 상태 표시줄에는 실시간 카운트가 표시됩니다.

  • 에이전트가 권한 결정이 필요하거나 작업을 완료할 때 시스템 알림이 표시되며, 알림을 클릭하면 바로 해당 세션으로 이동합니다. 콜백이 없는 경우에는 화면 감지 기능이 대체 수단으로 작동합니다.

  • 모든 상황에서 대화 내용이 유지됩니다. 각 에이전트의 고유 세션 ID가 캡처되어 저장되므로 세션을 닫거나 앱을 재시작하거나 아카이브된 세션을 복원해도 원래 대화가 계속 이어집니다. 단, 해당 세션이 여전히 존재하는지 먼저 확인됩니다. Claude Code, Codex 및 Pi는 현재 대화를 병렬 세션으로 분할할 수도 있습니다.

  • 세션은 또 다른 세션을 생성할 수 있습니다. 하위 작업들은 에이전트 자체나 사용자에 의해 자식 세션으로 생성되며, 필요에 따라 격리된 git worktree에서 생성되어 여러 에이전트가 동일한 리포지토리에서 동시에 작업할 수 있습니다. 작업이 완료되면 그래픽 기반의 병합 대화상자를 통해 브랜치들을 다시 결합할 수 있습니다.

  • 설치되지 않은 에이전트의 경우 권장 명령어와 원클릭 설치 옵션이 포함된 설치 카드가 제공되며, 설치 후 자동으로 경로가 검색됩니다. 사이드 패널에서는 Claude와 Codex의 사용량 할당량을 확인할 수 있으며, 모든 대화 내용은 그 자리에서 확인하거나 전체 Markdown 트랜스크립트로 내보낼 수 있습니다.

세션 관리

  • 프로젝트, 그룹, 세션으로 구성된 3단계 트리 구조로, 그룹의 중첩 횟수에 제한이 없으며 세션 아래에도 자식 세션이 존재합니다. 노드는 자유롭게 드래그할 수 있으며, 축소된 상태는 재시작 후에도 유지됩니다.

  • 어떤 하위 트리든 아카이브할 수 있습니다. 데이터를 삭제하지 않고 아카이브 패널에 숨길 수 있으며, 언제든지 복원하여 대화를 계속할 수 있습니다.

  • 전역 콘텐츠 검색(⌘⇧F)은 SQLite FTS5 인덱스를 기반으로 하며 에이전트 트랜스크립트와 터미널 출력 모두를 검색할 수 있습니다. 왼쪽에는 검색 결과 트리가, 오른쪽에는 링크된 미리보기가 표시되며, 세션 간에 단계별로 이동할 수 있습니다.

우선적인 진정한 터미널

  • 실제 PTYs (portable-pty, wezterm에서 제공)을 사용하므로 vim, htop 및 에이전트의 TUI도 정상적으로 작동합니다.

  • 자유로운 분할이 가능한 여러 탭 — 각 탭은 자체적인 분할 트리를 가지며, 원하는 대로 수평 또는 수직으로 나눌 수 있습니다.

  • 브라우저 스타일의 탭 라이프사이클: 백그라운드 탭은 계속 활성 상태를 유지하며 해당 프로세스도 계속 실행됩니다. 라이브 탭의 할당량은 설정 가능하며, 이를 초과하면 가장 오래된 비활성 세션이 종료됩니다. 탭을 닫으면 해당 프로세스가 종료됩니다.

  • 입력 우선순위 스케줄링과 출력 프레임 결합 기능 덕분에 부하가 있어도 타이핑 반응성이 유지됩니다. 화면을 가득 채우는 에이전트도 더 이상 키 입력을 방해하지 않습니다.

  • 터미널 내 검색(⌘F), 세션 녹화 및 재생, 이미지를 에이전트에 직접 붙여넣거나 드래그할 수 있으며, Windows에서 cmd, PowerShell 및 Git Bash 간에 자유롭게 전환할 수 있습니다.

터미널을 넘어서

  • 모든 세션에서 vopen <file>을 실행하면 터미널 옆에 문서 탭이 바로 열립니다. Markdown는 WYSIWYG 에디터로 열리며 벡터 형식의 PDF로 내보낼 수 있고, 이미지는 내장 뷰어에서 열리며 소스 파일에는 구문 강조 표시가 적용됩니다.

  • 내장 브라우저 탭은 임시 탭으로 사용하거나 프로젝트 트리에 영구 노드로 고정할 수 있습니다.

원격 및 멀티 디바이스

  • 데스크톱 앱은 웹을 통해 동일한 인터페이스를 제공하며, 하나의 실시간 세션 집합을 공유합니다. 모든 클라이언트에 실시간으로 출력이 전송되며, 어느 클라이언트든 입력할 수 있습니다. 데스크톱과 브라우저 모두 동일한 터미널을 보고 제어할 수 있습니다.

  • 프레임 단위의 NaCl 암호화, QR 코드나 링크를 통한 페어링, 개별 취소 기능을 포함한 디바이스별 관리 기능이 제공됩니다.

  • 헤드리스 모드: GUI가 없는 서버에서도 --serve이 동일한 서비스를 실행하여 브라우저가 연결할 수 있도록 합니다.

  • SSH 원격 연결을 통해 원격 머신을 트리에 추가할 수 있습니다. VelaTerm은 데스크톱에서 직접 연결하여 원격 측에 가벼운 vela-server를 배포하며, 원격 세션도 로컬 세션과 동일하게 작동합니다. 터널은 자동으로 복구되고 재연결됩니다.

  • 모바일: 이 서비스는 모바일 웹 뷰를 제공하며, 네이티브 앱 셸(xterm 렌더링에 네이티브 입력 및 액세서리 키바 포함)도 사용할 수 있습니다.

플랫폼 및 외관 개선

  • macOS, Linux 및 Windows을 지원합니다.

  • 자동 업데이트가 제공되며, 공증된 macOS 빌드도 사용할 수 있습니다.

  • 시스템 테마에 맞춰 밝은 테마와 어두운 테마가 제공되며, 실행 중인 에이전트 세션도 표준 터미널 알림(DEC 2031)을 통해 테마 변경을 알 수 있습니다. TUI 색상은 즉시 변경되므로 재시작이 필요하지 않습니다.

  • 기본적으로 영어가 사용되며, 시스템 로케일에 따라 10개의 언어가 함께 제공됩니다.

모든 릴리스에는 자동 업데이트 기능이 포함되어 있습니다 — VelaTerm는 자동으로 최신 버전을 제공합니다. 직접 다운로드 페이지.