code-agent: implement issue 4
Approval-Correlation: 0543bb321a84cb936bc0ac4988615840
Plan-SHA256: 437a85f68d151ed4db780511812834041cfec5e7cf021fb77e238d5a6196e6fb
Base-SHA: 256be64ac7
This commit is contained in:
+28
-14
@@ -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` 바인딩을 통해 애플리케이션 종료를 요청한다.
|
||||
|
||||
Reference in New Issue
Block a user