1.0.1 변경 이력 1.0.0 기준

변경 이력

RAWP-CRS 1.0.1

1.0.0 대비 변경 사항을 정리한 문서입니다.

수정됨

Document Overview

추가된 줄 6 삭제된 줄 6
1 1 # RAWP-CRS 1.0: Client Rendering Specification — Part 1 (§1–§3)
2 2
3 3 > **본 파일은 RAWP-CRS 1.0의 §1–§3을 포함합니다. §4–§6 및 부록은 Part 2를 참조하십시오.**
4 4
5 | 항목 | 값 |
6 | ---------------- | ---------------- |
7 | 상태 | Stable |
8 | 버전 | 1.0 |
9 | 상위 규격 | **RAWP 1.0** |
10 | 데이터 평면 규격 | **RAWP-DPS 1.0** |
5 | 항목 | 값 |
6 | ---------------- | ------------------ |
7 | 상태 | Stable |
8 | 버전 | 1.0.1 |
9 | 상위 규격 | **RAWP 1.0.2** |
10 | 데이터 평면 규격 | **RAWP-DPS 1.0.1** |
11 11
12 12 ---
수정됨

2. 메시지 아키텍처 및 레이아웃 원칙 (Message Architecture)

추가된 줄 92 삭제된 줄 0
47 47
48 48 **날짜 구분선 (Date Separator)**: 대화가 날짜를 넘겨서 이어지는 경우, 날짜가 변경되는 지점에 중앙 정렬 날짜 구분선(예: `── 2025년 3월 11일 ──`)을 삽입하여 시간 맥락의 단절을 명확히 해야 한다 (SHOULD). 이 구분선은 시스템 메시지와 동일한 중앙 정렬, 연한 색상 스타일을 따른다.
49 49
50 50 **시각 포맷**: 타임스탬프는 사용자의 로케일과 시간대에 맞춘 현지 시각으로 표시해야 한다 (MUST). 당일 메시지는 시:분(예: `14:32`), 이전 날짜의 메시지는 날짜+시:분(예: `3/10 14:32` 또는 로케일에 따른 포맷)으로 표시할 것을 권장한다 (SHOULD).
51 51
52 ### 2.5. 키보드 인터랙션 (Keyboard Interaction)
53
54 대화 인터페이스에서 사용자가 키보드로 수행할 수 있는 공통 인터랙션을 정의한다. 팝업(슬래시 명령어 §3.2, 파일 참조 §3.4) 내부의 키보드 내비게이션은 각 섹션에서 별도 정의한다.
55
56 #### 2.5.1. 메시지 전송
57
58 | 키 | 동작 | 조건 |
59 | ------------- | ----------- | ------------------------------------------------------ |
60 | `Enter` | 메시지 전송 | 입력창에 텍스트가 존재하고, 팝업이 활성 상태가 아닐 때 |
61 | `Shift+Enter` | 줄바꿈 삽입 | 항상. 메시지를 전송하지 않는다. |
62
63 `Enter`로 전송 시 입력창의 내용이 비어 있으면(공백만 포함) 전송하지 않아야 한다 (MUST NOT).
64
65 #### 2.5.2. 에이전트 응답 취소 (`Escape`)
66
67 에이전트가 응답 중(Turn 진행 중)일 때 `Escape` 키를 누르면, 클라이언트는 `control.prompt.cancel`(RAWP-DPS 1.0.1 §6.1.2)을 발송하여 현재 Turn을 취소해야 한다 (MUST).
68
69 **취소 가능 상태**: 다음 에이전트 상태에서 `Escape`가 취소를 트리거해야 한다 (MUST):
70
71 | 에이전트 상태 | `Escape` 동작 |
72 | ----------------------------------------------- | ---------------------------------------- |
73 | `thinking` (사고 중) | Turn 취소 (`control.prompt.cancel` 발송) |
74 | `tool_calling` (도구 실행 중) | Turn 취소 |
75 | 텍스트 스트리밍 중 (`agent.text.delta` 수신 중) | Turn 취소 |
76
77 **취소 불가 상태**: 다음 상태에서는 `Escape`가 취소를 트리거하지 않는다:
78
79 | 상태 | `Escape` 동작 |
80 | -------------------------------- | -------------------------------------- |
81 | `idle` (에이전트 유휴) | 동작 없음 |
82 | `awaiting_input` (상호작용 대기) | 상호작용 UI 닫기 (§2.5.3 참조) |
83 | 팝업 활성 상태 (§3.2, §3.4) | 팝업 닫기 (각 섹션의 키보드 규칙 적용) |
84
85 **취소 후 동작**: §5.2의 사용자 중지 피드백 규칙을 따른다.
86
87 #### 2.5.3. 상호작용 응답 키보드 조작
88
89 `agent.interaction.request`(RAWP-DPS 1.0.1 §4.3.1)에 의해 표시된 상호작용 UI에 대한 키보드 조작:
90
91 | `interaction_type` | 키보드 조작 |
92 | ------------------ | -------------------------------------------------------------------- |
93 | `YN` | `Y` 또는 `Enter` → 승인, `N` 또는 `Escape` → 거부 |
94 | `PERMISSION` | `Enter` → 승인, `Escape` → 거부 |
95 | `SELECT` | `↑`/`↓` → 항목 이동, `Enter` → 선택, `Escape` → 취소 |
96 | `MULTI_SELECT` | `↑`/`↓` → 항목 이동, `Space` → 토글, `Enter` → 확정, `Escape` → 취소 |
97 | `TEXT_INPUT` | `Enter` → 제출, `Escape` → 취소 |
98
99 `Escape`로 상호작용을 취소하면 `default_value`가 정의된 경우 해당 값으로 자동 응답하고, 정의되지 않은 경우 타임아웃과 동일하게 처리해야 한다 (MUST).
100
101 #### 2.5.4. 대화 이력 내비게이션
102
103 | 키 | 동작 |
104 | ----------------------- | -------------------------------------------------------------------------------------------------------------- |
105 | `↑` / `↓` | 입력창이 비어 있을 때 이전/다음 유저 메시지를 입력창에 불러오기 (MAY). 셸의 히스토리 내비게이션과 동일한 패턴. |
106 | `Page Up` / `Page Down` | 대화 이력 영역을 한 페이지씩 스크롤 (SHOULD) |
107 | `Home` | 대화 이력의 최상단으로 스크롤 (MAY) |
108 | `End` | 대화 이력의 최하단(최신 메시지)으로 스크롤 (MAY) |
109
110 #### 2.5.5. 입력창 포커스
111
112 대화 인터페이스가 활성 상태일 때, 팝업이나 상호작용 UI가 표시되지 않은 상태에서 사용자가 키보드 입력을 시작하면, 입력창에 자동으로 포커스가 이동해야 한다 (SHOULD). 이는 사용자가 별도의 클릭 없이 바로 타이핑을 시작할 수 있도록 하기 위함이다.
113
114 ### 2.6. 대화 이력 점진적 로딩 (Conversation History Lazy Loading)
115
116 기존 대화를 다시 열 때, 전체 Turn을 한 번에 렌더링하면 Turn 수가 많은 대화에서 심각한 성능 저하가 발생한다. 이를 방지하기 위해 클라이언트는 **최신 N개 Turn만 초기 로딩**하고, 나머지는 사용자의 명시적 요청에 의해 추가 로딩하는 점진적 로딩(Lazy Loading) 방식을 적용해야 한다 (MUST).
117
118 #### 2.6.1. 초기 로딩 규칙
119
120 대화를 열 때 클라이언트는 가장 최근의 **N개 Turn**만 렌더링해야 한다 (MUST). 여기서 1 Turn은 사용자 메시지 1회와 그에 대한 에이전트의 전체 응답(텍스트, 도구 호출, 사고 과정 등)을 포함하는 논리적 단위이다.
121
122 **기본값**: N의 기본값은 **10**으로 한다 (SHOULD).
123
124 **설정 가능성**: N 값은 사용자가 클라이언트 설정에서 변경할 수 있어야 한다 (MUST). 최솟값은 1, 최댓값은 클라이언트 구현에 따르되 100 이하로 제한한다 (SHOULD).
125
126 #### 2.6.2. 이전 Turn 로딩 UI
127
128 초기 로딩 범위 밖의 이전 Turn이 존재하는 경우, 대화 이력의 최상단에 **이전 Turn 로딩 트리거**를 표시해야 한다 (MUST).
129
130 **트리거 형태**: 다음 중 하나의 방식을 사용한다:
131
132 - **명시적 버튼**: "이전 대화 불러오기" 또는 유사한 라벨의 버튼을 대화 이력 최상단에 배치한다. 클릭 시 이전 N개 Turn을 추가 로딩한다.
133 - **스크롤 기반 자동 로딩**: 사용자가 대화 이력을 최상단까지 스크롤하면 자동으로 이전 N개 Turn을 로딩한다. 로딩 중에는 스피너 또는 스켈레톤 UI를 표시해야 한다 (MUST).
134
135 두 방식을 함께 제공할 수 있다 (MAY).
136
137 #### 2.6.3. 로딩 동작 규칙
138
139 - **추가 로딩 단위**: 한 번의 로딩 요청에서 N개 Turn 단위로 추가 로딩한다 (SHOULD). 남은 Turn이 N개 미만이면 나머지를 모두 로딩한다.
140 - **스크롤 위치 유지**: 이전 Turn이 로딩되어 상단에 삽입될 때, 현재 사용자가 보고 있는 콘텐츠의 스크롤 위치가 변경되어서는 안 된다 (MUST). 새 콘텐츠는 현재 뷰포트 위쪽에 삽입되고, 스크롤 오프셋을 보정하여 사용자의 시각적 위치를 유지한다.
141 - **전체 로딩 완료 표시**: 모든 Turn이 로딩되면 로딩 트리거를 제거하거나 비활성화하여 더 이상 로딩할 내용이 없음을 표시해야 한다 (MUST).
142 - **로딩 실패**: 이전 Turn 로딩이 실패한 경우, 에러 메시지와 함께 재시도 옵션을 제공해야 한다 (MUST).
143
52 144 ---
수정됨

