# Agent 生命周期

## 启动流程

```
1. Agent作为Sidecar随业务Pod启动
2. 收集主机信息(MachineID, CPU, Memory, Serial, IP)
3. 收集环境信息(K8S_NAMESPACE, APPLICATION_NAME)
4. 首次心跳请求(TOTPCode="")
5. 获取并保存tier_two_secret
6. 进入心跳循环
```

## 心跳状态机

```
初始化 -> 首次心跳 -> 获取密钥 -> 心跳循环
                                    ↓
                              成功: failCount=1, 等待2h
                              失败: failCount++, 等待1h
                                    ↓
                              failCount >= 12
                                    ↓
                              触发死手系统 -> 终止业务
```

## 心跳循环详情

### 成功路径
1. 生成Tier-Two TOTP (6位/30秒)
2. 发送心跳请求
3. Watchdog验证TOTP
4. Watchdog检查授权状态
5. 返回 {Authorized: true, TOTPCode: xxx}
6. Agent验证响应TOTP
7. failCount = 1
8. 等待2小时

### 失败路径
1. 发送心跳请求
2. 返回错误或 {Authorized: false}
3. failCount++
4. 检查 failCount >= 12
5. 未达阈值: 等待1小时，继续循环
6. 达到阈值: 触发死手系统

## 死手系统触发

```go
func (a *Agent) killBusiness() {
    log.Warn("deadman switch triggered after %d failures", failCount)

    // 发送SIGTERM，允许优雅退出
    if err := a.businessProcess.Signal(syscall.SIGTERM); err != nil {
        log.Error("failed to send SIGTERM: %v", err)
        // 最后手段：SIGKILL
        a.businessProcess.Signal(syscall.SIGKILL)
    }
}
```

## 与Watchdog交互

### 请求结构
```go
type HeartbeatRequest struct {
    HostInfo  HostInfo `json:"host_info"`
    EnvInfo   EnvInfo  `json:"env_info"`
    Timestamp int64    `json:"timestamp"`
    TOTPCode  string   `json:"totp_code"` // 首次为空
}
```

### 响应结构
```go
type HeartbeatResponse struct {
    Authorized       bool   `json:"authorized"`
    TOTPCode         string `json:"totp_code"`           // 双向验证
    Timestamp        int64  `json:"timestamp"`
    SecondTOTPSecret string `json:"second_totp_secret"`  // 首次返回
}
```

## 异常处理

| 场景 | 处理方式 |
|------|----------|
| 网络超时 | 计入失败，继续循环 |
| Watchdog不可达 | 计入失败，继续循环 |
| TOTP验证失败 | 计入失败，继续循环 |
| 响应TOTP无效 | 计入失败，可能中间人攻击 |
| 授权状态false | 计入失败，等待授权恢复 |
