# Team A: Memory Hook 클래스

## 분석 대상

`memory_hook_provider.py` — MemoryHook 클래스 (HookProvider 패턴)

## HookProvider 패턴

Strands Framework의 Hook 시스템은 에이전트 라이프사이클 이벤트에 콜백을 등록하는 패턴입니다.

```python
from strands.hooks.events import AgentInitializedEvent, MessageAddedEvent
from strands.hooks.registry import HookProvider, HookRegistry

class MemoryHook(HookProvider):
    """AgentCore Memory와 에이전트를 연결하는 Hook"""

    def __init__(self, memory_client, memory_id, actor_id, session_id):
        self.memory_client = memory_client  # AgentCore Memory 클라이언트
        self.memory_id = memory_id          # Memory 리소스 ID
        self.actor_id = actor_id            # 사용자 식별자
        self.session_id = session_id        # 세션 식별자

    def register_hooks(self, registry: HookRegistry):
        """두 가지 이벤트 콜백 등록"""
        registry.add_callback(AgentInitializedEvent, self.on_agent_initialized)
        registry.add_callback(MessageAddedEvent, self.on_message_added)
```

### 이벤트 타이밍

```
Agent 생성
    ↓
register_hooks() 호출  ←── 콜백 등록
    ↓
AgentInitializedEvent 발생  ←── on_agent_initialized() 호출
    ↓
사용자 메시지 수신
    ↓
MessageAddedEvent (user) 발생  ←── on_message_added() 호출
    ↓
LLM 추론 + 도구 호출
    ↓
MessageAddedEvent (assistant) 발생  ←── on_message_added() 호출
    ↓
다음 턴 반복...
```

## on\_agent\_initialized 상세

```python
def on_agent_initialized(self, event: AgentInitializedEvent):
    """에이전트 시작 시 이전 대화 컨텍스트 로드"""
    # 1. 현재 세션의 최근 턴 조회
    recent_turns = self.memory_client.get_last_k_turns(
        memory_id=self.memory_id,
        actor_id=self.actor_id,
        session_id=self.session_id,
        k=10,
    )

    # 2. 현재 세션에 없으면 이전 세션 패턴으로 검색
    if not recent_turns:
        for session_pattern in ["troubleshooting_session", "main_session"]:
            recent_turns = self.memory_client.get_last_k_turns(...)

    # 3. 이전 컨텍스트를 시스템 프롬프트에 추가
    if recent_turns:
        all_sessions_context = "=== PREVIOUS SESSION CONTEXT ==="
        for turn in recent_turns[-5:]:
            for message in turn:
                role = "User" if message["role"] == "USER" else "Assistant"
                content = message["content"]["text"][:200]
                all_sessions_context += f"{role}: {content}"

    event.agent.system_prompt += all_sessions_context
```

**핵심 포인트:**

* `get_last_k_turns(k=10)` — 최근 10턴을 로드하지만 실제 사용은 마지막 5턴
* 세션 패턴 검색으로 크로스-세션 컨텍스트 복원
* `event.agent.system_prompt`에 직접 추가하여 LLM이 이전 대화를 "기억"

## Agent와의 통합 포인트

```python
# agent.py에서 Memory Hook 주입
class TroubleshootingAgent:
    def __init__(self, bearer_token, memory_hook=None):
        if self.memory_hook:
            self.agent = Agent(
                model=self.model,
                system_prompt=self.system_prompt,
                tools=self.tools,
                hooks=[self.memory_hook],  # ← Hook 주입 지점
            )
```

## 토론 질문

1. `register_hooks`가 호출되는 시점은 Agent 생성자 내부인가요?
2. `event.agent.system_prompt`를 수정하면 모든 후속 턴에 영향을 미치나요?
3. `get_last_k_turns`의 k=10과 실제 사용 k=5의 차이가 있는 이유는?