3. 유저 메시지 (User Message)

추가된 줄 36 삭제된 줄 8
4 4
5 5 ### 3.1. 버블 스타일 및 레이아웃
6 6
7 7 **우측 정렬 채팅 버블**: 유저 메시지는 대화 영역의 우측에 배경색이 있는 둥근 모서리(border-radius) 버블로 렌더링해야 한다 (MUST). 버블의 최대 너비는 대화 영역 전체 폭의 70~80%로 제한하여 좌측에 여백을 확보하고, 에이전트 메시지와의 시각적 대칭을 유지한다 (SHOULD).
8 8
9 **텍스트 메시지**: `control.prompt.request`에서 `input_type: "text"`인 메시지는 입력된 원문 텍스트를 버블 내에 그대로 표시한다. 기본적인 마크다운 포맷(볼드, 이텔릭 등)이 포함되어 있더라도, 유저 메시지 버블 내에서는 렌더링하지 않고 원문을 유지하는 것을 기본으로 한다 (SHOULD). 이는 사용자가 자신이 입력한 내용을 정확히 확인할 수 있도록 하기 위함이다.
9 **텍스트 메시지**: `control.prompt.request`에서 `input_type: "text"`인 메시지는 입력된 텍스트를 버블 내에 마크다운 서식을 적용하여 표시한다.
10 10
11 **유저 메시지 서식 인식**: 유저 메시지 버블 내에서 다음의 텍스트 마크다운 서식을 인식하고 렌더링해야 한다 (MUST):
12
13 | 서식 | 구문 | 렌더링 |
14 | --------------- | -------------------------------- | ------------------------------------ |
15 | **볼드** | `**text**` 또는 `__text__` | `font-weight: bold` 적용 |
16 | **이텔릭** | `*text*` 또는 `_text_` | `font-style: italic` 적용 |
17 | **볼드+이텔릭** | `***text***` | 볼드와 이텔릭 동시 적용 |
18 | **취소선** | `~~text~~` | `text-decoration: line-through` 적용 |
19 | **인라인 코드** | `` `code` `` | 모노스페이스 폰트, 배경색 구분 |
20 | **줄바꿈** | Enter 키 (`\n`) 또는 Shift+Enter | `<br>` 줄바꿈 표시 |
21 | **링크** | `[text](url)` | 클릭 가능한 하이퍼링크 |
22 | **자동 링크** | URL 패턴 자동 감지 | 클릭 가능한 링크로 변환 |
23 | **불릿 목록** | `- item` 또는 `* item` | `<ul><li>` 목록 렌더링 |
24 | **숫자 목록** | `1. item` | `<ol><li>` 번호 목록 렌더링 |
25
26 다음 서식은 유저 메시지에서 렌더링하지 않는다 (MUST NOT): 헤더(`#`), 펜스 코드 블록(` ``` `), 테이블(`| |`), 이미지(`![]()`), 인용구(`>`), 수평선(`---`), 수식(`$`). 유저 메시지는 대화형 텍스트이므로 복잡한 블록 레벨 구조는 적용하지 않되, 목록은 대화에서 자주 사용되므로 예외적으로 허용한다.
27
28 **입력창에서의 서식 입력**: 입력창은 사용자가 마크다운 구문을 직접 타이핑하는 플레인 텍스트 모드를 기본으로 한다 (MUST). 서식이 적용된 리치 텍스트 미리보기는 입력 중에 표시하지 않는다 (MUST NOT). 마크다운 구문은 전송 후 대화 이력에 표시될 때 렌더링된다.
29
11 30 **파일 참조 토큰 렌더링**: 전송 완료된 메시지가 대화 이력에 표시될 때, `prompt_text` 내 파일 참조 토큰이 포함되어 있는 경우 §3.4.5의 토큰 시각 사양(배경색, 둥근 모서리, 아이콘)과 동일한 스타일로 인라인 렌더링해야 한다 (MUST). 대화 이력 내 토큰은 읽기 전용이며, 클릭 시 해당 파일의 경로를 클립보드에 복사하거나 파일 뷰어를 여는 동작을 지원할 수 있다 (MAY).
12 31
13 32 **토큰 검증 규칙**: 대화 이력에서 유저 메시지를 렌더링할 때, `prompt_text` 내 토큰 패턴이 `file_references`에 유효하게 매핑되는 경우에만 시각적 토큰으로 렌더링한다 (MUST). 매핑되지 않는 토큰 패턴은 RAWP-DPS §16.2.2에 따라 언이스케이프 후 리터럴 텍스트로 표시하여, 위조된 토큰이 시각적으로 정당한 파일 참조처럼 보이는 것을 방지한다 (MUST).
14 33
15 34 §3.3(슬래시 명령어 실행 버블)의 "중첩 컨테이너 금지" 원칙을 동일하게 따른다. 토큰의 배경색이 버블 배경색과 충분히 구분되어야 하며 (MUST), 버블 내에 별도의 컨테이너(카드, 박스 등)를 추가하지 않는다.
157 176 - **폰트**: 모노스페이스 폰트를 적용하여 파일 경로임을 시각적으로 암시한다 (SHOULD). 폰트 크기는 입력창의 본문 텍스트와 동일하게 유지한다.
158 177
159 178 **토큰 동작:**
160 179
161 180 - 토큰은 커서 이동 시 **원자 단위(atomic unit)** 로 취급한다 (MUST). 좌/우 화살표로 커서가 토큰에 도달하면 토큰 전체를 건너뛴다. 토큰 내부에 커서가 진입하지 않는다.
162 - `Backspace` 키로 토큰 직후에서 삭제하면, 첫 번째 `Backspace`로 토큰 전체를 선택(하이라이트) 상태로 전환하고, 두 번째 `Backspace`로 토큰을 삭제해야 한다 (SHOULD). 이는 슬랙의 멘션 삭제 UX와 동일하다. 또는 단일 `Backspace`로 즉시 삭제하되, `Ctrl+Z`(undo)로 복원할 수 있게 하는 방식도 허용한다 (MAY).
163 181 - 토큰을 포함한 텍스트의 복사/붙여넣기 시, 토큰은 `@파일명` 형태의 플레인 텍스트로 변환된다 (SHOULD).
164 182
183 **토큰 삭제 (Fluid Deletion):**
184
185 토큰 삭제는 커서 위치에 관계없이 물 흐르듯 자연스러운 시각적 연속성을 유지해야 한다 (MUST). 삭제 과정에서 대화 흐름이 끊기거나 레이아웃이 점프해서는 안 된다 (MUST NOT).
186
187 - **Backspace (토큰 직후에서)**: 첫 번째 `Backspace`로 토큰 전체를 선택(하이라이트) 상태로 전환한다 (MUST). 하이라이트된 토큰은 배경색 변경(예: 기존 연한 파란색 → 연한 빨간색 `#FFEBEE` 또는 테마의 `danger` 색상 10~15% 불투명도)으로 삭제 예정 상태임을 표시한다. 두 번째 `Backspace`로 토큰을 삭제한다.
188 - **Delete (토큰 직전에서)**: `Backspace`와 동일한 2단계 동작을 `Delete` 키에도 적용해야 한다 (MUST).
189 - **삭제 애니메이션**: 토큰이 삭제될 때 너비를 0으로 축소하는 트랜지션(100~150ms)을 적용하여 후속 텍스트가 부드럽게 당겨지도록 해야 한다 (MUST). 즉시 제거하여 텍스트가 갑자기 이동하는 것은 허용하지 않는다 (MUST NOT).
190 - **범위 선택 삭제**: 사용자가 마우스 드래그 또는 Shift+화살표로 토큰을 포함하는 텍스트 범위를 선택한 후 삭제하면, 선택 범위 내의 토큰은 2단계 확인 없이 즉시 삭제한다 (MUST). 이 경우에도 삭제 애니메이션은 적용한다 (SHOULD).
191 - **Undo 지원**: 토큰 삭제 후 `Ctrl+Z`(macOS: `Cmd+Z`)로 토큰을 복원할 수 있어야 한다 (MUST). 복원 시 토큰의 메타데이터(`ref_id`, 파일 경로 등)도 함께 복원된다.
192
165 193 **복수 참조**: 단일 메시지 내에 여러 개의 파일 참조 토큰이 존재할 수 있다 (MUST 지원). 각 토큰은 독립된 `ref_id`를 가지며, 동일 파일을 중복 참조하더라도 별개의 토큰으로 취급한다.
166 194
167 195 #### 3.4.6. 메시지 전송 시 변환 및 이스케이프
168 196
169 197 사용자가 메시지를 전송하면, 클라이언트는 입력창의 콘텐츠를 다음 두 영역으로 분리하여 처리해야 한다 (MUST):
185 213
186 214 # RAWP-CRS 1.0: Client Rendering Specification — Part 2 (§4–§6, 부록)
187 215
188 216 > **본 파일은 RAWP-CRS 1.0의 §4–§6 및 부록을 포함합니다. §1–§3(파일 참조 입력 §3.4 포함)은 Part 1을 참조하십시오.**
189 217
190 | 항목 | 값 |
191 | ---------------- | ---------------- |
192 | 상태 | Stable |
193 | 버전 | 1.0 |
194 | 상위 규격 | **RAWP 1.0** |
195 | 데이터 평면 규격 | **RAWP-DPS 1.0** |
218 | 항목 | 값 |
219 | ---------------- | ------------------ |
220 | 상태 | Stable |
221 | 버전 | 1.0.1 |
222 | 상위 규격 | **RAWP 1.0.2** |
223 | 데이터 평면 규격 | **RAWP-DPS 1.0.1** |
196 224
197 225 ---
수정됨

4. 에이전트 메시지 (Agent Message)

추가된 줄 183 삭제된 줄 5
56 56
57 57 | 컴포넌트 | 마크다운 구문 | 렌더링 명세 | 지원 수준 |
58 58 | ----------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
59 59 | **펜스 코드 블록** | ` ```language ... ``` ` | 모노스페이스 폰트, 본문과 구분되는 배경색 컨테이너에 렌더링한다. 내용이 가로로 넘칠 경우 **가로 스크롤**을 지원해야 한다 (MUST). | MUST |
60 60 | **구문 하이라이팅** | ` ```python ` 등 언어 식별자 | 해당 언어의 키워드, 문자열, 주석, 숫자 등을 색상으로 구분하는 구문 하이라이팅을 적용한다. 최소한 주요 언어(Python, JavaScript/TypeScript, Java, C/C++, Go, Rust, HTML, CSS, SQL, Bash, JSON, YAML, Markdown)를 지원해야 한다. | SHOULD |
61 | **코드 블록 메타 정보** | — | 코드 블록 상단에 언어명 레이블을 표시하고, 우측 상단에 **복사 버튼**을 제공한다. | SHOULD |
61 | **코드 블록 메타 정보** | — | 코드 블록 상단에 언어명 레이블을 표시하고, 우측 상단에 **복사 버튼**을 제공한다. 아래 상세 규칙 참조. | MUST |
62 62 | **라인 번호** | — | 긴 코드 블록(예: 10줄 이상)에는 좌측에 라인 번호를 표시한다. | MAY |
63 63
64 **코드 블록 복사 버튼 상세 규칙:**
65
66 - **아이콘 전용**: 복사 버튼은 클립보드 아이콘만으로 구성하며, 텍스트 레이블("Copy" 등)을 포함하지 않는다 (MUST NOT). 이는 코드 블록의 시각적 간결함을 유지하기 위함이다.
67 - **위치**: 코드 블록 우측 상단에 배치한다 (MUST). 코드 블록에 마우스를 호버할 때만 표시하거나, 항상 표시하되 낮은 불투명도(예: 40~50%)로 처리하여 코드 가독성을 방해하지 않는다 (SHOULD).
68 - **복사 완료 피드백**: 버튼 클릭 시 사용자에게 복사가 완료되었음을 명확히 전달해야 한다 (MUST). 다음 시각적 피드백을 모두 적용한다:
69 - **아이콘 전환**: 클립보드 아이콘 → 체크마크(✓) 아이콘으로 즉시 전환한다 (MUST). 1.5~2초 후 원래 아이콘으로 복귀한다.
70 - **색상 변화**: 아이콘 색상을 기본 색상 → 녹색 계열(성공 색상)으로 전환한다 (MUST). 아이콘 복귀와 함께 원래 색상으로 돌아간다.
71 - **탄성 애니메이션**: 아이콘 전환 시 스프링(spring) 또는 바운스 애니메이션을 적용하여 시각적 피드백을 강화한다 (SHOULD). 애니메이션 지속 시간은 100~250ms.
72 - **복사 실패 처리**: 클립보드 API가 실패한 경우(권한 거부 등), 아이콘을 경고 아이콘(⚠)으로 전환하고 빨간 계열 색상을 적용한다 (SHOULD).
73
64 74 **B. 블록 요소: 테이블 (Tables)**
65 75
66 76 | 컴포넌트 | 마크다운 구문 | 렌더링 명세 | 지원 수준 |
67 77 | ---------- | ------------------ | ------------------------------------------ | --------- |
68 78 | **테이블** | `\| col \| col \|` | 행과 열이 구분된 테이블 형태로 렌더링한다. | MUST |
94 104 | **인라인 수식** | `$E = mc^2$` | 본문 텍스트 흐름 내에서 수식을 렌더링한다. KaTeX, MathJax 등 사용. | SHOULD |
95 105 | **블록 수식** | `$$\n...\n$$` | 독립된 블록으로 중앙 정렬하여 수식을 렌더링한다. | SHOULD |
96 106
97 107 **D. 다이어그램 (Diagrams)**
98 108
99 | 컴포넌트 | 마크다운 구문 | 렌더링 명세 | 지원 수준 |
100 | ---------------------- | ---------------------- | -------------------------------------------------------------------------------------------------------------------------- | --------- |
101 | **Mermaid 다이어그램** | ` ```mermaid ... ``` ` | Mermaid.js를 사용하여 다이어그램을 SVG 또는 Canvas로 렌더링한다. 렌더링 실패 시 원본 텍스트를 코드 블록으로 폴백 표시한다. | MAY |
109 | 컴포넌트 | 마크다운 구문 | 렌더링 명세 | 지원 수준 |
110 | ---------------------- | ---------------------- | ------------------- | --------- |
111 | **Mermaid 다이어그램** | ` ```mermaid ... ``` ` | 아래 상세 규칙 참조 | SHOULD |
102 112
113 **Mermaid 렌더링 상세 규칙:**
114
115 **뷰 모드**: Mermaid 코드 블록은 다음 세 가지 뷰 모드를 제공해야 한다 (MUST):
116
117 | 뷰 모드 | 표시 내용 | 기본 상태 |
118 | -------------------------- | ------------------------------------------------------------------------- | --------- |
119 | **다이어그램 보기** | 렌더링된 다이어그램만 표시 | 기본값 |
120 | **코드 + 다이어그램 보기** | 원본 Mermaid 코드와 렌더링된 다이어그램을 상하 또는 좌우 분할로 동시 표시 | — |
121 | **코드 보기** | 원본 Mermaid 코드를 구문 하이라이팅 적용된 코드 블록으로 표시 | — |
122
123 뷰 모드 전환은 다이어그램 영역 상단의 탭 또는 토글 버튼으로 제공해야 한다 (MUST). 뷰 모드 전환 시 레이아웃 점프를 최소화해야 한다 (SHOULD).
124
125 **렌더링 에러 처리**: Mermaid 구문 에러로 렌더링이 실패한 경우:
126
127 - 다이어그램 영역에 에러 메시지를 표시해야 한다 (MUST). 에러 메시지는 Mermaid 파서가 반환한 에러 내용(라인 번호, 에러 유형 등)을 포함한다.
128 - 에러 상태에서는 자동으로 **코드 보기** 모드로 전환하고, 에러가 발생한 라인을 강조 표시해야 한다 (SHOULD).
129 - 에러 메시지는 §5.3의 `warning` 심각도 스타일(주황 계열)을 적용하여 다이어그램 영역 상단에 인라인으로 표시한다.
130
131 **다이어그램 색상 가이드**: 렌더링된 다이어그램은 대화 인터페이스의 테마와 조화되어야 한다 (MUST). 다음 색상 원칙을 따른다:
132
133 - **배경**: 투명 또는 대화 영역의 배경과 동일. 다이어그램 전용 배경색을 추가하지 않는다 (MUST NOT).
134 - **노드/요소**: 테마의 `primary` 색상 계열을 기반으로 한다. 라이트 테마에서는 연한 파란 계열(`#E3F2FD` ~ `#BBDEFB`), 다크 테마에서는 어두운 파란 계열(`#1A237E` ~ `#283593`)을 권장한다 (SHOULD).
135 - **텍스트**: 대화 영역의 본문 텍스트 색상(`--color-text-emphasis`)과 동일하게 적용하여 가독성을 확보한다 (MUST).
136 - **연결선/화살표**: 테마의 보조 텍스트 색상(`--color-text-secondary`)을 사용한다 (SHOULD).
137 - **강조 요소**: 상태 다이어그램의 활성 상태, 시퀀스 다이어그램의 현재 참여자 등 강조가 필요한 요소에는 테마의 `accent` 색상을 사용한다. 동시에 3가지 이상의 강조 색상을 사용하지 않는다 (SHOULD NOT).
138 - **색상 수 제한**: 단일 다이어그램에서 사용하는 고유 색상 수는 5개 이내로 제한하여 시각적 복잡도를 낮춘다 (SHOULD). 배경, 노드, 텍스트, 연결선, 강조의 5가지 역할에 각각 1색을 할당한다.
139
140 **다이어그램 크기 제어**:
141
142 - 다이어그램의 최대 너비는 대화 영역의 가용 너비를 초과하지 않는다 (MUST). 초과 시 다이어그램 내부를 가로 스크롤하거나 축소한다.
143 - 다이어그램의 최대 높이를 제한하여 대화 흐름이 과도하게 밀려나지 않도록 한다 (SHOULD). 높이 제한 초과 시 다이어그램 내부를 세로 스크롤한다.
144
145 **다이어그램 확장 보기 (Expanded View)**:
146
147 - 렌더링된 다이어그램 영역을 클릭하면 오버레이(모달) 형태의 **확장 보기**로 진입해야 한다 (MUST). 확장 보기는 뷰포트 기준 최대 크기로 다이어그램을 다시 렌더링하며, 배경에 딤(dim) 처리를 적용한다.
148 - 확장 보기 내에서 핀치 줌 및 드래그 패닝을 지원해야 한다 (SHOULD).
149 - 확장 보기에서도 뷰 모드 전환(다이어그램 보기 / 코드 + 다이어그램 보기 / 코드 보기)을 유지해야 한다 (MUST).
150 - 닫기: `ESC` 키, 배경 영역 클릭, 닫기 버튼 중 하나 이상을 제공해야 한다 (MUST).
151 - 다이어그램 영역에 확장 가능함을 암시하는 시각적 힌트(예: 우측 상단 확장 아이콘, 호버 시 커서 변경)를 제공해야 한다 (SHOULD).
152
103 153 **E. 기타 요소 (Miscellaneous)**
104 154
105 155 | 컴포넌트 | 마크다운 구문 | 렌더링 명세 | 지원 수준 |
106 156 | -------------------- | -------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
107 157 | **이모지** | `:emoji_name:` | GitHub 스타일 이모지 숏코드를 유니코드 이모지로 변환한다. 유니코드 이모지 직접 입력도 올바르게 렌더링해야 한다 (MUST). | SHOULD |
145 195
146 196 **마스킹 처리**: `redacted: true`인 경우 `[사고 내용 생략]` 등의 플레이스홀더로 마스킹하고 (MUST), 펼침 동작 자체를 비활성화한다 (MUST).
147 197
148 198 **다중 사고 블록**: 각 `content_index`별로 독립된 사고 컨테이너를 생성하되, 동시에 두 개 이상의 Thinking Indicator가 활성 상태로 표시되어서는 안 된다 (MUST NOT).
149 199
150 ### 4.5. 도구 호출 결과 렌더링 (Tool Result Rendering)
200 ### 4.5. 도구 가용 상태 및 호출 결과 렌더링 (Tool Status & Result Rendering)
151 201
202 #### 4.5.1. 도구 가용 상태 표시 (Tool Availability Indicator)
203
204 `tool.catalog.publish`(RAWP-DPS 1.0.1 §5.4.1) 수신 시, 각 도구의 `status` 필드에 따라 가용 상태를 시각적으로 구분하여 표시해야 한다 (MUST). 도구 목록을 노출하는 모든 UI(도구 팔레트, 사이드바, 도구 호출 헤더 등)에 적용한다.
205
206 **상태별 시각 표현:**
207
208 | `status` | 시각 표현 | 도구명 스타일 | 상호작용 |
209 | ------------- | ----------------------------------------------- | ---------------------------------------------- | ------------------ |
210 | `available` | 없음 (기본 상태이므로 별도 표시 불필요) | 기본 텍스트 | 정상 사용 가능 |
211 | `unavailable` | 도구명 좌측에 금지 아이콘(🚫) 또는 빨간 점 표시 | 흐린 텍스트(opacity 50%), 취소선 적용 (SHOULD) | 클릭/선택 비활성화 |
212 | `degraded` | 도구명 좌측에 경고 아이콘(⚠) 또는 주황 점 표시 | 기본 텍스트 유지 | 정상 사용 가능 |
213
214 **상태 사유 표시**: 도구의 `status_description` 필드(RAWP-DPS 1.0.1 §5.4.1)가 존재하면, 도구명 하단에 한 줄로 사유를 표시해야 한다 (MUST). `unavailable`이면 연한 빨간 텍스트, `degraded`이면 연한 주황 텍스트로 표시한다. `status_description`이 없으면 사유를 표시하지 않는다 (MUST NOT). 예: `Bash` 아래에 `실행 파일을 찾을 수 없음`.
215
216 **진단 메시지 연동**: `diagnostics` 배열에 해당 도구의 진단(`tool_name` 일치)이 포함된 경우, 도구 항목에 호버 또는 탭 시 진단 메시지를 툴팁으로 표시할 수 있다 (MAY).
217
218 **도구 카탈로그 갱신**: `tool.catalog.publish`가 세션 중 재수신되면, 도구 목록과 상태를 즉시 갱신해야 한다 (MUST). 이전에 `unavailable`이었던 도구가 `available`로 전이되면 금지 표시를 즉시 제거한다.
219
220 #### 4.5.2. 도구 호출 결과 렌더링 (Tool Result Rendering)
221
152 222 **진행 중 표시**: `tool.invoke.request` 수신 시, 도구명과 함께 스피너를 인라인으로 표시해야 한다 (MUST). `tool.invoke.stream` 수신 시에는 실시간 출력을 점진적으로 렌더링해야 한다 (SHOULD).
153 223
154 224 **병렬 도구 그룹화**: 동일한 `parallel_group_id`를 가진 복수의 `tool.invoke.request`는 하나의 그룹 컨테이너로 묶어 표시해야 한다 (SHOULD).
155 225
156 226 **완료 전환**: `tool.invoke.result` 수신 시, 스피너를 즉시 중단하고 `output_type`에 적합한 결과 뷰어로 전환해야 한다 (MUST). 뷰어 매핑:
164 234 | `web_content` | 링크 포함 요약 카드 | 출처 URL 표시 (MUST) |
165 235 | `structured` | JSON 트리 뷰어 또는 전용 위젯 | TodoRead 등은 §4.8 참조 |
166 236 | `empty` | 성공 체크마크 한 줄 | "✅ Write completed" 등 |
167 237 | `agent_result` | 서브에이전트 결과 접이식 블록 | 클릭 시 전체 결과 펼침 (SHOULD) |
168 238
239 **파일 조작 결과 헤더**: `tool.invoke.result`에서 도구가 파일 조작 도구(`category: "filesystem"`, `tool_name` ∈ {Write, Edit, MultiEdit} 또는 동등 도구)인 경우, 결과 헤더에 파일 조작 유형을 명시적으로 표시해야 한다 (MUST):
240
241 | 조작 유형 | 헤더 표시 예시 | 시각적 힌트 |
242 | --------- | ----------------------- | -------------- |
243 | 파일 생성 | `Created: {file_path}` | 녹색 계열 강조 |
244 | 파일 수정 | `Modified: {file_path}` | 기본 색상 |
245 | 파일 삭제 | `Deleted: {file_path}` | 빨간 계열 강조 |
246
247 조작 유형의 판단은 도구의 `tool_name`과 `input` 필드에서 유추한다. 예: `tool_name: "Write"`이면 파일 생성 또는 덮어쓰기, `tool_name: "Edit"`이면 수정.
248
169 249 **에러 결과 표시**: `status`가 `error`, `timeout`, `cancelled`인 경우, 에러 상태를 시각적으로 구분하여 표시해야 한다 (MUST).
170 250
171 251 **접이식 기본 동작**: 도구 결과는 기본적으로 접힌 상태로 표시하되, 결과 요약 한 줄을 노출하고 클릭 시 전체 결과를 펼칠 수 있어야 한다 (SHOULD). 단, `output_type: diff`인 경우에는 기본 펼침 상태를 허용한다 (MAY).
172 252
173 253 ### 4.6. Code Diff 렌더링 (Diff Viewer)
194 274
195 275 **뷰 모드 전환**: Unified View(기본값)와 Side-by-side View를 제공할 것을 권장한다 (SHOULD).
196 276
197 277 **접근성 고려**: 색상과 함께 접두 기호(`-`, `+`)를 항상 가시적으로 유지하고, 선택적으로 아이콘 또는 패턴을 병행 표시할 것을 권장한다 (SHOULD).
198 278
279 **변경 통계 요약 표시**: Diff 헤더 또는 푸터에 변경 통계를 한 줄로 요약 표시해야 한다 (MUST). 형식: `+{추가_라인_수} -{삭제_라인_수}`. 예: `+12 -3`.
280
281 **파일 생성/삭제 배지**:
282
283 - 모든 라인이 `+`(추가)인 Diff는 파일 전체가 신규 생성되었음을 의미한다. Diff 상단에 `New file` 배지를 표시해야 한다 (MUST).
284 - 모든 라인이 `-`(삭제)인 Diff는 파일 전체가 삭제되었음을 의미한다. Diff 상단에 `File deleted` 배지를 표시해야 한다 (MUST).
285 - 배지는 파일 헤더 영역 내에서 파일명과 함께 표시하며, 해당 색상(생성=녹색, 삭제=빨간) 계열의 배경을 적용한다 (SHOULD).
286
287 **라인 수준 추가/삭제 시각화**: `tool.invoke.result`의 `output`에 라인별 추가/삭제 정보가 포함된 경우(구조화 Diff 또는 Unified Diff), 개별 라인의 추가/삭제를 본 절의 라인 수준 색상 구분 규칙(삭제=빨강, 추가=녹색)에 따라 표시해야 한다 (MUST).
288
199 289 ### 4.7. 에이전트 상태 표시 (Agent State Indicator)
200 290
201 291 `agent.state.changed` 이벤트는 에이전트의 내부 상태 전이를 실시간으로 통보한다. 각각 독립된 채팅 메시지로 렌더링해서는 안 된다 (MUST NOT).
202 292
203 293 **단일 인라인 상태 표시줄**: 클라이언트는 에이전트의 현재 상태를 대화 영역의 고정된 단일 위치에 표시하고, 수신 시마다 **제자리 갱신(in-place update)** 해야 한다 (MUST).
225 315
226 316 **계층 구조 지원**: `parent_id`가 존재하는 태스크는 부모 태스크 하위에 들여쓰기하여 트리 구조로 렌더링해야 한다 (SHOULD).
227 317
228 318 **전환 애니메이션**: 태스크 상태 변경 시 부드러운 전환 애니메이션을 적용해야 한다 (SHOULD). 다수의 태스크가 동시에 갱신되는 경우 개별 애니메이션을 생략하고 전체 목록을 일괄 교체할 수 있다 (MAY).
229 319
320 ### 4.9. Turn 내 콘텐츠 순서 보장 (Content Ordering within Turn)
321
322 에이전트의 단일 Turn은 텍스트 블록, 사고 과정, 도구 호출이 교차(interleave)하여 발생할 수 있다. 이 교차 콘텐츠의 렌더링 순서 규칙을 정의한다.
323
324 **수신 순서 렌더링 원칙**: 모든 콘텐츠 블록은 수신 순서대로 대화 영역에 아래로 추가해야 한다 (MUST). 이미 렌더링된 요소의 순서를 재배치(reorder)해서는 안 된다 (MUST NOT).
325
326 **마지막 텍스트 블록 최하단 보장 (Last Text Anchoring)**: 에이전트가 Turn 내에서 마지막으로 생성하는 텍스트 블록(`agent.text.delta` → `agent.text.done`)은 해당 Turn의 시각적 렌더링에서 항상 최하단에 위치해야 한다 (MUST). 이는 수신 순서 렌더링 원칙에 의해 자연스럽게 보장된다 — 마지막 텍스트 블록은 마지막에 수신되므로 최하단에 추가된다.
327
328 **시퀀스 예시:**
329
330 | 수신 순서 | 이벤트 | 렌더링 위치 |
331 | --------- | ---------------------------------- | ----------------------------- |
332 | 1 | `agent.text.delta` (텍스트 A) | 최상단 |
333 | 2 | `tool.invoke.request` (도구 X) | 텍스트 A 아래 |
334 | 3 | `tool.invoke.result` (도구 X 결과) | 도구 X 요청 아래 |
335 | 4 | `agent.text.delta` (텍스트 B) | 도구 X 결과 아래 **(최하단)** |
336
337 텍스트 B가 에이전트의 마지막 텍스트 블록이므로, Turn 완료 시 최하단에 위치한다. 이후 추가 도구 호출 없이 `session.turn.end`가 수신되면, 텍스트 B가 사용자에게 가장 마지막으로 보이는 콘텐츠가 된다.
338
339 **도구 호출로 Turn이 종료되는 경우**: 에이전트가 텍스트 출력 후 도구 호출을 수행하고 추가 텍스트 없이 Turn이 종료되면, 도구 결과가 최하단이 된다. 이는 허용되는 동작이다.
340
341 ### 4.10. 서브에이전트 메시지 렌더링 (Subagent Message Rendering)
342
343 RAWP-DPS 1.0.1 §10의 서브에이전트 위임 규격에 따라, `metadata.subagent_context`가 포함된 메시지의 렌더링 규칙을 정의한다.
344
345 #### 4.10.1. 설계 원칙: 플랫 타임라인 (Flat Timeline)
346
347 서브에이전트 메시지는 메인 에이전트 메시지와 **동일한 플랫 타임라인**에 배치해야 한다 (MUST). 서브에이전트 메시지를 별도의 중첩 컨테이너(박스, 카드, 드롭다운 등)로 감싸서는 안 된다 (MUST NOT). 중첩 컨테이너는 depth가 증가할수록 가용 너비가 줄어들고, 중첩 박스 내부의 코드 블록·diff·테이블 등이 심각하게 훼손된다.
348
349 **서브에이전트 그룹핑**: 동일 서브에이전트 인스턴스(`parent_invocation_id` 기준)의 메시지는 하나의 연속 그룹으로 묶어서 표시해야 한다 (MUST). 여러 서브에이전트가 동시에 실행되어 메시지가 교차 수신되더라도, 클라이언트는 동일 인스턴스의 메시지를 모아서 그룹 단위로 렌더링한다. 이를 위해 수신 순서와 다르게 표시 순서를 재배치할 수 있다 (MAY).
350
351 서브에이전트 메시지와 메인 에이전트 메시지의 구분은 **좌측 보더(left border)** 와 **인라인 출처 라벨(origin label)** 로 표현한다.
352
353 #### 4.10.2. 좌측 보더 구분 (Left Border Indicator)
354
355 `subagent_context`가 포함된 메시지에는 좌측에 수직 보더를 표시하여 메인 에이전트 메시지와 시각적으로 구분해야 한다 (MUST).
356
357 **보더 규칙:**
358
359 - **색상**: 서로 다른 서브에이전트 인스턴스(`parent_invocation_id` 기준)에 각각 고유한 보더 색상을 할당해야 한다 (MUST). 동일 depth라도 서로 다른 서브에이전트는 서로 다른 색상을 사용한다. 예: depth 1의 첫 번째 서브에이전트 = 파란 계열, 두 번째 = 보라 계열, 세 번째 = 청록 계열. 색상 할당은 `parent_invocation_id` 등장 순서에 따라 순환 배정한다. 동일 `parent_invocation_id`의 모든 메시지는 동일한 색상을 사용해야 한다 (MUST).
360 - **너비**: 2~3px의 얇은 세로선. 대화 영역의 가용 너비를 줄이지 않는다.
361 - **위치**: 메시지 좌측 외곽에 배치. 들여쓰기(padding-left)를 추가하지 않는다 (MUST NOT). 보더는 장식적 요소이지 레이아웃을 변경하는 요소가 아니다.
362
363 **메인 에이전트 메시지**: `subagent_context`가 없는 메시지에는 좌측 보더를 표시하지 않는다 (MUST NOT).
364
365 #### 4.10.3. 출처 라벨 (Origin Label)
366
367 서브에이전트 메시지 그룹의 시작 지점에 인라인 출처 라벨을 한 줄로 표시해야 한다 (MUST). 그룹핑(§4.10.1)에 의해 동일 인스턴스의 메시지가 연속으로 배치되므로, 그룹의 첫 메시지에만 출처 라벨을 표시한다.
368
369 **라벨 형식:** `{agent_type}: {description}` 또는 `agent_type`만. `agent_type`이 없으면 `Subagent`. 예: `Explore: 코드 검색 위임`, `Plan`, `Subagent`.
370
371 **라벨 스타일:** 연한 텍스트(muted color), 본문보다 작은 폰트 크기. 좌측 보더와 동일한 색상을 텍스트에 적용해야 한다 (MUST). 라벨은 별도의 컨테이너나 배경색 없이 인라인 텍스트로 표시한다.
372
373 **종료 라벨:** `agent.subagent.ended` 수신 시, 서브에이전트 영역의 마지막에 종료 라벨을 한 줄로 표시해야 한다 (MUST). 형식: `{agent_type} 완료` 또는 `{agent_type} 실패` (`status`에 따라). `duration_ms`가 있으면 소요 시간을 함께 표시한다 (SHOULD). 예: `Explore 완료 (2.3s)`.
374
375 #### 4.10.4. 접기/펼치기
376
377 각 서브에이전트 그룹은 접기/펼치기가 가능해야 한다 (MUST).
378
379 **접힌 상태**: 출처 라벨(§4.10.3)과 종료 라벨(완료된 경우)만 표시하고, 그 사이의 모든 메시지(도구 호출, 텍스트, 사고 과정 등)를 숨긴다. 접힌 영역에 좌측 보더는 유지하여 서브에이전트 범위를 시각적으로 암시한다 (MUST).
380
381 **토글 위치**: 출처 라벨 또는 종료 라벨을 클릭하여 토글한다. 별도의 접기 버튼이나 드롭다운 화살표는 사용하지 않는다 (SHOULD NOT).
382
383 **기본 상태**: 진행 중인 서브에이전트는 펼침, 완료된 서브에이전트는 접힘을 기본으로 한다 (SHOULD).
384
385 #### 4.10.5. 서브에이전트 도구 호출 표시
386
387 - 서브에이전트 내의 도구 호출은 플랫 타임라인에서 좌측 보더가 표시된 채로 수신 순서에 따라 표시한다 (MUST). §4.5.2와 동일한 UI 컴포넌트를 사용한다.
388 - 서브에이전트 내의 모든 도구 호출 및 결과에 **소속 에이전트 라벨**을 표시해야 한다 (MUST). 라벨 색상은 해당 서브에이전트의 보더 색상과 동일하게 적용한다. 이를 통해 여러 서브에이전트의 도구 호출이 교차 수신될 때에도 각 호출의 소속을 즉시 식별할 수 있다.
389 - `subagent` 필드가 포함된 `tool.invoke.request`(서브에이전트를 호출하는 도구 자체)는 일반 도구 호출과 시각적으로 구분해야 한다 (MUST). 예: 도구명 옆에 `Subagent` 배지 또는 전용 아이콘.
390
391 #### 4.10.6. 동시 실행 그룹핑 (Concurrent Grouping)
392
393 여러 서브에이전트가 동시에 실행될 때의 렌더링 규칙을 정의한다.
394
395 **인스턴스 식별**: 클라이언트는 `parent_invocation_id`를 기준으로 각 서브에이전트 인스턴스를 식별하고, 동시에 활성 상태인 인스턴스 수만큼 고유한 보더 색상을 할당해야 한다 (MUST). 색상 팔레트가 소진되면 순환 재사용한다.
396
397 **그룹 단위 렌더링**: 여러 서브에이전트의 메시지가 교차 수신되더라도, 클라이언트는 동일 `parent_invocation_id`의 메시지를 하나의 연속 그룹으로 모아서 렌더링해야 한다 (MUST). 이를 위해 수신 순서와 다르게 표시 순서를 재배치할 수 있다 (MAY). 각 그룹은 출처 라벨(§4.10.3)로 시작하고, 완료된 경우 종료 라벨로 끝난다.
398
399 **그룹 배치 순서**: 서브에이전트 그룹의 배치 순서는 해당 인스턴스의 **첫 번째 메시지 수신 시각** 기준으로 정렬한다 (SHOULD). 먼저 시작된 서브에이전트의 그룹이 상단에 위치한다.
400
401 **그룹별 접기/펼치기**: 각 서브에이전트 그룹은 독립적으로 접기/펼치기가 가능해야 한다 (MUST). §4.10.4의 규칙을 따른다. 사용자는 관심 있는 서브에이전트만 펼쳐서 확인하고, 나머지는 접어 둘 수 있다.
402
403 #### 4.10.7. 서브에이전트 미지원 폴백
404
405 - `subagent_context`가 없거나 `null`인 메시지는 좌측 보더 없이 플랫하게 표시해야 한다 (MUST). 이것이 서브에이전트 미지원 에이전트의 기본 동작이다.
406 - `output_type: "agent_result"`인 `tool.invoke.result`는 `subagent_context` 없이도 서브에이전트 결과임을 암시한다. 이 경우 해당 tool request/result 쌍을 "서브에이전트 호출"로 표시할 수 있다 (MAY). 단, 내부 메시지의 좌측 보더 구분은 불가능하다.
407
230 408 ---
수정됨

5. 시스템 메시지 (System Message)

추가된 줄 69 삭제된 줄 0
44 44 | `warning` | 주황/노랑 계열 아이콘, 텍스트는 기본 색상 유지 | `⚠ 연결이 불안정합니다` |
45 45 | `fatal` | 빨강 계열 아이콘, 텍스트도 강조 색상 적용 | `❌ 세션이 비정상 종료되었습니다` |
46 46
47 47 **에러 상세 정보**: 에러 메시지에 기술적 상세가 포함되는 경우, §5.1의 드롭다운 패턴을 적용하여 요약 행 + 접이식 상세 영역으로 구성한다 (MUST).
48 48
49 ### 5.4. 세션 이벤트 메시지 (Session Event Messages)
50
51 세션 수준의 상태 변경 이벤트(`session.renamed`, `session.deleted`)는 시스템 메시지로 대화 이력에 삽입하여 사용자에게 상태 변화를 명시적으로 전달해야 한다 (MUST). §5.1의 레이아웃 원칙(중앙 정렬, 생략 금지, 시각적 비중 최소화)을 따른다.
52
53 #### 5.4.1. 세션 이름 변경 (`session.renamed`)
54
55 RAWP-DPS 1.0.1 §7.6.1의 `session.renamed` 이벤트 수신 시, 대화 이력에 시스템 메시지를 삽입해야 한다 (MUST).
56
57 **렌더링 규격:**
58
59 - **메시지 형식**: `세션 이름이 "{previous_name}"에서 "{name}"으로 변경되었습니다` 형태로 표시한다. `previous_name`이 없으면 `세션 이름이 "{name}"(으)로 변경되었습니다`로 표시한다.
60 - **심각도**: `info` 수준. §5.3의 `info` 스타일(연한 텍스트)을 적용한다.
61 - **대화 이력 기록**: 영구적 항목으로 대화 이력에 기록한다. 세션 재연결 시에도 표시되어야 한다.
62 - **변경 주체 표시**: `renamed_by` 값에 따라 변경 주체를 괄호 안에 부기할 수 있다 (MAY). 예: `세션 이름이 "작업 A"(으)로 변경되었습니다 (원격)`.
63 - **UI 제목 반영**: 대화 창의 제목 표시줄 또는 세션 목록에 세션 이름이 표시되는 경우, 해당 영역도 즉시 갱신해야 한다 (MUST).
64
65 #### 5.4.2. 세션 종료 (`session.deleted`)
66
67 RAWP-DPS 1.0.1 §7.7.1의 `session.deleted` 이벤트 수신 시, 대화 이력에 시스템 메시지를 삽입하고 세션의 종료 상태를 시각적으로 확정해야 한다 (MUST).
68
69 **렌더링 규격:**
70
71 - **`reason`별 메시지:**
72
73 | `reason` | 시스템 메시지 예시 | 심각도 |
74 | ---------------- | ---------------------------------------- | --------- |
75 | `user_request` | `세션이 종료되었습니다` | `info` |
76 | `master_request` | `세션이 원격에서 종료되었습니다` | `info` |
77 | `timeout` | `연결 시간 초과로 세션이 종료되었습니다` | `warning` |
78 | `error` | `오류로 인해 세션이 종료되었습니다` | `fatal` |
79
80 - **심각도별 스타일**: §5.3의 심각도별 시각 차등 규칙을 적용한다.
81 - **입력 비활성화**: 세션 종료 메시지 표시 후, 입력창을 비활성화하거나 "세션이 종료되었습니다" 플레이스홀더를 표시하여 추가 입력이 불가능함을 명확히 해야 한다 (MUST).
82 - **에이전트 상태 정리**: §4.7의 에이전트 상태 표시줄이 활성 상태이면 즉시 제거해야 한다 (MUST).
83 - **진행 중 항목 시각 전환**: 세션 종료 시점에 진행 중이었던 도구 호출 스피너(§4.5.2)가 존재하면, 스피너를 중단하고 `cancelled` 상태로 전환하여 표시해야 한다 (MUST). 이는 RAWP-DPS 1.0.1 §7.5.3에서 발송되는 `tool.invoke.result` (status: `"cancelled"`) 수신과 연동된다.
84 - **대화 이력 기록**: 영구적 항목으로 대화 이력에 기록한다.
85
86 ### 5.5. 연결 단절 및 복구 피드백 (Disconnect & Recovery Feedback)
87
88 WSS Connection이 비정상 종료되거나 재연결에 성공한 경우의 렌더링 규칙을 정의한다. RAWP-DPS 1.0.1 §7.8의 Finalization/Unfinalization 절차와 연동된다.
89
90 #### 5.5.1. 연결 단절 시 렌더링 (Finalization)
91
92 WSS 단절이 감지되면(RAWP-DPS 1.0.1 §7.8.2) 다음을 수행해야 한다 (MUST):
93
94 **시스템 메시지 삽입**: `⚠ 연결이 끊어졌습니다`를 §5.3의 `warning` 심각도 스타일로 대화 이력에 삽입한다. 영구적 항목으로 기록한다.
95
96 **스트리밍 텍스트 중단**: 활성 스트리밍 중이던 텍스트(`agent.text.delta`)는 수신된 지점까지 확정하고, 하단 경계 효과(§4.3)를 즉시 제거한다 (MUST). 텍스트 끝에 시각적 절단 표시(예: `…` 또는 흐린 경계선)를 추가하여 텍스트가 완전하지 않음을 나타낼 수 있다 (MAY).
97
98 **도구 호출 스피너 전환**: 진행 중이던 도구 호출 스피너를 즉시 중단하고, `cancelled` 상태 표시(§4.5.2의 에러 결과 표시)로 전환해야 한다 (MUST). 합성된 cancelled 결과(RAWP-DPS 1.0.1 §7.8.1의 `synthetic: true`)는 연한 회색 텍스트로 `연결 끊김으로 취소됨` 등의 메시지를 표시한다.
99
100 **사고 과정 중단**: 활성 Thinking Indicator(§4.4)를 즉시 중단하고 접힌 상태로 전환해야 한다 (MUST).
101
102 **에이전트 상태 표시줄 제거**: §4.7의 상태 표시줄을 즉시 제거하고 입력 가능 상태로 복원해야 한다 (MUST).
103
104 **상호작용 요청 폐기**: 활성 상태인 상호작용 UI(승인 버튼, 선택 팝업 등)를 즉시 닫고, 해당 영역에 `연결 끊김으로 취소됨`을 표시해야 한다 (MUST).
105
106 #### 5.5.2. 재연결 시 렌더링 (Unfinalization)
107
108 WSS 재연결이 성공하고 `session.history`(RAWP-DPS 1.0.1 §7.1.1)를 수신하면 다음을 수행해야 한다 (MUST):
109
110 **시스템 메시지 삽입**: `ℹ 연결이 복구되었습니다`를 §5.3의 `info` 심각도 스타일로 대화 이력에 삽입한다.
111
112 **합성 블록 제거**: Finalization에서 삽입한 합성 cancelled 결과(`synthetic: true`)를 제거하고, `session.history`의 실제 프레임으로 대체한다 (MUST).
113
114 **스트리밍 재개**: `session.history` 재생 후 에이전트가 응답을 계속 생성 중이면(새 `agent.text.delta` 수신), 스트리밍 렌더링을 정상 재개한다.
115
116 **복구 불가 시**: `session.history`의 `buffer_status.truncated`가 `true`이면, `⚠ 일부 메시지가 유실되었습니다`를 `warning` 심각도로 추가 표시해야 한다 (MUST). 합성 블록은 제거하지 않고 유지한다.
117
49 118 ---
수정됨

부록: 관련 규격 문서

추가된 줄 2 삭제된 줄 2
1 1 ## 부록: 관련 규격 문서
2 2
3 3 | 문서 | 설명 |
4 4 | ----------------------- | --------------------------------------------------------------------------- |
5 | **RAWP 1.0** | 원격 에이전트 제어 프로토콜 (상위 규격). 본 문서의 상위 문서. |
6 | **RAWP-DPS 1.0** | 데이터 평면 스트리밍 규격. 본 문서가 참조하는 이벤트 타입 및 페이로드 정의. |
5 | **RAWP 1.0.2** | 원격 에이전트 제어 프로토콜 (상위 규격). 본 문서의 상위 문서. |
6 | **RAWP-DPS 1.0.1** | 데이터 평면 스트리밍 규격. 본 문서가 참조하는 이벤트 타입 및 페이로드 정의. |
7 7 | **RAWP-DPS-0.1-Legacy** | 데이터 평면 스트리밍 규격 (단종 예고). 레거시 호환용. |