프로그램 상태를 알리는 터미널 프로토콜 (OSC 7501)

A Terminal Protocol for Program Status (OSC 7501)

mitchellh.com ▲ 163 댓글 49 mfiguiere

요약

미첼 하시모토가 프로그램이 작업 상태를 터미널에 직접 알리는 규약 OSC 7501을 제안했습니다.

터미널 에뮬레이터 Ghostty를 만든 미첼 하시모토가 10월 6일에 쓴 글입니다. AI 에이전트를 여러 개 동시에 돌리는 사람이 늘었습니다. 그런데 어떤 작업이 끝났는지, 사용자를 기다리는지는 아직 화면을 보고 짐작하는 수준이라는 문제의식에서 나왔습니다.

왜 중요한가

  • 에이전트 관리 도구가 화면 글자나 창 제목으로 상태를 추측하던 방식을 프로그램의 직접 보고로 바꾸자는 제안입니다.
  • 소켓이나 SDK 없이 터미널 연결(pty)로 전달되므로 SSH 접속이나 컨테이너 안에서도 그대로 작동합니다.
  • AI만이 아니라 빌드, 배포, 패키지 업그레이드처럼 오래 걸리는 모든 작업에 쓰도록 범용으로 설계했습니다.

핵심 내용

  • 상태는 idle(대기), working(진행 중), done(완료), blocked(사용자 조치 필요), error(실패) 다섯 가지입니다.
  • 본문은 콜론으로 구분한 key=value 목록이고, 사람이 읽을 메시지(msg)는 base64로 인코딩합니다.
  • blocked에는 권한·질문·인증 같은 종류를, working에는 진행률을 붙일 수 있습니다.
  • 계층형 ID로 여러 작업을 함께 보고해, 배포 중 지역별 진행률과 승인 대기를 따로 보여 줄 수 있습니다.
  • libghostty와 Rex가 구현했고, Terraform·Claude Code·Codex·Homebrew에는 열두 줄 안팎으로 시험 연동했습니다.

HN 반응

  • 일부 이용자는 BSD의 Ctrl+T(SIGINFO), 터미널 벨, systemd가 구현한 OSC 3008처럼 이미 있는 방식을 쓰자고 했습니다.
  • 상태 분류가 AI 에이전트 용도에 치우쳤다는 비판에는, 비밀번호 입력처럼 일반 CLI에도 흔한 상황이라는 반론이 맞섰습니다.

댓글

