CHAPTER 12 · SESSION RUNTIME

Session Actor: 스레드, 상태 및 취소 경계

각 Session은 전용 OS 스레드에서 current-thread Tokio runtime 및 LocalSet을 실행합니다. SessionActor가 turn을 조율하고, ChatStateActor가 직렬로 대화 상태를 소유하며, CancellationToken이 협력적 종료를 담당합니다.

학습 목표
스레드 격리, Actor 상태 소유권, 취소 신호가 어떻게 협력하는지 설명하고, Agent의 '사실상 불변(effectively immutable)' 경계를 정확하게 기술할 수 있습니다.
핵심 시각 자료 · 교육용 런타임 다이어그램
Session OS thread · ses-<id> Tokio current-thread runtime + LocalSet SessionActorSessionCommandturn completion / events ChatStateActorconversationtokens / timing / persistence전용 상태, 공유 락 없음 SamplerActorrequest taskSamplingEvent CancellationToken / handle drop이 협력적 종료를 구동
Turn loop의 실제 역할

SessionActor 조율

  • run_session은 SessionCommand, ChatStateEvent, SessionEvent 및 turn completion을 동시에 수신합니다.
  • maybe_start_running_task가 대기 중인 turn을 시작합니다.
  • turn 완료 후 completion, turn end 및 후속 알림 처리를 수행합니다.

ChatStateActor 상태 소유

  • conversation, token, 설정 및 persistence를 단독으로 소유합니다.
  • mpsc::UnboundedReceiver를 통해 명령을 직렬 처리합니다.
  • 취소 token 수신 시 종료되며, 모든 handle이 삭제되어도 루프가 종료됩니다.
Agent의 실제 필드 경계
definition

AgentDefinition — 정체성, 모드 및 전략 입력을 정의합니다.

prompt_context

검사, 재렌더링 및 직렬화를 지원하는 PromptContext.

system_prompt

prompt context에서 렌더링되어 캐시된 문자열.

tool_bridge

Arc<ToolBridge> — 도구 등록 및 세션 컨텍스트 브릿지.

reminder_policy

Session 레벨 reminder 정책.

compaction_policy

자동 압축, memory flush 및 two-pass 설정.

hosted_tools

API로 전송되는 백엔드 호스팅 도구 정의.

backend_search_enabled

빌드 시 서버 측 검색 토글.

정확한 표현: 소스 코드 주석은 Agent가 생성 후 '사실상 불변(effectively immutable)'이라고 설명합니다. 그러나 finalize_prompt(&mut self)를 통해 빌드 타임스탬프를 업데이트하고 Prompt를 재렌더링할 수 있으므로 절대적으로 불변이라고는 할 수 없습니다.
실제 소스 코드 근거
crates/codegen/xai-grok-shell/src/session/acp_session_impl/spawn.rs
let join_handle = std::thread::Builder::new()
  .name(thread_name)
  .stack_size(8 * 1024 * 1024)
  .spawn(move || {
    let rt = tokio::runtime::Builder
      ::new_current_thread().enable_all().build()?;
    let local = tokio::task::LocalSet::new();
  });
crates/codegen/xai-grok-agent/src/agent.rs
/// Re-render the system prompt
pub async fn finalize_prompt(&mut self) {
  self.prompt_context.build_timestamp_utc =
    chrono::Utc::now().to_rfc3339();
  self.system_prompt = self.prompt_context
    .render(&self.tool_bridge).await
    .unwrap_or_default();
}
소스 스냅샷 안내: 이 페이지는 로컬 동기화 사본을 기반으로 검증되었습니다. 해당 사본에는 .git 메타데이터가 없으므로 특정 커밋 버전을 주장하지 않습니다.
수업 실습

각 상태에 유일한 소유자 지정하기

conversation, system_prompt, tool registry, sampling request를 각각 ChatStateActor, Agent, ToolBridge, SamplerActor에 배치하세요. 그런 다음 취소 token과 메시지 우선순위가 별개의 개념임을 설명하고, 이 소스 코드에는 '고우선순위 메시지를 큐 앞에 삽입'하는 범용 설계가 없음을 서술하세요.

Takeaway: Session의 격리 단위는 OS 스레드와 LocalSet입니다. SessionActor는 turn 조율을 담당하고, ChatStateActor는 대화 상태를 소유하며, CancellationToken은 취소를 처리합니다. Agent는 기본적으로 사실상 불변(effectively immutable)이지만, 명시적인 재렌더링 진입점을 보유합니다.