1.0.3 변경 이력 1.0.2 기준

변경 이력

RAWP 1.0.3

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

수정됨

Document Overview

추가된 줄 2 삭제된 줄 2
1 1 # RAWP 1.0: Remote Agent Wire Protocol
2 2
3 3 | 항목 | 값 |
4 4 | ---------------------- | ------------------ |
5 5 | 상태 | Stable |
6 | 버전 | 1.0.2 |
6 | 버전 | 1.0.3 |
7 7 | 데이터 평면 규격 | **RAWP-DPS 1.0.1** |
8 | 클라이언트 렌더링 규격 | **RAWP-CRS 1.0.1** |
8 | 클라이언트 렌더링 규격 | **RAWP-CRS 1.0.2** |
9 9
10 10 ---
수정됨

4. Phase 2: 제어 및 모니터링 인터페이스 (Master → Client HTTP)

추가된 줄 132 삭제된 줄 9
229 229 "enum_values": ["String (선택, type이 'enum'일 때 허용 값 목록)"],
230 230 "description": "String (선택, 옵션 설명)"
231 231 }
232 232 ],
233 233 "single_turn_process": "Boolean (선택, 기본값 false. RAWP-DPS 1.0.1 §18 참조)",
234 "description": "String (선택, 에이전트 설명)"
234 "description": "String (선택, 에이전트 설명)",
235 "allowed_directories": [
236 "String (선택, 에이전트가 실행 가능한 디렉토리 경로 목록)"
237 ],
238 "extensions": "Object (선택, 구현체별 확장 메타데이터를 위한 열린 객체)"
235 239 }
236 240 ]
237 241 }
238 242 ```
239 243
240 244 `type: "builtin"`은 클라이언트에 사전 탑재된 에이전트, `type: "custom"`은 사용자가 등록한 커스텀 에이전트를 의미한다. `models` 배열이 비어 있으면 에이전트가 모델 선택을 지원하지 않음을 의미한다.
241 245
242 #### 4.3.1. 에이전트 상세 조회
246 `allowed_directories`는 에이전트가 작업 가능한 디렉토리 경로의 목록이다. 미지정 시 디렉토리 제한이 없음을 의미한다. `extensions`는 프로토콜에 정의되지 않은 구현체별 메타데이터를 전달하기 위한 열린 객체이며, §1.3의 필드 무시 원칙을 따른다.
243 247
248 #### 4.3.1. 에이전트 동기화 프로토콜 (Agent Synchronization)
249
250 클라이언트가 보유한 에이전트 목록을 마스터 서버에 체계적으로 동기화하기 위한 프로토콜이다.
251
252 ##### A) 클라이언트 → 마스터 에이전트 보고 (Push)
253
254 클라이언트가 자신의 에이전트 목록을 마스터 서버에 전체 교체(Full Replacement) 방식으로 푸시한다.
255
256 **Endpoint**: `PUT /v1/nodes/agents` (Master Server 제공)
257
258 **Request** (Client → Master):
259
260 ```json
261 {
262 "agents": ["Object (§4.3의 에이전트 스키마 배열)"]
263 }
264 ```
265
266 **Response**: `204 No Content`
267
268 **트리거 조건**: 클라이언트는 다음 시점에 에이전트 목록을 보고해야 한다 (MUST):
269
270 - 페어링 완료(§3.3) 직후 초기 보고
271 - 에이전트 추가, 수정, 삭제 시
272 - 구현체가 정의한 주기적 갱신 시점
273
274 **버전 관리**: 에이전트 동기화는 §4.1의 Config Scope와 달리 `config_version` 기반 버전 관리를 사용하지 않는다. 매 요청이 전체 교체이며, 마스터는 수신한 목록으로 기존 캐시를 덮어쓴다.
275
276 ##### B) 마스터 → 클라이언트 에이전트 요청 (Pull)
277
278 마스터 서버가 최신 에이전트 목록이 필요할 때, 기존 `GET /v1/agents`(§4.3) 엔드포인트를 온디맨드로 호출하여 클라이언트로부터 직접 조회한다.
279
280 **트리거 조건**: 세션 생성(§5.1) 시 에이전트 캐시 미스, 엣지의 에이전트 목록 요청(§9.2 하위) 수신 시 등 마스터가 최신 정보를 확보해야 하는 시점에 호출한다.
281
282 ##### C) 에이전트 삭제 시 세션 전파 (MUST)
283
284 클라이언트에서 에이전트가 삭제(§4.3.5)되면, 클라이언트는 해당 에이전트로 생성된 모든 활성 세션(`INIT`, `RUNNING`, `DETACHED` 상태)을 종료하고, 연결된 모든 마스터 서버에 해당 세션들이 삭제되었음을 전파해야 한다 (MUST). 세션 종료는 §5.2의 절차를 따르며, `session.deleted` WSS 알림 의무도 동일하게 적용된다. 클라이언트는 모든 관련 세션의 삭제 전파가 완료된 후에만 에이전트 삭제를 확정해야 한다 (MUST). 즉, 에이전트 레코드 제거는 세션 전파 완료 이후에 수행되어야 하며, 세션 전파가 실패한 경우 에이전트 삭제를 중단해야 한다.
285
286 #### 4.3.2. 에이전트 상세 조회
287
244 288 **Endpoint**: `GET /v1/agents/{agent_id}` (Local Client 제공)
245 289
246 290 **Response (200 OK)**: §4.3의 `agents` 배열 내 단일 에이전트 객체와 동일한 스키마.
247 291
248 292 **에러**: 존재하지 않는 `agent_id` 시 `404 Not Found`.
249 293
250 #### 4.3.2. 커스텀 에이전트 등록
294 #### 4.3.3. 커스텀 에이전트 등록
251 295
252 296 **Endpoint**: `POST /v1/agents` (Local Client 제공)
253 297
254 298 **Request**:
255 299
269 313
270 314 **Response (201 Created)**: 생성된 에이전트 객체 (`type: "custom"`, `is_active: true`).
271 315
272 316 **제약 조건**: `name`이 기존 에이전트와 중복되면 `409 Conflict`를 반환한다 (MUST).
273 317
274 #### 4.3.3. 커스텀 에이전트 수정
318 #### 4.3.4. 커스텀 에이전트 수정
275 319
276 320 **Endpoint**: `PATCH /v1/agents/{agent_id}` (Local Client 제공)
277 321
278 **Request**: §4.3.2의 필드 중 변경할 필드만 포함. `type: "builtin"` 에이전트는 수정할 수 없다 (MUST NOT). 시도 시 `403 Forbidden`.
322 **Request**: §4.3.3의 필드 중 변경할 필드만 포함. `type: "builtin"` 에이전트는 수정할 수 없다 (MUST NOT). 시도 시 `403 Forbidden`.
279 323
280 324 **Response (200 OK)**: 수정된 에이전트 객체.
281 325
282 #### 4.3.4. 커스텀 에이전트 삭제
326 #### 4.3.5. 커스텀 에이전트 삭제
283 327
284 328 **Endpoint**: `DELETE /v1/agents/{agent_id}` (Local Client 제공)
285 329
286 330 **제약 조건**: `type: "builtin"` 에이전트는 삭제할 수 없다 (MUST NOT). 시도 시 `403 Forbidden`. 해당 에이전트에 활성 세션이 존재하면 `409 Conflict`를 반환한다 (MUST).
287 331
288 332 **Response**: `204 No Content`.
289 333
290 #### 4.3.5. 에이전트 활성화/비활성화
334 #### 4.3.6. 에이전트 활성화/비활성화
291 335
292 336 **Endpoint**: `PATCH /v1/agents/{agent_id}/status` (Local Client 제공)
293 337
294 338 **Request**: `{"is_active": "Boolean (필수)"}`
295 339
296 340 **Response (200 OK)**: `{"id": "String", "is_active": "Boolean"}`
297 341
298 비활성화된 에이전트(`is_active: false`)는 `GET /v1/agents` 목록에 포함되지만, 세션 초기화(§5.1)에서 해당 `agent_name` 사용이 거부된다 (MUST). 거부 시 `400 Bad Request` (error_code: `"AGENT_INACTIVE"`).
342 비활성화된 에이전트(`is_active: false`)는 `GET /v1/agents` 목록에 포함되지만, 세션 초기화(§5.1)에서 해당 `agent_id` 사용이 거부된다 (MUST). 거부 시 `400 Bad Request` (error_code: `"AGENT_INACTIVE"`).
299 343
300 344 ### 4.4. 파일 탐색 (Directory Browsing)
301 345
302 인가된 작업 경로 내의 디렉토리를 조회한다.
346 인가된 작업 경로 내의 디렉토리를 조회한다. 세션 내 작업 경로 탐색은 본 절을, 세션 생성 전 파일시스템 브라우징은 §4.5를 참조한다.
303 347
304 348 **Endpoint**: `POST /v1/fs/list` (Local Client 제공)
305 349
306 350 **Request**: `{"target_path": "String (필수, 조회할 절대 경로)"}`
307 351
352 ### 4.5. 파일시스템 브라우징 (Filesystem Browsing)
353
354 세션 생성 전에 마스터가 클라이언트의 파일시스템을 탐색하여 작업 디렉토리(`workspace_path`)를 선택하기 위한 엔드포인트다. §4.4의 `POST /v1/fs/list`는 세션 내 인가된 작업 경로 탐색 용도이며, 본 엔드포인트는 세션 생성 이전 단계에서 사용한다.
355
356 **Endpoint**: `POST /v1/fs/browse` (Local Client 제공)
357
358 **Request**:
359
360 ```json
361 {
362 "agent_id": "String (필수, §4.3 에이전트 식별자)",
363 "path": "String (선택, 탐색할 절대 경로. 생략 시 루트 탐색)",
364 "include_files": "Boolean (선택, 기본값 true)",
365 "include_hidden": "Boolean (선택, 기본값 false)"
366 }
367 ```
368
369 **깊이 규칙**:
370
371 | 조건 | 깊이 | 동작 |
372 | -------------------------- | ---- | ------------------------------------------------------------------- |
373 | `path` 생략 또는 빈 문자열 | 2 | `allowed_directories` 루트 (미설정 시 OS 루트) 기준 2레벨 자식 반환 |
374 | `path` 지정 | 3 | 해당 경로 기준 3레벨 자식 반환 |
375
376 **Response (200 OK)**:
377
378 ```json
379 {
380 "agent_id": "String (필수)",
381 "base_path": "String (필수, 루트 모드 시 빈 문자열)",
382 "os_type": "String (필수, 'unix' | 'windows')",
383 "entries": [
384 {
385 "name": "String (필수, 항목 이름)",
386 "path": "String (필수, 절대 경로)",
387 "type": "String (필수, 'directory' | 'file' | 'symlink_directory' | 'symlink_file')",
388 "size": "Number (선택, 파일만. 바이트 단위)",
389 "modified_at": "String (선택, ISO 8601)",
390 "readable": "Boolean (필수, OS 읽기 권한 보유 여부)",
391 "children": ["Entry (선택, 디렉토리만. 재귀 구조)"],
392 "truncated": "Boolean (선택, 자식 목록 잘림 여부)",
393 "total_children_count": "Number (선택, 잘림 시 실제 자식 수)",
394 "error": "String (선택, OS 에러 메시지)"
395 }
396 ],
397 "truncated": "Boolean (필수, 최상위 항목 목록 잘림 여부)",
398 "total_entries_count": "Number (선택, 잘림 시 실제 항목 수)"
399 }
400 ```
401
402 **권한 모델**:
403
404 - `allowed_directories`(§4.3) 범위 밖 경로 요청 시 `403 Forbidden` (`PATH_NOT_ALLOWED`)을 반환해야 한다 (MUST).
405 - `path`가 `allowed_directories`의 조상 경로인 경우, `allowed_directories`로 이어지는 디렉토리만 필터링하여 노출해야 한다 (MUST). 범위 밖 항목은 응답에 포함하지 않는다.
406 - 요청한 `path` 자체에 OS 읽기 권한이 없으면 `403 Forbidden` (`PATH_NOT_READABLE`)을 반환해야 한다 (MUST).
407 - 미등록 `agent_id` → `404 Not Found` (`AGENT_NOT_FOUND`).
408 - 비활성 에이전트(`is_active: false`) → `400 Bad Request` (`AGENT_INACTIVE`).
409
410 **엣지 케이스**:
411
412 - **심링크**: `symlink_directory`/`symlink_file` 타입으로 구분한다. 심링크가 `allowed_directories` 범위 밖을 가리키면 `readable: false`로 표시해야 한다 (MUST). 순환 심링크 감지 시 해당 항목의 `error`에 원인을 명시하고 자식 탐색을 중단해야 한다 (MUST).
413 - **숨김 항목**: `include_hidden: false`(기본값) 시 `.`으로 시작하는 항목을 제외한다.
414 - **정렬**: 디렉토리 우선, 이름 사전순 (대소문자 무시).
415 - **Truncation**: 디렉토리당 최대 500개 항목. 초과 시 `truncated: true`와 `total_children_count`(또는 최상위의 `total_entries_count`)를 설정한다.
416 - **타임아웃**: 10초 내 응답해야 하며 (MUST), 초과 시 수집된 부분 결과를 `truncated: true`로 반환한다.
417 - **Windows**: `os_type: "windows"`, 드라이브 문자 루트(`C:\` 등), `\` 경로 구분자를 사용한다.
418
419 **에러 응답**:
420
421 | HTTP 상태 | error_code | 조건 |
422 | --------- | ------------------- | ------------------------------------ |
423 | 400 | `INVALID_PATH` | 유효하지 않은 경로 형식 |
424 | 400 | `AGENT_INACTIVE` | 비활성 에이전트 |
425 | 403 | `PATH_NOT_ALLOWED` | `allowed_directories` 범위 밖 |
426 | 403 | `PATH_NOT_READABLE` | 요청 `path` 자체에 OS 읽기 권한 없음 |
427 | 404 | `AGENT_NOT_FOUND` | 에이전트 미존재 |
428 | 404 | `PATH_NOT_FOUND` | 경로 미존재 |
429 | 500 | `FS_ERROR` | 파일시스템 에러 |
430
308 431 ---
수정됨

5. Phase 3: 세션 라이프사이클 및 연결 (Session & I/O)

추가된 줄 57 삭제된 줄 1
11 11 **Request**:
12 12
13 13 ```json
14 14 {
15 15 "session_id": "String (필수, UUID v4)",
16 "agent_name": "String (reattach: false 시 필수)",
16 "agent_id": "String (reattach: false 시 필수)",
17 17 "workspace_path": "String (reattach: false 시 필수)",
18 18 "ticket": "String (필수, WSS 연결 인증용 난수 티켓)",
19 19 "reattach": "Boolean (선택, 기본값 false. true 시 기존 구동 중 프로세스 바인딩)",
20 20 "last_sync_timestamp": "String (선택, ISO 8601)",
21 21 "last_message_id": "String (선택, UUID)"
90 90
91 91 **Request/Response**: §5.4.1과 동일한 스키마.
92 92
93 93 HTTP 응답 후, 클라이언트는 해당 세션에 바인딩된 모든 WSS Connection에 `session.renamed` 이벤트를 발송해야 한다 (MUST).
94 94
95 ### 5.5. 세션 동기화 프로토콜 (Session Synchronization)
96
97 클라이언트가 보유한 열려있는 세션 목록을 마스터 서버에 체계적으로 동기화하기 위한 프로토콜이다. §4.3.1의 에이전트 동기화와 동일한 Push/Pull 패턴을 적용한다.
98
99 #### A) 클라이언트 → 마스터 세션 보고 (Push)
100
101 클라이언트가 자신의 활성 세션 목록을 마스터 서버에 전체 교체(Full Replacement) 방식으로 푸시한다.
102
103 **Endpoint**: `PUT /v1/nodes/sessions` (Master Server 제공)
104
105 **Request** (Client → Master):
106
107 ```json
108 {
109 "sessions": [
110 {
111 "session_id": "String (필수, UUID v4)",
112 "session_name": "String (필수)",
113 "agent_id": "String (필수)",
114 "workspace_path": "String (필수)",
115 "status": "String (필수, 'INIT' | 'RUNNING' | 'DETACHED')",
116 "origin": "String (필수, §10.3 참조)",
117 "created_at": "String (필수, ISO 8601)",
118 "last_activity_at": "String (필수, ISO 8601)",
119 "total_turns": "Number (필수)"
120 }
121 ]
122 }
123 ```
124
125 **Response**: `204 No Content`
126
127 **트리거 조건**: 클라이언트는 다음 시점에 세션 목록을 보고해야 한다 (MUST):
128
129 - 페어링 완료(§3.3) 직후 초기 보고
130 - 세션 생성, 종료, 상태 변경 시
131 - 구현체가 정의한 주기적 갱신 시점
132
133 **디렉토리 필터링 (MUST)**: 클라이언트가 복수의 마스터에 연결된 경우, 각 마스터의 관할 디렉토리 범위에 해당하는 세션(`workspace_path` 기준)만 필터링하여 전달해야 한다. 관할 디렉토리 설정 방식은 프로토콜 범위 밖이다.
134
135 **버전 관리**: 세션 동기화는 §4.1의 Config Scope와 달리 `config_version` 기반 버전 관리를 사용하지 않는다. 매 요청이 전체 교체이며, 마스터는 수신한 목록으로 기존 캐시를 덮어쓴다.
136
137 `TERMINATED` 상태의 세션은 목록에 포함하지 않는다 (MUST NOT).
138
139 #### B) 마스터 → 클라이언트 세션 요청 (Pull)
140
141 마스터 서버가 최신 세션 목록이 필요할 때 온디맨드로 호출한다.
142
143 **Endpoint**: `GET /v1/sessions` (Local Client 제공)
144
145 **트리거 조건**: 엣지의 노드별 세션 조회 요청(§9.2.5) 수신 시 캐시 미스, 마스터가 최신 정보를 확보해야 하는 시점에 호출한다.
146
147 **Response (200 OK)**: Push의 `sessions` 스키마와 동일한 배열을 반환한다.
148
149 이 엔드포인트는 마스터 전용이며, 마스터의 관할 디렉토리에 따른 필터링은 클라이언트가 수행한다.
150
95 151 ---
수정됨

7. 보안 및 예외 처리 (Security & Errors)

추가된 줄 2 삭제된 줄 2
25 25 | `500 Internal Server Error` | 내부 파일 시스템 오류, 바인딩 충돌 등. |
26 26 | `503 Service Unavailable` | 초기 설정 동기화 미완료 상태에서 세션 초기화 시도 (§4.1.2). |
27 27
28 28 ### 7.2. 보안 제약 및 필수 보호 장치 (MUST)
29 29
30 - **경로 검증 (Path Normalization)**: 클라이언트는 모든 파일/디렉토리 조회 요청 시 경로 내 `../` 등을 정규화하고 인가된 `workspace_path` 범위 내인지 반드시 검증해야 한다 (Directory Traversal 방어).
31 - **명령어 및 에이전트 보호 (Whitelisting)**: 활성화된 `agent_name`에 매핑된 명령어만 실행 가능해야 하며, 임의의 쉘 스크립트나 바이너리를 원격으로 주입받아 실행하는 시도는 차단해야 한다 (RCE 방어).
30 - **경로 검증 (Path Normalization)**: 클라이언트는 모든 파일/디렉토리 조회 요청 시 경로 내 `../` 등을 정규화하고 인가된 `workspace_path` 범위 내인지 반드시 검증해야 한다 (Directory Traversal 방어). 세션 외 파일시스템 브라우징(§4.5) 시에도 `allowed_directories` 범위를 동일하게 적용해야 한다 (MUST).
31 - **명령어 및 에이전트 보호 (Whitelisting)**: 활성화된 `agent_id`에 매핑된 명령어만 실행 가능해야 하며, 임의의 쉘 스크립트나 바이너리를 원격으로 주입받아 실행하는 시도는 차단해야 한다 (RCE 방어).
32 32 - **버퍼 관리 및 OOM 방어**: WSS 단절 중 자식 프로세스를 유지할 때 발생하는 출력은 버퍼에 저장하되, `max_buffer_size`에 도달하면 반드시 사전에 합의된 `buffer_overflow_policy`(RING/DROP)에 따라 강제로 메모리를 관리하여 게이트웨이 다운을 방지해야 한다.
33 33 - **도구 호출 보안**: RAWP-DPS 1.0.1 적용 시, `tool.catalog.publish`에서 고지된 도구만 `tool.invoke.request`에 사용 가능하며, 고지되지 않은 도구의 호출 요청은 클라이언트가 거부해야 한다 (MUST). 자세한 도구 보안 규칙은 RAWP-DPS 1.0.1 §15를 참조한다.
34 34
35 35 ### 7.3. Rate Limiting
36 36
수정됨

9. Edge Node API (사용자 접점 통신 규약)

추가된 줄 77 삭제된 줄 3
300 300 }
301 301 ```
302 302
303 303 이 엔드포인트는 Pull 방식으로 최신 설정을 확인하기 위한 것이다. 실시간 Push 알림은 §9.4.4를 참조한다.
304 304
305 #### 9.2.4. 노드 에이전트 목록 조회 (Node Agent List)
306
307 엣지 노드가 특정 로컬 머신의 에이전트 목록을 마스터 서버를 통해 조회한다.
308
309 **Endpoint:** `GET /v1/edge/nodes/{node_id}/agents` (Master Server 제공)
310
311 **Response (200 OK):**
312
313 ```json
314 {
315 "node_id": "String (필수)",
316 "agents": ["Object (§4.3의 에이전트 스키마와 동일)"]
317 }
318 ```
319
320 마스터 서버는 §4.3.1의 에이전트 동기화 프로토콜을 통해 캐시한 에이전트 목록을 반환한다. 캐시가 존재하지 않거나 마스터가 최신 정보를 확보해야 한다고 판단하면, 대상 클라이언트의 `GET /v1/agents`(§4.3)를 호출하여 갱신한 후 응답해야 한다 (MUST).
321
322 **에러**: 해당 `node_id`의 노드가 존재하지 않거나 `offline` 상태이면 `404 Not Found`를 반환한다.
323
324 #### 9.2.5. 노드 세션 목록 조회 (Node Session List)
325
326 엣지 노드가 특정 로컬 머신의 세션 목록을 마스터 서버를 통해 조회한다.
327
328 **Endpoint:** `GET /v1/edge/nodes/{node_id}/sessions` (Master Server 제공)
329
330 **Response (200 OK):**
331
332 ```json
333 {
334 "node_id": "String (필수)",
335 "sessions": ["Object (§5.5의 세션 스키마와 동일)"]
336 }
337 ```
338
339 마스터 서버는 §5.5의 세션 동기화 프로토콜을 통해 캐시한 해당 노드의 세션 목록을 반환한다. 캐시가 존재하지 않거나 마스터가 최신 정보를 확보해야 한다고 판단하면, 대상 클라이언트의 `GET /v1/sessions`(§5.5)를 호출하여 갱신한 후 응답해야 한다 (MUST).
340
341 **§9.3.2와의 차이**: §9.3.2(`GET /v1/edge/sessions`)는 사용자 계정 기준으로 모든 노드에 걸친 전체 세션을 조회하는 반면, 본 엔드포인트는 특정 노드 기준으로 해당 머신의 세션(로컬 세션 포함)을 조회한다.
342
343 **에러**: 해당 `node_id`의 노드가 존재하지 않거나 `offline` 상태이면 `404 Not Found`를 반환한다.
344
345 #### 9.2.6. 노드 파일시스템 브라우징 (Node Filesystem Browsing)
346
347 엣지 노드가 특정 로컬 머신의 파일시스템을 마스터 서버를 통해 탐색한다. 세션 생성(§9.3.1) 전 `workspace_path` 선택에 사용한다.
348
349 **Endpoint:** `POST /v1/edge/nodes/{node_id}/fs/browse` (Master Server 제공)
350
351 **Request:** §4.5의 Request 스키마와 동일하다.
352
353 **Response (200 OK):**
354
355 ```json
356 {
357 "node_id": "String (필수)",
358 "agent_id": "String (필수)",
359 "base_path": "String (필수, 루트 모드 시 빈 문자열)",
360 "os_type": "String (필수, 'unix' | 'windows')",
361 "entries": ["Entry (§4.5의 Entry 스키마와 동일)"],
362 "truncated": "Boolean (필수)",
363 "total_entries_count": "Number (선택)"
364 }
365 ```
366
367 마스터 서버는 대상 클라이언트의 `POST /v1/fs/browse`(§4.5)로 요청을 투명하게 프록시한다. 클라이언트가 반환한 4xx 에러는 그대로 패스스루한다.
368
369 **에러:**
370
371 | HTTP 상태 | error_code | 조건 |
372 | ----------- | ---------------- | ------------------------ |
373 | 400/403/404 | (§4.5 동일) | 클라이언트 에러 패스스루 |
374 | 404 | `NODE_NOT_FOUND` | 노드 미존재 |
375 | 404 | `NODE_OFFLINE` | 노드 오프라인 |
376 | 502 | `CLIENT_ERROR` | 클라이언트 5xx 에러 |
377 | 504 | `CLIENT_TIMEOUT` | 클라이언트 응답 타임아웃 |
378
305 379 ### 9.3. 엣지 세션(Edge Session) 라이프사이클 관리
306 380
307 381 엣지 노드는 마스터 서버를 통해 특정 로컬 머신에 새로운 세션을 생성하거나 기존 세션을 조회할 수 있다.
308 382
309 383 #### 9.3.1. 원격 세션 생성 (Edge → Master)
310 384
311 사용자가 특정 로컬 머신을 선택하여 대화를 시작할 때 호출한다.
385 사용자가 특정 로컬 머신을 선택하여 대화를 시작할 때 호출한다. `workspace_path` 선택을 위해 §9.2.6의 파일시스템 브라우징을 사전에 사용할 수 있다.
312 386
313 387 **Endpoint:** `POST /v1/edge/nodes/{node_id}/sessions`
314 388
315 389 **Request:**
316 390
317 391 ```json
318 392 {
319 "agent_name": "String (필수, 실행할 에이전트)",
393 "agent_id": "String (필수, 실행할 에이전트)",
320 394 "workspace_path": "String (선택, 작업 디렉토리)"
321 395 }
322 396 ```
323 397
324 398 **Response (201 Created):**
356 430 {
357 431 "sessions": [
358 432 {
359 433 "session_id": "String (필수, UUID v4)",
360 434 "node_id": "String (필수, 세션이 실행 중인 로컬 클라이언트 식별자)",
361 "agent_name": "String (필수, 실행 중인 에이전트 이름)",
435 "agent_id": "String (필수, 실행 중인 에이전트 식별자)",
362 436 "status": "String (필수, 'INIT' | 'RUNNING' | 'DETACHED')",
363 437 "created_at": "String (필수, ISO 8601, 세션 생성 시각)",
364 438 "last_activity_at": "String (필수, ISO 8601, 마지막 이벤트 수신 시각)",
365 439 "total_turns": "Number (필수, 해당 세션의 총 Turn 수)",
366 440 "pinned_config_versions": {
수정됨

10. 로컬 세션 관리 (Local Session Management)

추가된 줄 3 삭제된 줄 3
12 12
13 13 **Request**:
14 14
15 15 ```json
16 16 {
17 "agent_name": "String (필수, 실행할 에이전트 이름. §4.3의 에이전트 목록 참조)",
17 "agent_id": "String (필수, 실행할 에이전트 식별자. §4.3의 에이전트 목록 참조)",
18 18 "workspace_path": "String (필수, 작업 디렉토리 절대 경로)",
19 "session_name": "String (선택, 세션 표시명. 생략 시 agent_name + 생성 시각으로 자동 생성)"
19 "session_name": "String (선택, 세션 표시명. 생략 시 agent_id + 생성 시각으로 자동 생성)"
20 20 }
21 21 ```
22 22
23 23 **Response (201 Created)**:
24 24
86 86 ```json
87 87 {
88 88 "sessions": [
89 89 {
90 90 "session_id": "String (필수)",
91 "agent_name": "String (필수)",
91 "agent_id": "String (필수)",
92 92 "workspace_path": "String (필수)",
93 93 "session_name": "String (필수)",
94 94 "status": "String (필수, 'INIT' | 'RUNNING' | 'DETACHED')",
95 95 "origin": "String (필수, §10.3 참조)",
96 96 "created_at": "String (필수, ISO 8601)",