# rawp-crs 1.0.1 변경 사항 1.0.0와 비교 ## 개요 | 항목 | 값 | | --- | --- | | 원본 파일 | `rawp-crs.md` | | 추가된 섹션 | 0 | | 삭제된 섹션 | 0 | | 수정된 섹션 | 6 | | 문서 변경 여부 | 예 | ## 추가된 섹션 - 없음 ## 삭제된 섹션 - 없음 ## 수정된 섹션 - Document Overview - 2. 메시지 아키텍처 및 레이아웃 원칙 (Message Architecture) - 3. 유저 메시지 (User Message) - 4. 에이전트 메시지 (Agent Message) - 5. 시스템 메시지 (System Message) - 부록: 관련 규격 문서 ## 섹션별 변경 상세 ### Document Overview - 이전 앵커: `#document-overview` - 현재 앵커: `#document-overview` - 추가된 줄: 6 - 삭제된 줄: 6 ```diff > **본 파일은 RAWP-CRS 1.0의 §1–§3을 포함합니다. §4–§6 및 부록은 Part 2를 참조하십시오.** -| 항목 | 값 | -| ---------------- | ---------------- | -| 상태 | Stable | -| 버전 | 1.0 | -| 상위 규격 | **RAWP 1.0** | -| 데이터 평면 규격 | **RAWP-DPS 1.0** | +| 항목 | 값 | +| ---------------- | ------------------ | +| 상태 | Stable | +| 버전 | 1.0.1 | +| 상위 규격 | **RAWP 1.0.2** | +| 데이터 평면 규격 | **RAWP-DPS 1.0.1** | --- ``` ### 2. 메시지 아키텍처 및 레이아웃 원칙 (Message Architecture) - 이전 앵커: `#2-message-architecture` - 현재 앵커: `#2-message-architecture` - 추가된 줄: 92 - 삭제된 줄: 0 ```diff **시각 포맷**: 타임스탬프는 사용자의 로케일과 시간대에 맞춘 현지 시각으로 표시해야 한다 (MUST). 당일 메시지는 시:분(예: `14:32`), 이전 날짜의 메시지는 날짜+시:분(예: `3/10 14:32` 또는 로케일에 따른 포맷)으로 표시할 것을 권장한다 (SHOULD). +### 2.5. 키보드 인터랙션 (Keyboard Interaction) + +대화 인터페이스에서 사용자가 키보드로 수행할 수 있는 공통 인터랙션을 정의한다. 팝업(슬래시 명령어 §3.2, 파일 참조 §3.4) 내부의 키보드 내비게이션은 각 섹션에서 별도 정의한다. + +#### 2.5.1. 메시지 전송 + +| 키 | 동작 | 조건 | +| ------------- | ----------- | ------------------------------------------------------ | +| `Enter` | 메시지 전송 | 입력창에 텍스트가 존재하고, 팝업이 활성 상태가 아닐 때 | +| `Shift+Enter` | 줄바꿈 삽입 | 항상. 메시지를 전송하지 않는다. | + +`Enter`로 전송 시 입력창의 내용이 비어 있으면(공백만 포함) 전송하지 않아야 한다 (MUST NOT). + +#### 2.5.2. 에이전트 응답 취소 (`Escape`) + +에이전트가 응답 중(Turn 진행 중)일 때 `Escape` 키를 누르면, 클라이언트는 `control.prompt.cancel`(RAWP-DPS 1.0.1 §6.1.2)을 발송하여 현재 Turn을 취소해야 한다 (MUST). + +**취소 가능 상태**: 다음 에이전트 상태에서 `Escape`가 취소를 트리거해야 한다 (MUST): + +| 에이전트 상태 | `Escape` 동작 | +| ----------------------------------------------- | ---------------------------------------- | +| `thinking` (사고 중) | Turn 취소 (`control.prompt.cancel` 발송) | +| `tool_calling` (도구 실행 중) | Turn 취소 | +| 텍스트 스트리밍 중 (`agent.text.delta` 수신 중) | Turn 취소 | + +**취소 불가 상태**: 다음 상태에서는 `Escape`가 취소를 트리거하지 않는다: + +| 상태 | `Escape` 동작 | +| -------------------------------- | -------------------------------------- | +| `idle` (에이전트 유휴) | 동작 없음 | +| `awaiting_input` (상호작용 대기) | 상호작용 UI 닫기 (§2.5.3 참조) | +| 팝업 활성 상태 (§3.2, §3.4) | 팝업 닫기 (각 섹션의 키보드 규칙 적용) | + +**취소 후 동작**: §5.2의 사용자 중지 피드백 규칙을 따른다. + +#### 2.5.3. 상호작용 응답 키보드 조작 + +`agent.interaction.request`(RAWP-DPS 1.0.1 §4.3.1)에 의해 표시된 상호작용 UI에 대한 키보드 조작: + +| `interaction_type` | 키보드 조작 | +| ------------------ | -------------------------------------------------------------------- | +| `YN` | `Y` 또는 `Enter` → 승인, `N` 또는 `Escape` → 거부 | +| `PERMISSION` | `Enter` → 승인, `Escape` → 거부 | +| `SELECT` | `↑`/`↓` → 항목 이동, `Enter` → 선택, `Escape` → 취소 | +| `MULTI_SELECT` | `↑`/`↓` → 항목 이동, `Space` → 토글, `Enter` → 확정, `Escape` → 취소 | +| `TEXT_INPUT` | `Enter` → 제출, `Escape` → 취소 | + +`Escape`로 상호작용을 취소하면 `default_value`가 정의된 경우 해당 값으로 자동 응답하고, 정의되지 않은 경우 타임아웃과 동일하게 처리해야 한다 (MUST). + +#### 2.5.4. 대화 이력 내비게이션 + +| 키 | 동작 | +| ----------------------- | -------------------------------------------------------------------------------------------------------------- | +| `↑` / `↓` | 입력창이 비어 있을 때 이전/다음 유저 메시지를 입력창에 불러오기 (MAY). 셸의 히스토리 내비게이션과 동일한 패턴. | +| `Page Up` / `Page Down` | 대화 이력 영역을 한 페이지씩 스크롤 (SHOULD) | +| `Home` | 대화 이력의 최상단으로 스크롤 (MAY) | +| `End` | 대화 이력의 최하단(최신 메시지)으로 스크롤 (MAY) | + +#### 2.5.5. 입력창 포커스 + +대화 인터페이스가 활성 상태일 때, 팝업이나 상호작용 UI가 표시되지 않은 상태에서 사용자가 키보드 입력을 시작하면, 입력창에 자동으로 포커스가 이동해야 한다 (SHOULD). 이는 사용자가 별도의 클릭 없이 바로 타이핑을 시작할 수 있도록 하기 위함이다. + +### 2.6. 대화 이력 점진적 로딩 (Conversation History Lazy Loading) + +기존 대화를 다시 열 때, 전체 Turn을 한 번에 렌더링하면 Turn 수가 많은 대화에서 심각한 성능 저하가 발생한다. 이를 방지하기 위해 클라이언트는 **최신 N개 Turn만 초기 로딩**하고, 나머지는 사용자의 명시적 요청에 의해 추가 로딩하는 점진적 로딩(Lazy Loading) 방식을 적용해야 한다 (MUST). + +#### 2.6.1. 초기 로딩 규칙 + +대화를 열 때 클라이언트는 가장 최근의 **N개 Turn**만 렌더링해야 한다 (MUST). 여기서 1 Turn은 사용자 메시지 1회와 그에 대한 에이전트의 전체 응답(텍스트, 도구 호출, 사고 과정 등)을 포함하는 논리적 단위이다. + +**기본값**: N의 기본값은 **10**으로 한다 (SHOULD). + +**설정 가능성**: N 값은 사용자가 클라이언트 설정에서 변경할 수 있어야 한다 (MUST). 최솟값은 1, 최댓값은 클라이언트 구현에 따르되 100 이하로 제한한다 (SHOULD). + +#### 2.6.2. 이전 Turn 로딩 UI + +초기 로딩 범위 밖의 이전 Turn이 존재하는 경우, 대화 이력의 최상단에 **이전 Turn 로딩 트리거**를 표시해야 한다 (MUST). + ... diff truncated ... ``` ### 3. 유저 메시지 (User Message) - 이전 앵커: `#3-user-message` - 현재 앵커: `#3-user-message` - 추가된 줄: 36 - 삭제된 줄: 8 ```diff **우측 정렬 채팅 버블**: 유저 메시지는 대화 영역의 우측에 배경색이 있는 둥근 모서리(border-radius) 버블로 렌더링해야 한다 (MUST). 버블의 최대 너비는 대화 영역 전체 폭의 70~80%로 제한하여 좌측에 여백을 확보하고, 에이전트 메시지와의 시각적 대칭을 유지한다 (SHOULD). -**텍스트 메시지**: `control.prompt.request`에서 `input_type: "text"`인 메시지는 입력된 원문 텍스트를 버블 내에 그대로 표시한다. 기본적인 마크다운 포맷(볼드, 이텔릭 등)이 포함되어 있더라도, 유저 메시지 버블 내에서는 렌더링하지 않고 원문을 유지하는 것을 기본으로 한다 (SHOULD). 이는 사용자가 자신이 입력한 내용을 정확히 확인할 수 있도록 하기 위함이다. +**텍스트 메시지**: `control.prompt.request`에서 `input_type: "text"`인 메시지는 입력된 텍스트를 버블 내에 마크다운 서식을 적용하여 표시한다. +**유저 메시지 서식 인식**: 유저 메시지 버블 내에서 다음의 텍스트 마크다운 서식을 인식하고 렌더링해야 한다 (MUST): + +| 서식 | 구문 | 렌더링 | +| --------------- | -------------------------------- | ------------------------------------ | +| **볼드** | `**text**` 또는 `__text__` | `font-weight: bold` 적용 | +| **이텔릭** | `*text*` 또는 `_text_` | `font-style: italic` 적용 | +| **볼드+이텔릭** | `***text***` | 볼드와 이텔릭 동시 적용 | +| **취소선** | `~~text~~` | `text-decoration: line-through` 적용 | +| **인라인 코드** | `` `code` `` | 모노스페이스 폰트, 배경색 구분 | +| **줄바꿈** | Enter 키 (`\n`) 또는 Shift+Enter | `
` 줄바꿈 표시 | +| **링크** | `[text](url)` | 클릭 가능한 하이퍼링크 | +| **자동 링크** | URL 패턴 자동 감지 | 클릭 가능한 링크로 변환 | +| **불릿 목록** | `- item` 또는 `* item` | `