30개 표시 · 전체 49개
  1. drewg123 HN

    BSD 계열에는 이런 기능이 아주 오래전부터 있었습니다. 터미널에서 ^T를 누르면 기다리고 있는 애플리케이션에 SIGINFO가 전달됩니다. 기본적으로 프로그램 이름, 무엇 때문에 블록되어 있는지, 실제/사용자/시스템 시간과 메모리 사용량 정보가 나옵니다.

    포그라운드에서 emacs 창을 띄운 경우입니다.

    % emacs ^T load: 0.32 cmd: emacs-31.1 64938 [select] 2.89r 0.75u 0.06s 6% 122404k

  2. paaloeye HN

    SIGINFO에 응답을 보낼 위치를 알려 주는 환경 변수를 더하는 방식을 채택하면 훨씬 좋을 겁니다.

    그러면 AI 에이전트의 상태가 필요한 쪽은 누구든 SIGINFO 시그널을 보내고 응답을 기다리기만 하면 되니까요.

  3. alberth HN

    이건 풀(pull)이냐 푸시(push)냐의 차이일 수도 있지 않을까요?

    ^T는 풀이고

    OSC7591은 푸시입니다.

  4. gorgoiler HN

    무슨 차이가 있죠? SIGINFO는 프로그램에 무엇을 하고 있는지 물어서 보여 주는 거잖아요. 그 위에 백그라운드에서 (SIGINFO로) 폴링하다가 바뀐 내용을 표시하는 계층을 얹는 건 누구든 마음대로 할 수 있고요.

    시그널 핸들러를 좋은 인터럽트 코드가 그렇듯 블로킹 작업 없이 메시지 전달만 하게 만들어 두면 성능 문제도 없을 겁니다. 우리가 폴링하는 건 사람과 컴퓨터의 상호작용 속도에 맞춘, 로컬에 있는 몇 개 프로세스 사이의 일이지, 대규모로 원격 폴링을 하는 게 아니니까요.

  5. paaloeye HN

    Darwin도 지원합니다.

  6. eschaton HN

    Darwin이 BSD인데요.

  7. paaloeye HN

    꼭 그런 건 아니고요, Darwin은 BSD 파생입니다.

  8. klodolph HN

    기술적으로는 맞는 말이지만 아무 정보도 안 되네요.

  9. paaloeye HN

    OSC 7501이 풀려는 문제는 UAPI.15 OSC 3008에 거의 완벽하게 들어맞습니다.

    OSC 3008은 이미 systemd가 구현했고 Ubuntu 26.04에서도 쓸 수 있습니다.

    저라면 차라리 OSC 3008을 확장하는 쪽을 보고 싶습니다.

  10. alberth HN
  11. JdeBP HN

    아니면 명세를 고치든가요.

    문법 설명 두 번째 문단에 'ASCII byte range > 0x7f'라고 적혀 있는 명세는 출발부터 좋지 않습니다. ASCII에는 DEL 위로 코드가 없습니다. 게다가 C1 제어 문자를 허용하는 건 쓸모도 없고, 실제로 문제만 일으킵니다. CSI, SOS 같은 것들이 C1 제어 문자이기 때문에, 명령 문자열 안에 명령 시퀀스와 제어 시퀀스가 끼어드는 문제가 생깁니다.

  12. bugcheck7b HN

    이런 게 나와서 반갑네요. 저는 zellij와 ghostty로 커스텀 알림 OSC를 이리저리 만져 보고 있었습니다.

    저는 확실히 이걸 확장해서, 각 홉마다 역방향 경로를 인코딩하는 커스텀 키를 넣을 겁니다. 그러면 신호를 낸 창/탭/패널로 쉽게 이동하거나, 해당 패널에 권한 승인/거부 같은 커스텀 동작을 되돌려 보낼 수 있으니까요.

  13. rauhl HN
  14. Vegenoid HN

    아이디어는 마음에 듭니다만, 우리에겐 이미 터미널 벨이 있습니다. 제 환경에서는 에이전트가 작업을 마치거나 뭔가 필요하면 벨을 울립니다. 설정에 따라 터미널 밖에 있으면 데스크톱 알림이, 터미널 안에 있으면 멀티플렉서의 토스트가 뜹니다. 터미널 패널은 제목에 색이 들어간 "벨" 아이콘이 붙고, 제가 그 패널에 접속하면 사라집니다.

    글에서 터미널 벨을 전혀 언급하지 않은 게 이상합니다. 이 프로토콜이 진지하게 받아들여지려면 그 부분을 짚고 넘어가야 한다고 봅니다. 더 세밀한 정보도 좋겠지만, 벨의 단순함도 그에 못지않게 좋으니까요.

  15. ghshephard HN

    "다른 시퀀스와의 관계" 절은 읽어 보셨나요?

    https://www.superlogical.com/rex/docs/build/program-status#relationship-to-other-sequences

    그리고 터미널 벨은 https://www.superlogical.com/rex/docs/automate/shell-scripting#performing-actions 에도 분명히 언급되어 있습니다.

      rex events -s work --json |
      jq -r 'select(.payload.event.payload.name == "bell")
             | .payload.event.payload.block_id'
    
  16. skydhash HN

    터미널 벨은 ASCII 7번(십진수), 즉 Ctrl+G를 가리키는 이름일 뿐입니다. 모든 터미널이 지원한다고 알고 있고, 대부분의 에뮬레이터는 소리 대신 시각 효과로 바꿀 수도 있습니다. 보통은 데스크톱 환경이나 윈도 매니저에 알림도 보내 줍니다.

  17. mprovost HN

    멍멍, 멍멍!!

  18. weinzierl HN

    저는 수십 년 동안 이것의 허름한 버전을 써 왔습니다.

    제 iTerm2는 탭에 활동, 새 출력, 시각적 벨이 표시되도록 설정되어 있습니다. 리눅스에서는 WezTerm으로 비슷하게 맞춰 놨고요.

    파이프라인이나 명령 시퀀스에 끼워 넣어서 관심 있는 이벤트마다 벨을 울리게 하는 bell 명령도 있습니다. 가장 간단한 경우는 프로그램이 끝났을 때죠.

    셸 명령 시퀀스에서 쓸 수 있는 멋진 별칭도 있습니다. 터미널 벨을 보내는 것에 더해, 앞선 명령의 종료 상태에 따라 다른 소리를 내 줍니다.

  19. flopsamjetsam HN

    옛날 IBM 3270 터미널의 상태 표시줄이 떠오르네요(옛것이 다시 새것이 되는군요 :). 사실 꽤 좋은 아이디어라고 생각합니다.

  20. paaloeye HN

    사실 꽤 좋은 아이디어라고 생각합니다.

    저도 처음엔 그렇게 생각했습니다. 그런데 명세를 끝까지 읽어 보니 하나의 사용 사례, 즉 TUI AI 에이전트에 지나치게 맞춰져 있다는 게 분명해졌습니다.

    예를 들어 kind := permission | question | auth 같은 건 그 사용 사례 밖에서는 별로 말이 안 됩니다. 이런 게 계속 나옵니다.

    이 명세를 둘러싼 설명도 너무 흐릿하다고 느꼈습니다. AI 에이전트 사용 사례가 언급되기는 하는데, 다른 사용 사례들과 섞어서 일부러 희석해 놓은 듯합니다.

    전체적으로 Kitty/Kovid 수준에는 한참 못 미치는 명세입니다. mitchellh의 작업은 보통 품질이 아주 높아서 더 안타깝습니다.

    커뮤니티가 반발해서 명세가 나아지길 바랍니다.

  21. vvvvtt340 HN

    대규모 엔터프라이즈 소프트웨어를 업그레이드한다고 해 봅시다. 업그레이드를 시작합니다. 5분 뒤, 업그레이드에 저장 공간이 1.5GB 더 필요하다며 계속할 건지 묻습니다. 15분 뒤, 업그레이드에 필요한 패키지를 외부에서 받아 오려고 사용자 이름과 비밀번호를 입력하라는 프롬프트가 뜹니다. 다시 5분 뒤, 업그레이드 프로세스가 쓸모없이 남은 파일을 여러 개 발견했다며 지워도 되는지 허락을 구합니다.

  22. skydhash HN

    벨이 바로 그걸 위한 거 아닌가요?

  23. cpuguy83 HN

    CLI가 비밀번호를 묻는 건 아주 흔한 일 아닌가요?

  24. hinkley HN

    사내 도구를 자주 만드는 사람으로서 말씀드리면, 피할 수 없는 현실이긴 하지만 달갑지는 않습니다. 저는 실행 도중에 자격 증명 때문에 멈추는 일을 어떻게든 피하려고 합니다. 처음에 한꺼번에 받거나, ssh 키처럼 오래 유지되는 자격 증명 체계를 쓰죠.

    그런데 회사마다 인증 자동화를 끝까지 안 하려는 사람이 꼭 두 명씩은 있어서, 결국 제가 그걸 떠안게 됩니다. 정말 고집이 셉니다. 급한 작업을 하다가 지켜보는 사람들 앞에서 그 때문에 발목을 잡혀도, 매번 비밀번호를 치는 대신 신뢰 관계를 설정하자는 데 동의하게 만든 건 가끔뿐이었습니다.

    그러니까 속이 터져도 비밀번호 프롬프트는 지원해야 한다는 얘기입니다.

  25. paaloeye HN

    네, 하지만 CLI는 말 그대로 무엇이든 물어볼 수 있습니다. 거기에 항목을 계속 더하다 보면 그 _프로토콜_을 지원하기 어려운 구현이 잔뜩 난립하게 될 겁니다.

    CLI는 화면을 비워 둘 수도 있는데, 그것도 지원해야 할까요?

  26. kevin_thibedeau HN

    에이전트에게 주어진 인터페이스의 범위가 제한된 탓에 나온 물건입니다. 에이전트는 터미널 스트림을 받으니 모든 게 그 스트림으로 들어가는 겁니다. 인밴드 시그널링을 더 쌓아 올리면 보안 악몽이 될 뿐입니다. 필요에 따라 잠글 수 있는, 프로세스 상태를 안전하게 조회하는 방법이 있는 편이 낫습니다.

  27. danudey HN

    저는 회사에서 CLI 도구를 많이 다루는데, AI 에이전트 사용 사례와는 전혀 상관없이 오래 도는 도구 몇 개에 이걸 구현한다는 아이디어가 실제로 마음에 듭니다.

    저도 이런 생각으로 별도의 golang 라이브러리를 만들었습니다. https://github.com/danudey/ansipants

    원래 생각은 이랬습니다. CI 환경이나 터미널 출력을 보여 주는 어느 곳이든 스트리밍 ANSI 파싱 라이브러리로 프로그램이 보낸 '창 제목 변경' OSC 이벤트를 감지하고, 그때부터 출력에 접을 수 있는 새 섹션을 시작할 수 있다는 겁니다. 그러면 프로그램은 로컬에서 실행될 때는 실제 터미널 창 제목에 현재 상태를 갱신하고, CI에서 실행될 때는 CI 인터페이스를 갱신할 수 있습니다.

    프로그램의 현재 상태와 (선택적으로) 진행률을 지정하는 기능은 CI 환경에서도 아주 유용할 수 있습니다. 예를 들어 오래 걸리는 분석 작업이 OSC 7501로 지금 실행 중이고 75%까지 진행됐다고 알린다고 상상해 보세요. CI는 이를 UI에 노출해서, 가짜 터미널에 진행 막대나 진행 상황 줄을 여러 번 찍지 않고도 사용자에게 유용한 정보를 줄 수 있습니다.

  28. paaloeye HN

    https://github.com/danudey/ansipants 는 비공개인가요?

  29. paaloeye HN

    오래 걸리는 분석 작업은 진행률 보고에 osc9;4를 쓰면 됩니다.

    명세: https://ghostty.org/docs/vt/osc/conemu

  30. JLO64 HN

    한 시간 전에 Pi 문서를 훑어보다가 이걸 알게 됐습니다. herdr pi 확장 대신 쓸 수 있을 것 같아서 정말 기대됩니다. 저는 확장을 최대한 적게 쓰는 편을 선호하거든요. 그리고 CI 트래커와 함께 쓰기에도 좋을 것 같습니다(Forgejo에서 동작하는 트래커가 필요하겠지만요).

    https://pi.dev/docs/latest/terminal-setup#program-status

Hacker News에서 보기 ↗