code-agent: implement issue 4

Approval-Correlation: 0543bb321a84cb936bc0ac4988615840
Plan-SHA256: 437a85f68d151ed4db780511812834041cfec5e7cf021fb77e238d5a6196e6fb
Base-SHA: 256be64ac7
This commit is contained in:
code-agent
2000-01-01 00:00:00 +00:00
parent 256be64ac7
commit 52dd589f8c
8 changed files with 238 additions and 83 deletions
+28 -14
View File
@@ -1,24 +1,38 @@
# 인터페이스 계약
## tui-input-display
## 메시지 제출 이벤트
### 화면
Textual의 `Input.Submitted` 이벤트가 `#user-input`에서 발생하면 `ChatApp.on_input_submitted`가 처리한다.
- Textual 애플리케이션은 헤더, `#conversation` 대화 영역, `#user-input` 입력창을 제공한다.
- 애플리케이션 시작 시 입력창에 포커스를 둔다.
### 입력 정규화
### 입력 제출
1. 이벤트의 `value`에 `strip()`을 적용한다.
2. 입력 위젯의 값을 빈 문자열로 초기화한다.
3. 정규화 결과가 빈 문자열이면 추가 처리를 중단한다.
- 사용자가 `#user-input`에서 Enter를 누르면 현재 값이 제출된다.
- 비어 있지 않은 값은 변경 없이 대화 영역에 새 항목으로 추가된다.
- 제출 후 입력창은 빈 값이 된다.
- 대화 영역의 항목 순서는 제출 순서와 같다.
공백만 포함한 입력은 사용자 메시지, 응답 선택, 대화 항목을 생성하지 않는다.
### 종료
### 유효한 입력 처리
- `Escape`와 `Ctrl+Q`는 애플리케이션의 종료 동작을 호출한다.
- 종료 시 세션 내 메모리 상태를 영구 저장하지 않는다.
정규화 결과가 비어 있지 않으면 다음 순서로 처리한다.
### 경계
1. 정규화된 사용자 메시지를 `submitted_inputs`에 추가한다.
2. `random.choice(RESPONSE_MESSAGES)`로 응답을 선택한다.
3. 선택 응답을 `selected_responses`에 추가한다.
4. 대화 영역에 사용자 메시지 `Label`을 추가한다.
5. 바로 이어서 응답 `Label`을 추가한다.
6. 대화 영역을 마지막 항목까지 스크롤한다.
이 인터페이스는 화면 표시와 입력 상태 관리만 담당한다. LLM 클라이언트, 네트워크 요청, 인증 및 외부 서비스 연동은 제공하지 않는다.
사용자 메시지와 응답은 별도 대화 항목이며, 화면 표시 순서는 항상 사용자 메시지 다음 응답이다.
## 화면 위젯 계약
- 대화 영역은 `#conversation` 식별자의 `VerticalScroll`이다.
- 입력창은 `#user-input` 식별자의 `Input`이다.
- 사용자 메시지는 `user-message` 클래스를 사용한다.
- 응답은 `response-message` 클래스를 사용한다.
- 애플리케이션 마운트 시 입력창에 포커스를 둔다.
## 종료 계약
`Escape`와 `Ctrl+Q`는 기존 `quit` 바인딩을 통해 애플리케이션 종료를 요청한다.