Skip to content

대화형 세션에서 실행 파일을 등재하고 진행 상황을 보이게 했다 - #96

Merged
SonAIengine merged 2 commits into
mainfrom
feat/interactive-session-tools
Oct 25, 2026
Merged

SonAIengine merged 2 commits into
mainfrom
feat/interactive-session-tools

Conversation

@SonAIengine

Copy link
Copy Markdown
Contributor

왜

대화형 REPL에서 카탈로그에 없는 프로그램이 필요해지면 막다른 길이었다. 모델은 자기가 무엇을 실행할 수 있는지 planning constraint로 정확히 알고 있고("Caller-catalogued process executable logical IDs: …"), 그래서 "그건 할 수 없다"고 정직하게 답한다. 그런데 사용자가 "그럼 이걸 써도 된다"고 허락할 방법이 세션 안에 없었다. --allow-executable은 xgen run에만 있다.

같은 세션에서 긴 Run이 돌 때 화면에는 Thinking… · 12s만 떴다. driver는 이미 모든 경계를 알려 주고 있었는데 표시 쪽이 이벤트를 통째로 버리고 있었다(|_|). 답변도 생 Markdown이라 목록이 별표로 읽혔다.

무엇을

/allow-executable ID=ABSOLUTE_PATH

  • 받아들이기 전에 실제로 process session을 지어 본다. 경로가 없거나 실행할 수 없으면 그 자리에서 거절되고 카탈로그는 그대로다. 다음 목표에서 깨지지 않는다.
  • 일시정지된 Run이 있으면 거절한다. Run은 시작할 때의 카탈로그 digest에 고정돼 있어서 바꿔 놓으면 /resume이 fail-closed 된다. 그 Run을 좌초시키는 대신 기다리게 했다.
  • 중복 ID와 경로 없는 입력은 각각 executable_already_catalogued, executable_specification_invalid로 거절한다.
  • 기본 카탈로그는 바꾸지 않았다. shell-free 기본값(ADR 0028)은 그대로이고, 셸이 필요한 사람이 /allow-executable sh=/bin/sh로 세션 단위로 택한다.

라이브 한 줄

Executing… · 41s · 2 committed

phase는 atomic으로 넘긴다. driver가 네트워크나 도구에서 블록돼 있어도 표시 스레드가 자기 주기로 다시 그린다. 어휘는 --debug의 effect_label과 같게 맞췄다(read/write/execute).

답변 렌더링과 완료 줄

제목·- 목록·**강조**·`코드`·펜스 블록을 터미널 속성(bold/underline/dim)으로 렌더링한다. 색은 쓰지 않아서 밝은 테마에서도 읽힌다. 답변 아래에 · 41s · 3 committed를 흐리게 한 줄 남긴다 — 라이브 라인은 끝나면 지워지므로 그 전에는 긴 Run의 흔적이 답변밖에 없었다.

안전 경계: 모델 텍스트는 기존처럼 write_terminal_text로 먼저 이스케이프한 뒤에 스타일을 입힌다. 스타일 escape는 전부 우리가 쓴 것이고, 모델은 커서를 움직이거나 화면을 다시 칠할 수 없다. 파이프 출력과 --debug는 바이트 그대로 둔다.

검증

  • 신규 테스트 5개: 카탈로그 등재와 거절, 일시정지 Run 보호, phase/커밋 수 표시, Markdown 렌더링과 이스케이프 유지, 완료 줄.
  • lib 87 + bins 26 통과, cargo clippy --all-targets 경고 0, cargo fmt --check 통과.
  • 실제 바이너리로 catalogued_executables: 22 → 23, /help 노출, sh=/bin/sh 등재까지 확인했다.

남은 것

스크롤백과 대체 화면은 포함하지 않았다. 화면 전체를 소유하는 구조라 입력·리사이즈·취소를 다시 짜야 하고 새 의존성이 필요해서, THIRD_PARTY_LICENSES.txt와 릴리스 바이트 검증까지 걸린다. 별도 결정이 필요한 크기다.

🤖 Generated with Claude Code

SonAIengine and others added 2 commits October 25, 2026 18:55
대화형 REPL의 실행 파일 카탈로그는 PATH에서 찾은 개발 도구 25개로 고정이었고,
세션 중에 늘릴 방법이 없었다. `--allow-executable`은 `xgen run`에만 있어서,
카탈로그에 없는 프로그램이 필요해지면 나가서 다시 시작하는 수밖에 없었다.
`/allow-executable ID=ABSOLUTE_PATH`를 추가한다. 경로는 받아들이기 전에 실제로
세션을 지어 보고 검증하므로, 쓸 수 없는 경로는 그 자리에서 거절되고 카탈로그는
그대로 남는다. 일시정지된 Run이 있으면 거절한다 — Run은 시작할 때의 카탈로그
digest에 고정돼 있어서, 바꾸면 /resume이 fail-closed 되기 때문이다.

표시도 두 가지 고쳤다. 라이브 한 줄은 progress 이벤트를 통째로 버리고 있어서
몇 분이 걸려도 Thinking만 떴다. 이제 driver가 알려 주는 경계를 그대로 보여
주고(Planning/Reading/Writing/Executing/Verifying) 커밋된 단계 수를 센다.
어휘는 --debug의 effect_label과 같다. 그리고 답변이 생 Markdown으로 찍히던 것을
제목·목록·강조·인라인 코드·펜스 블록까지 터미널 속성으로 렌더링한다. 모델
텍스트는 기존처럼 먼저 이스케이프한 뒤에 스타일을 입히므로, 모델이 ANSI를
뱉어도 커서를 움직이거나 화면을 다시 칠할 수 없다. 파이프 출력과 --debug는
바이트 그대로 둔다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@SonAIengine
SonAIengine merged commit e0cdd81 into main Oct 25, 2026
3 checks passed
@SonAIengine
SonAIengine deleted the feat/interactive-session-tools branch October 25, 2026 10:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant